【作業】3-1: SORACOM Beam を用いた MQTT Pub/Sub 双方向通信

本格的な IoT システムの構築として、データ収集だけでなく、クラウド側からのデータをデバイス側で受信し処理する仕組みを学びます。

MQTT ブローカー (サーバ) には Amazon MQ を利用します。 ※ Amazon MQ は運営側で準備済みです。

全体構成 / MQTT PubSub with Mosquitto / overview

最初に. Wio LTE の電源を OFF にする

Wio LTE の microUSB ケーブルを抜き、電源を OFF にしてください

※いきなり抜いてOKです。また、すでに OFF になっている場合は次に進んでください

1. SORACOM Beam 設定

1-1. SORACOM ユーザーコンソールで 左上 [Menu] > [SIM 管理] をクリック

※ 画面が切り替わらない場合は、左上の SORACOM ロゴをクリックしてください。

2020ui/go-subscribers

1-2. Wio LTE に取り付けている SIM(sim-name1 を参照) を選択 > [操作] > [所属グループ変更] をクリック

2020ui/go-change-group

1-3. [新しい所属グループ] > [新しいグループを作成…] をクリック

2020ui/new-group-on-change-group-dialog

1-4. グループ名を入力して [グループ作成] をクリック

2020ui/set-new-group-name/sim-group-name2

1-5. 変更後のグループが先ほど作成した sim-group-name1 になっていることを確認して [グループ変更] をクリック

2020ui/do-change-group/sim-group-name2

ここまでの作業の結果、SIM に SIM グループが設定されます。

2020ui/check-sim-group/sim-group-name2

1-6. SIM 管理画面で、先ほど作成した “SIM グループ名” をクリック

2020ui/go-sim-group-config/sim-group-name2

1-7. SIM グループ設定画面で [SORACOM Beam 設定] をクリック

2020ui/open-soracom-beam-config

1-3. SORACOM Beam の[+]をクリックし、一覧の中から MQTT エントリポイント をクリック

beam-menu

1-4. SORACOM Beam の設定では、下記の通り入力し、保存してください

step5 MQTT PubSub with Mosquitto / beam-setting

以上で SORACOM ユーザーコンソール上での作業は終了です。

3. PubSubClient ライブラリのインストール

MQTT 通信を行うにあたり PubSubClient というライブラリを利用します。

※ 公式の PubSubClient では、パケットサイズが小さいため若干不都合が発生することが確認されています。そのため、ハンズオン側で準備した fork ライブラリを使用してください

2-1. 追加のライブラリをダウンロードする

SeeedJP/pubsubclient のページから 2.6 の ZIP をダウンロードします

2-2. Arduino IDE を起動する

2-3. Arduino IDE の [スケッチ] > [ライブラリをインクルード] > [.ZIP 形式のライブラリをインストール…]

wio-lte-handson / zip-lib

先ほどダウンロードした pubsubclient-2.6.zip を探して「開く」をクリックすればインストール完了です

3. スケッチを作成する

3-1. Arduino IDE を起動する

3-2. メニューの [ツール] で [ボード: “Seeed Wio LTE Cat.1”] と表示されていることを確認する

なっていなければ一覧から “Seeed Wio LTE Cat.1” を選んでください

3-3. Arduino IDE の [ファイル] > [スケッチ例] > [Wio LTE for Arduino] > [mqtt] > [mqtt-client]

3-4. スケッチを下記の通りに変更します (変更例は後述)

スケッチの変更例

変更前 (10行目 ~ 17行目までを一括で表示)

#define MQTT_SERVER_HOST  "hostname"
#define MQTT_SERVER_PORT  (1883)

#define ID                "WioLTE"
#define OUT_TOPIC         "outTopic"
#define IN_TOPIC          "inTopic"

#define INTERVAL          (60000)

変更後の例
(この値をそのまま使わずに IDOUT_TOPICIN_TOPIC の値は進捗表から入手してください)

#define MQTT_SERVER_HOST  "beam.soracom.io"
#define MQTT_SERVER_PORT  (1883)

#define ID                "sr-h0813-02"
#define OUT_TOPIC         "sroot/h0813/02/cloud"
#define IN_TOPIC          "sroot/h0813/02/device"

#define INTERVAL          (5000)

3-5. Wio LTE を PC を接続して DFUモード にする

3-6. 新しく開いたウィンドウの マイコンボードに書き込むアイコン(マイコンボードに書き込む) をクリック

3-7. 書き込みが完了したら、Wio LTE を 通常モードにする (RSTボタンを押せば通常モードになります)

通常モードで起動次第 SORACOM Beam へデータを送信し始めます (電源投入から送信開始までは15~20秒程度かかります)

4. 確認

4-1. MQTT over WebSocket monitor を新しいタブで開きます

下記の値を入力して [Connect] をクリックしてください

※その他は変更する必要はありません

step5 MQTT PubSub with Mosquitto / wss-client

4-2. Subscribe と Publish の設定

Subscribe (Wio LTE → クラウド)

その後、 Arduino IDE > [ツール] > [シリアルモニタ] で表示されるウィンドウには Wio LTE の稼働状況が表示されます。
ブラウザ上の “Monitoring” に Wio LTE から Publish されたデータが表示され始めます。

step5 MQTT PubSub with Mosquitto / mqtt-sub

Publish (クラウド → Wio LTE)

Content で入力した文字がシリアルモニタ(= Wio LTE に送信された)に表示されていることが確認できます。

step5 MQTT PubSub with Mosquitto / mqtt-pub

5. やってみよう

Wio LTE が MQTT Subscribe メッセージを受信すると、23 行目の void callback() という関数が実行されます。 ここを修正することで、クラウドからのコマンドを処理することができるようになります。

今回は「 #xxxxxx という文字列を Wio LTE が受信したら、 LED の発光色として使う」としてみましょう

変更前 (23 行目付近);

void callback(char* topic, byte* payload, unsigned int length) {
  SerialUSB.print("Subscribe:");
  for (int i = 0; i < length; i++) SerialUSB.print((char)payload[i]);
  SerialUSB.println("");
}

変更後 (23 行目付近);

void callback(char* topic, byte* payload, unsigned int length) {
  char c[length];
  for (int i = 0; i < length; i++) c[i] =  (char) payload[i];
  SerialUSB.print("Subscribe:");
  SerialUSB.println(c);
  unsigned long r = 0;
  unsigned long g = 0;
  unsigned long b = 0;
  if ('#' == c[0] && length == 7) {
    char rx[2] = {c[1], c[2]};
    r = strtoul(rx, NULL, 16);
    char gx[2] = {c[3], c[4]};
    g = strtoul(gx, NULL, 16);
    char bx[2] = {c[5], c[6]};
    b = strtoul(bx, NULL, 16);
  }
  Wio.LedSetRGB(r, g, b);
}

試験用カラーコード

Wio LTE 上の LED の色を制御できること確認してみてください。

6. Wio LTE の動作を止める

止める方法は Wio LTE の電源を OFF (= microUSBケーブルを抜く) してください

以上で本章は終了です

達成状況を進捗表へご記入ください。

Amazon MQ 構築方法

Amazon MQ の構築方法は Qiita: Amazon MQにmosquitto(MQTT)とMQTT over Websocketで接続してみる をご覧ください。

うまく動かなかったら(トラブルシュート)

「マイコンボードに書き込む」を実行した結果、ウィンドウに下記のように表示された

 #include <PubSubClient.h>  // https://github.com/SeeedJP/pubsubclient
                                                                        ^
compilation terminated.

exit status 1
ボードSeeed Wio LTE Cat.1に対するコンパイル時にエラーが発生しました。

「マイコンボードに書き込む」を実行した結果、ウィンドウに下記のように表示された

      yield();

            ^

exit status 1
ボードSeeed Wio LTE Cat.1に対するコンパイル時にエラーが発生しました。

(シリアルモニターで) ### Connecting to "soracom.io". で止まってしまう

--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "soracom.io".

(シリアルモニターで) ### ERROR! ### と表示されてしまう

--- START ---------------------------------------------------
### I/O Initialize.
### Power supply ON.
### Turn on or reset.
### Connecting to "soracom.io".
### Connecting to MQTT server "beam.soracom.io"
### ERROR! ###
Publish:{"uptime":23}
  1. SORACOM Beam の設定で MQTTS にするところを MQTT のままにしている → Beam の設定を見直してみてください
  2. 認証情報に埋めるべき文字列が間違っている → 認証情報を新たに作り、Beam の設定で新しい方を指定してみてください
  3. SORACOM Beam が有効になっている SIM グループに SIM を所属させることを忘れている → SIM の設定から SIM グループに所属しているか確認してみてください

最初の数回だけ WebSocket Client 側で受信ができて、その後の受信が確認できない / WebSocket Client 側からの Publish が Wio LTE に届かない

送信しているように見えるが WebSocket Client に全く送信されない