もしESP8266でAWS MQTT Websocketを動かしていて、ゆっくりメッセージを送信すると問題ないのに、メッセージを連打するとWebSocketが切断される現象が発生してお困りなら、これが原因かもしれません。
解決に時間を要したので共有します。
問題が発生するサンプルスケッチ
メッセージを受信したら何か処理して応答する様なケースで問題が発生しました。
sample.ino
void messageArrived(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
// 何らかのメッセージの処理
// 何らかのメッセージの処理
// 何らかのメッセージの処理
// 応答
responseMessage("OK");
}
void responseMessage(const char* result)
{
MQTT::Message message;
char buf[100];
sprintf(buf, "{\"result\": \"%s\"}", result);
message.qos = MQTT::QOS1;
message.retained = false;
message.dup = false;
message.payload = (void*)buf;
message.payloadlen = strlen(buf);
int rc = client->publish(aws_topic, message);
}
原因と解決方法
同じ内容のメッセージを連続して応答すると問題が起こる様です。
タイムスタンプや、カウンタを入れると直りました。
sample.ino
int arrivedCount = 0;
void messageArrived(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
// 何らかのメッセージの処理
// 何らかのメッセージの処理
// 何らかのメッセージの処理
// メッセージのカウンタ
arrivedCount ++;
// 応答
responseMessage("OK");
}
void responseMessage(const char* result)
{
MQTT::Message message;
// 応答にカウンタ値を入れてメッセージを変化させる
char buf[100];
sprintf(buf, "{\"result\": \"%s\", \"count\": \"%d\"}", result, arrivedCount);
message.qos = MQTT::QOS1;
message.retained = false;
message.dup = false;
message.payload = (void*)buf;
message.payloadlen = strlen(buf);
int rc = client->publish(aws_topic, message);
}