LoginSignup
3
3

More than 5 years have passed since last update.

ESP8266でAWS MQTT Websocketを動かしてメッセージを連打するとWebSocketが切断される現象への対策

Last updated at Posted at 2017-04-24

もし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); 
}

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3