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のシリアルモニタで以下のような出力が確認できます。
サブスクライブする
以下のようにNode.jsのmqttパッケージをインストールします。 mqttコマンドを使用したいので、-gオプションを付けています。
node install -g mqtt
インストール後、スケッチを変更したときの情報に合わせてオプションを指定して、以下のようにコマンドを実行します。
mqtt sub -t 'アクセス先トピック' -h '接続先のホスト名' -u 'ユーザー名' -P 'パスワード'
サブスクライブに成功した場合、以下のような出力が行われます。