LoginSignup
17
22

More than 5 years have passed since last update.

IBM Bluemix で IoT (1) - Pythonからpublish/subscribe

Posted at

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接続時の認証パスワードとして使う。
device_reg.png

MQTT Brokerにつなぐ

device.py
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する。

device.py
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をコマンドに含まれている値に再設定!
device.py
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で以下のフローを実装する。
monitor_app_flow.png

Event Subscribe

MQTT Deviceから送信されるトピックiot-2/evt/eid/fmt/jsonのイベントを処理する。
monitor_app_in.png

Monitor

イベントをモニターして、カウンター値が4を超えたら次のフローへ進む
monitor_app_switch.png

Command Payload

resetコマンドを組み立てる
monitor_app_reset.png

Command Publish

deviceIdの機器に対して、トピックiot-2/cmd/cid/fmt/jsonにコマンドをpublishする。
monitor_app_out.png

実行

{"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}}
17
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
22