前回でpythonからのpublish/subscribeができたので、Raspberry PiでIoT版Lチカをやってみる。プロトタイプのコードは github fnishio/mqtt-sampleを参照。
IoT版Lチカ
Android Phoneでボタンを押すと、IoT FoundationにつながっているRaspberry PiのLEDが点灯/消灯する。
- RasbperriPi側
- MQTT で toggle コマンドを受け取るたびに、LEDのoff/onを切り替
- コントローラ側
- Do Buttonを使ってWeb APIにアクセスする。
- サービス側
- Web APIを叩かれるたびに、APIで指定されたIDの機器に対してtoggleコマンドをpublishする。
Raspberry Pi側
接続機器の登録
IoT Foundationのdashboardを開いて接続する機器を登録する。
登録後に表示される認証用のAuthentication TokenはMQTT Broker接続時の認証パスワードとして使う。
MQTT Brokerにつなぐ
device2.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への登録情報を元に適切に設定する。
Command Subscribe
- Brokerに接続したら
iot-2/cmd/led/fmt/json
をsubscribe -
toggle
コマンドが来たらGPIO PINの状態を変える
device2.py
def on_connect(client, userdata, flags, rc):
client.subscribe("iot-2/cmd/led/fmt/json")
def on_message(client, userdata, msg):
payload = json.loads(msg.payload.decode())
if payload['cmd'] == "toggle":
# control GPIO
global on_off
on_off = ~on_off
GPIO.output(LED_PIN, on_off)
サービス側
Web API
POSTで操作対象となる機器のdeviceIdを受け取る Web API。
Method | URL |
---|---|
POST | led/v1/toggle |
Type | Params | Valuse | Description |
---|---|---|---|
json | deviceId | string | 操作対象のdevice ID |
Command payload
toggle操作を行うcommand payloadを組み立てる。
Command publish
deviceId
の機器に対して、トピックiot-2/cmd/led/fmt/json
にコマンドをpublishする。
Controller側
Do Buttonで/led/v1/toggle
のWebAPIに、制御対象となる機器のdeviceIdをPOSTする。