Meshblu登録したデバイスを使いMQTTとHTTP間で相互にメッセージの送受信を試してみます。複数のプロトコルの違いをMeshbluのブローカーが吸収してくれるのでより多くのサービスやデバイスがメッセージを交換できるようになります。
環境変数
デバイスの登録と利用に使う環境変数です。~/.bashrc
などに書いておきます。
~/.bashrcexport MESHBLU_BROKER=xxx.xxx.xxx.xxx export MESHBLU_URL=https://$MESHBLU_BROKER export HTTP_SUB_UUID=http-sub export HTTP_SUB_TOKEN=505478 export MQTT_PUB_UUID=mqtt-pub export MQTT_PUB_TOKEN=889346
|
デバイスのメッセージ送受信権限
デバイスのownerとwhitelistの権限は前回設定した状態からはじめます。説明上http-sub
、mqtt-pub
というUUIDを付けていますが、どちらも自分がデバイスのオーナーなので自分自身に対してはメッセージの送受信が可能です。
http-subデバイス
http-sub
デバイスは以下のような設定にしています。OSX上でメッセージを受信するときに使う想定です。
"protocol":"http"
-> HTTPでメッセージを受信できる
"sendWhitelist":"[mqtt-pub]"
-> mqtt-pub
デバイスからメッセージを受信できる
- “owner”:”http-sub” -> 自分がオーナーなので
http-sub
デバイスにメッセージを送受信できる
$ curl -X GET \ "$MESHBLU_URL/devices/$HTTP_SUB_UUID" \ --insecure \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN" {"devices":[{"discoverWhitelist":"[mqtt-pub]","geo":null,"ipAddress":"172.17.42.1","name":"http-sub","online":false,"owner":"http-sub","protocol":"http","sendWhitelist":"[mqtt-pub]","timestamp":"2015-03-28T20:02:54.875Z","uuid":"http-sub"}]}
|
mqtt-subデバイス
mqtt-pub
デバイスは以下のような設定にしています。Raspberry Pi上でメッセージを受信するときに使う想定です。
"protocol":"mqtt"
-> MQTTでメッセージを受信できる
- “owner”:”mqtt-pub” -> 自分がオーナーなので
mqtt-pub
デバイスにメッセージを送受信できる
$ curl -X GET \ "$MESHBLU_URL/devices/$MQTT_PUB_UUID" \ --insecure \ --header "meshblu_auth_uuid: $MQTT_PUB_UUID" \ --header "meshblu_auth_token: $MQTT_PUB_TOKEN" {"devices":[{"discoverWhitelist":["mqtt-pub"],"geo":null,"ipAddress":"172.17.42.1","name":"mqtt-pub","online":true,"onlineSince":"2015-03-28T01:37:48.875Z","owner":"mqtt-pub","protocol":"mqtt","timestamp":"2015-03-28T20:22:25.885Z","uuid":"mqtt-pub"}]}
|
デバイスのUUID/TOKENを使うマシン
用意した2つのデバイスのUUID/TOKENはそれぞれ以下のマシンからメッセージを送受信するときに使います。
mqtt-pub
デバイスのUUID/TOKEN: Raspberry Pi
http-sub
デバイスのUUID/TOKEN: OSX
デバイス情報にはgeo
やipAddress
のキーがありますが、今のところ物理的なマシンに結びついてはいないのでUUID/TOKENはどのマシンからも利用することができるようです。
MQTT(mqtt-pub) > HTTP(http-sub)
UUIDをauthに使います。mosquitto_sub
やmosquitto_pub
コマンドからメッセージ送信または受信すると、デバイス情報のprotocolがmqttに更新されます。
mosquitto_subコマンドを実行してみます。
$ mosquitto_sub \ -h $MESHBLU_BROKER \ -p 1883 \ -t $HTTP_SUB_UUID \ -u $HTTP_SUB_UUID \ -P $HTTP_SUB_TOKEN \ -d Client mosqsub/1830-minion1.cs sending CONNECT Client mosqsub/1830-minion1.cs received CONNACK Client mosqsub/1830-minion1.cs sending SUBSCRIBE (Mid: 1, Topic: http-sub, QoS: 0) Client mosqsub/1830-minion1.cs received SUBACK Subscribed (mid: 1): 0
|
デバイス情報を確認するとprotocolがmqttになってしまいました。
$ curl -X GET \ "$MESHBLU_URL/devices/$HTTP_SUB_UUID" \ --insecure \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN" {"devices":[{"discoverWhitelist":"[mqtt-pub]","geo":null,"ipAddress":"172.17.42.1","name":"http-sub","online":false,"owner":"http-sub","protocol":"mqtt","sendWhitelist":"[mqtt-pub]","timestamp":"2015-03-28T20:02:54.875Z","uuid":"http-sub"}]}
|
HTTPでメッセージを受信する場合はprotocolをhttpに変更する必要があります。デフォルトだとprotocolはデバイス情報のJSONに含まれていません。UUIDで一度もMQTTを使わなければprotocolの更新は不要ですが念のため行います。
$ curl -X PUT \ "$MESHBLU_URL/devices/$HTTP_SUB_UUID" \ --insecure \ -d "token=$HTTP_SUB_TOKEN&protocol=http" \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN" {"discoverWhitelist":"[mqtt-pub]","geo":null,"ipAddress":"172.17.42.1","name":"http-sub","online":false,"owner":"http-sub","protocol":"http","sendWhitelist":"[mqtt-pub]","timestamp":"2015-03-28T01:26:31.531Z","uuid":"http-sub","fromUuid":"http-sub","from":{"_id":"5519eebc6c04bc0a002d59ae","discoverWhitelist":"[mqtt-pub]","geo":null,"ipAddress":"172.17.42.1","name":"http-sub","online":false,"owner":"http-sub","sendWhitelist":"[mqtt-pub]","timestamp":"2015-03-28T00:58:16.467Z","uuid":"http-sub"}}
|
OSX上でhttp-sub
デバイスをauth情報にしてcurlからメッセージをsubscribeします。publishされる前にsubscribeしている必要があります。
$ curl -X GET \ "$MESHBLU_URL/subscribe" \ --insecure \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN"
|
Raspberry Pi上でmqtt-pub
デバイスをauth情報にしてMosquitto Clientsからメッセージをpublishします。
$ mosquitto_pub \ -h $MESHBLU_BROKER \ -p 1883 \ -t message \ -m '{"devices": ["'"$HTTP_SUB_UUID"'"], "payload": {"red":"on"}}' \ -u $MQTT_PUB_UUID \ -P $MQTT_PUB_TOKEN \ -d Client mosqpub/30699-raspberry sending CONNECT Client mosqpub/30699-raspberry received CONNACK Client mosqpub/30699-raspberry sending PUBLISH (d0, q0, r0, m1, 'message', ... (50 bytes)) Client mosqpub/30699-raspberry sending DISCONNECT
|
OSX上でsubscribeしているシェルにメッセージが届きました。
{"devices":["http-sub"],"payload":{"red":"on"},"fromUuid":"mqtt-pub"},
|
HTTP(http-sub) > HTTP(http-sub)
OSX上でhttp-sub
デバイスをauthに情報にしてcurlからメッセージをsubscribeします。
$ curl -X GET \ "$MESHBLU_URL/subscribe" \ --insecure \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN"
|
http-sub
デバイスからhttp-sub
デバイスへは自分がオーナーなのでメッセージを送信できます。
$ curl -X POST \ "$MESHBLU_URL/messages" \ --insecure \ -d '{"devices": ["'"$HTTP_SUB_UUID"'"], "payload": {"red":"on"}}' \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN" {"devices":["http-sub"],"payload":{"red":"on"}}
|
OSX上でsubscribeしているシェルにメッセージが届きました。
{"devices":["http-sub"],"payload":{"red":"on"},"fromUuid":"http-sub"},
|
MQTT(mqtt-pub) > MQTT(mqtt-pub)
Raspberry Pi上でmqtt-pub
デバイスをauth情報にしてsubscribeします。
$ mosquitto_sub \ -h $MESHBLU_BROKER \ -p 1883 \ -t $MQTT_PUB_UUID \ -u $MQTT_PUB_UUID \ -P $MQTT_PUB_TOKEN \ -d Client mosqsub/26961-raspberry sending CONNECT Client mosqsub/26961-raspberry received CONNACK Client mosqsub/26961-raspberry sending SUBSCRIBE (Mid: 1, Topic: mqtt-pub, QoS: 0) Client mosqsub/26961-raspberry received SUBACK Subscribed (mid: 1): 0
|
OSX上で同様にpublishします。
$ mosquitto_pub \ -h $MESHBLU_BROKER \ -p 1883 \ -t message \ -m '{"devices": ["'"$MQTT_PUB_UUID"'"], "payload": {"red":"on"}}' \ -u $MQTT_PUB_UUID \ -P $MQTT_PUB_TOKEN \ -d Client mosqpub/16284-minion1.c sending CONNECT Client mosqpub/16284-minion1.c received CONNACK Client mosqpub/16284-minion1.c sending PUBLISH (d0, q0, r0, m1, 'message', ... (50 bytes)) Client mosqpub/16284-minion1.c sending DISCONNECT
|
Raspberry Pi上でsubscribeしているシェルにメッセージが届きました。
{"topic":"message","data":{"devices":["mqtt-pub"],"payload":{"red":"on"},"fromUuid":"mqtt-pub"}}
|
HTTP(http-sub) > MQTT(mqtt-pub)
Raspberry Pi上でmqtt-pub
デバイスをauth情報にしてsubscribeします。
$ mosquitto_sub \ -h localhost \ -p 1883 \ -t $MQTT_PUB_UUID \ -u $MQTT_PUB_UUID \ -P $MQTT_PUB_TOKEN \ -d
|
OSX上でhttp-sub
デバイスをauthに情報にしてcurlからメッセージをpublishします。
$ curl -X POST \ "$MESHBLU_URL/messages" \ --insecure \ -d '{"devices": ["'"$MQTT_PUB_UUID"'"], "payload": {"red":"on"}}' \ --header "meshblu_auth_uuid: $HTTP_SUB_UUID" \ --header "meshblu_auth_token: $HTTP_SUB_TOKEN" {"devices":["mqtt-pub"],"payload":{"red":"on"}}
|
Raspberry Pi上でsubscribeしているシェルにメッセージが届きました。
{"topic":"message","data":{"devices":["mqtt-pub"],"payload":{"red":"on"},"fromUuid":"http-sub"}}
|