IBM IoT Foundation
IBM Bluemixでは、IoTデバイス接続のための「Internet of Things Foundation」が利用できる。これとBluemix上で動くNode-REDを組み合わせればIoTのプロトタイプがお手軽にできそう、ということでいくつかプロトタイプしてみた。
プロトタイプのコードはfnishio/mqtt-sampleを参照。
Pythonからpublish/subscribe
まず、pythonで動くMQTTライブラリpaho-mqttを使ってIoT Foundationに対してpublish/subscribeしてみる。
プロトタイプの内容は、以下のサンプルをpythonに焼き直したもの。
http://www.ibm.com/developerworks/jp/cloud/library/cl-mqtt-bluemix-iot-node-red-app/
- 機器側
- 定期的にインクリメントされるカウンター値をpublishする
- カウンター値リセットのコマンドをsubscribeする
- サービス側
- Deviceからのカウンター値をモニター(subscribe)
- カウンター値が5になったらリセットするようDeviceにコマンドをPublishする
機器側
接続機器の登録
IoT Foundationのdashboardを開いて接続する機器を登録する。
登録後に表示される認証用のAuthentication TokenはMQTT Broker接続時の認証パスワードとして使う。
MQTT Brokerにつなぐ
client_id = "d:{org_id}:{type_id}:{device_id}"
endpoint = "{org_id}.messaging.internetofthings.ibmcloud.com"
client = mqtt.Client(client_id)
client.username_pw_set("use-token-auth", PASSWORD)
client.on_connect = on_connect
client.on_message = on_message
client.connect(endpoint, 1883)
org_id, type_id, device_id, PASSWORD
はIoT Foundationへの登録情報を元に適切に設定する。
Event Publish
1.5秒ごとにcount
をインクリメントしながら、トピックiot-2/evt/eid/fmt/json
にカウンタ値をpublishする。
count = 0
while client.loop() == 0:
msg = json.dumps({ "d" : { "count" : count } });
client.publish("iot-2/evt/eid/fmt/json", msg, 0, True)
print("sent: " + msg)
time.sleep(1.5)
count = count + 1
Command subscribe
- Brokerに接続したら
iot-2/cmd/cid/fmt/json
トピックをsubscirbe -
reset
コマンドが来たらcount
をコマンドに含まれている値に再設定!
def on_connect(client, userdata, flags, rc):
client.subscribe("iot-2/cmd/cid/fmt/json")
def on_message(client, userdata, msg):
global count
payload = json.loads(msg.payload.decode())
if payload['cmd'] == "reset":
count = payload['count']
サービス側
サービス側のアプリはNode-REDで以下のフローを実装する。
Event Subscribe
MQTT Device
から送信されるトピックiot-2/evt/eid/fmt/json
のイベントを処理する。
Monitor
イベントをモニターして、カウンター値が4を超えたら次のフローへ進む
Command Payload
Command Publish
deviceIdの機器に対して、トピックiot-2/cmd/cid/fmt/json
にコマンドをpublishする。
実行
{"count": 5}
のデータを送信した後、
カウンターをリセットするコマンド{"cmd":"reset", "count": 0}
を受信している。
$ python3 device.py
sent: {"d": {"count": 0}}
sent: {"d": {"count": 1}}
sent: {"d": {"count": 2}}
sent: {"d": {"count": 3}}
sent: {"d": {"count": 4}}
sent: {"d": {"count": 5}}
iot-2/cmd/cid/fmt/json b'{"cmd":"reset", "count": 0}'
sent: {"d": {"count": 0}}
sent: {"d": {"count": 1}}