ESP8266でSangoにパブリッシュしてみる

ArduinoなESP8266で、MQTTブローカーサービスのsangoにパブリッシュしてみました。 ESP8266のモジュールは、Cerevoさんで購入可能なESP-WROOM-02を使用しました。

参考情報

以下の事柄については記述しないので、参考になったWebページなどを記載します。

ESP8266について

MQTTについて

sangoについて

ESP8266にArduinoのスケッチを書き込む方法

Arduinoのライブラリを追加する

以下のライブラリをArduino IDEに追加してください。

フォーク元のknollearyさんのリポジトリでもESP8266の動作は確認できましたが、2年ほどメンテナンスが行われていないようです。また、ESP8266固有の問題などは考慮されていないことなどから、Imroyさんのリポジトリのコードを使用しました。

ESP8266でパブリッシュする

後述のスケッチを変更してから書き込みます。

以下の変数は、使用するWi-Fiのアクセスポイントに合わせて変更します。

  • wifi_ssid: Wi-FiアクセスポイントのSSID
  • wifi_pass: Wi-Fiアクセスポイントのパスワード

以下の変数は、sangoのダッシュボードの情報に合わせて変更します。

  • mqtt_host: 接続先のホスト名(例: std1.mqtt.shiguredo.jp)
  • mqtt_user: ユーザー名(例: example@github)
  • mqtt_pass: パスワード
  • mqtt_topic: アクセス先トピック

mqtt_clientについては、試すだけであれば変更する必要はなかったのですが、

MQTTの仕様で、同じClientIDで接続しようとすると、後の接続が生き、前の接続が切断されます。

ということなので、複数のモジュールを使用する場合などは、何かしらルールを決める必要があります。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// アクセスポイント接続情報
const char *wifi_ssid = "...";  // SSID
const char *wifi_pass = "...";  // パスワード

// MQTT接続情報
const char *mqtt_host = "...";  // 接続先のホスト名
const char *mqtt_user = "...";  // ユーザー名
const char *mqtt_pass = "...";  // パスワード
const char *mqtt_topic = "..."; // アクセス先トピック

// ClientID
const char *mqtt_client = "arduinoClient";

int count = 0;

WiFiClient wclient;
PubSubClient client(wclient, mqtt_host);

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(wifi_ssid);
    Serial.println("...");
    WiFi.begin(wifi_ssid, wifi_pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
      return;
    }
    Serial.println("WiFi connected");
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect(mqtt_client).set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");
      }
    }

    Serial.print("Publishing: ");
    String message = String("count ") + count;
    Serial.println(message);
    client.publish(mqtt_topic, message);
    count++;

    if (client.connected()) {
      client.loop();
    }
  }
  delay(3000);
}

パブリッシュが成功した場合、Arduino IDEのシリアルモニタで以下のような出力が確認できます。

f:id:jakalada:20150816055600p:plain

サブスクライブする

以下のようにNode.jsのmqttパッケージをインストールします。 mqttコマンドを使用したいので、-gオプションを付けています。

node install -g mqtt

インストール後、スケッチを変更したときの情報に合わせてオプションを指定して、以下のようにコマンドを実行します。

mqtt sub -t 'アクセス先トピック' -h '接続先のホスト名' -u 'ユーザー名' -P 'パスワード'

サブスクライブに成功した場合、以下のような出力が行われます。

f:id:jakalada:20150816061448p:plain