2016年8月24日水曜日

MQTT理解(publisher/subscriber: ruby利用、broker: Bluemixサービス)


◆ 目的
IoTやM2Mで使われるpublisherとsubscriberモデルの軽量なメッセージプロトコルであるMQTTの動作をrubyクライアントを使い確認する。rubyのmqttライブラリはこちらを使う。

brokerとなるサーバは構築の手間を省くため、IBM Bluemix上にあるサービス、Internet of Things Platform を利用する。



◆ publisher接続仕様
IBMが提供するIoTのbrokerの作法の詳細はこちら
以下ではコードを書く上で必要なところを抽出してまとめる。

(フォーマット)
● 認証(ユーザ)     : use-token-auth(固定値)
     (パスワード)   : デバイス登録時に払い出されるトークン

● Client ID      : d:{org_id}:{device_type}:{device_id}

● Topic(event)   : iot-2/evt/{event_id}/fmt/{format}
       (command) : iot-2/cmd/{command_id}/fmt/{format}
                   今回はeventトピック(commandではない)のフォーマットを利用する

{}の各変数はそれぞれ以下の意味である。
org_id           : brokerが払い出し(接続先エンドポイントのURIに付与される)
device_type      : 任意のものを作成
                   ここではラズベリーパイを使うことを想定しraspiとする
device_id        : デバイス単位で固有の値を任意に作成

event_id         : 任意のものを作成(ここではtype01とする)
command_id       : 任意のものを作成
format           : jsonとする

下記変数部分は文字列ワイルドカード文字(+)を使用することができる。
device_type、device_id、event_id、format



◆ subscriber接続仕様
(フォーマット)
● 認証(ユーザ)      : APIキー(broker管理画面で作成)
     (パスワード)    : APIトークン(broker管理画面で作成)

● Client ID       : a:{org_id}:{app_id}

● Topic(event)    : iot-2/type/{device_type}/id/{device_id}/evt/{event_id}/fmt/{format}
     (command)    : iot-2/type/{device_type}/id/{device_id}/cmd/{command_id}/fmt/{format}

{}の各変数はそれぞれ以下の意味である。
app_id            : 任意のものを作成(ここではapp01とする)

下記変数部分は文字列ワイルドカード文字(+)を使用することができる。
device_type、device_id、cmd_id、format



◆ publisherコード



◆ subscriberコード



◆ 試験
1.
$ ./subscriber.rb
待ち

2.
$ ./publisher.rb

3.
subscriber.rbのプロンプトへ以下が出力される。
"iot-2/type/android/id/12345/evt/type01/fmt/json"
"{\"d\":{\"test_data\":10}}"