Watson IoT PlatformにDeviceを接続する際の設定

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。

この記事では次を紹介します。
- デバイスをMQTTを使ってWatson IoT Platformに接続する際の設定について

# Watson Internet of Thingsサービス
Watson IoT Platformが何かについては、下記に説明があります。
[Watson IoT Platform について](https://console.bluemix.net/docs/services/IoT/iotplatform_overview.html#about_iotplatform)
アプリケーションとIoTデバイスをつなぐプラットフォームです。
IoTデバイスは、プラットフォームとMQTTとHTTPでアクセスすることができます。

# MQTT Brokerとの比較
Watson IoT Platformは、単なるMQTT Brokerと比較すると、セキュリティを確保するために、次の仕組みが構築されています。
1. デバイスからデバイスに直接メッセージを送信できない。
2. デバイスとアプリケーションは直接メッセージを送受信できる。
3. デバイスからデバイスにメッセージを送りたい場合は、一度、アプリケーションを経由する。
この仕組みは下記にて説明があります。
[IoT デバイス間のデータ・リークを回避する方法](https://console.bluemix.net/docs/services/IoT/reference/security/index.html#prevent-leak-devices)
この仕組みは、MQTTのClient IdentifierやTopicに規則を設けて実現しています。

1. Watson IoT Platformに接続されるものは、タイプがある。デバイスかアプリケーション。
2. メッセージにはタイプがある。event、command、statusなど。
3. デバイスからアプリケーションに送信されるメッセージは、eventとstatusタイプのみ。
4. デバイスはeventタイプのメッセージは送信できるが、受信はできない。
5. アプリケーションからデバイスに送信されるメッセージは、event、command、statusタイプ。
6. これらの通信は、Watson IoT Platformサービスごとに割り当てられる組織の内部のみに制限されています。

# デバイスのMQTTの接続先
デバイスのMQTTの接続先については、次に説明があります。
[クライアント接続 URL](https://console.bluemix.net/docs/services/IoT/reference/security/connect_devices_apps_gw.html#client_connect_url)
接続先のホストは、次のフォーマットになります。
rgId.messaging.internetofthings.ibmcloud.com
例：
Watson IoT Platformの組織p2abc6の場合(下位にTCPを利用する場合)
tcp://p2abc6.messaging.internetofthings.ibmcloud.com/

# デバイスのMQTTの認証
デバイスのMQTTの認証方法については、次に説明があります。
[MQTT クライアント認証/デバイス認証](https://console.bluemix.net/docs/services/IoT/reference/security/connect_devices_apps_gw.html#mqtt_authentication)
MQTTのUser nameとして、デバイスに限らず下記を指定します。
use-token-auth
Passwordとして、Watson IoT Platformにてデバイス登録を行う際に設定するパスワードを指定します。

# デバイスのMQTTのClientId
デバイスのMQTTのCONNECT時のClientIdについては次に説明があります。
[MQTT クライアント ID](https://console.bluemix.net/docs/services/IoT/reference/security/connect_devices_apps_gw.html#mqtt-id)
デバイスのClientIdは、次のフォーマットに従う必要があります。
d:orgId:deviceType:deviceId
例：d:p2abc6:myDeviceType:mydevice01

# デバイス向けのMQTTのTopicについて
デバイスのMQTTのTopicについては、次に説明があります。
[イベントのパブリッシュ](https://console.bluemix.net/docs/services/IoT/devices/mqtt.html#publishing_events)
Topicは次のフォーマットに従う必要があります。
iot-2/evt/event_id/fmt/format_string
例：iot-2/evt/myEvent/fmt/json

[コマンドへのサブスクライブ](https://console.bluemix.net/docs/services/IoT/devices/mqtt.html#subscribing_to_commands)
Topicは次のフォーマットに従う必要があります。
iot-2/cmd/command_id/fmt/format_string
例：iot-2/cmd/myCmd/fmt/json

# メッセージフォーマット
送信するメッセージのフォーマットについて、次に説明があります。
[管理対象デバイス/メッセージ形式](https://console.bluemix.net/docs/services/IoT/devices/mqtt.html#managed-devices)
メッセージはjsonフォーマットで、送信したいデータは下記のようにdの値にします。
{d: {送信したいデータ} }

# メッセージ送信例
MQTTクライアントを使用してWatson IoT PlatformへMQTTメッセージを送信する例です。

# Mosquito_pubの場合
[Mosquitto](https://mosquitto.org/)のMQTTクライアントを使用する例

`mosquitto_pub -h 'p2abc6.messaging.internetofthings.ibmcloud.com' -u 'use-token-auth' -P 'mydevicetoken' -i 'd:p2abc6:myDeviceType:mydevice01' -t 'iot-2/evt/start/fmt/json' -m '{"d":{"time":"2017-07-20T11:03:00.000+09:00"}}'`

`mosquitto_pub -h 'p2abc6.messaging.internetofthings.ibmcloud.com' -u 'use-token-auth' -P 'mydevicetoken' -i 'd:p2abc6:myDeviceType:mydevice01' -t 'iot-2/evt/start/fmt/text' -m '2017-07-20T11:03:00.000+09:00'`

## Pythonの場合
Pythonにて、[paho-mqtt](https://eclipse.org/paho/clients/python/)を使用する例
`pip install paho-mqtt
python pub.py`

pub.pyの内容：
`import paho.mqtt.publish as publish
publish.single("iot-2/evt/start/fmt/json", '{"d":"time":"2017-07-20T11:03:00.000+09:00"}}', hostname="p2abc6.messaging.internetofthings.ibmcloud.com",　client_id="d:p2abc6:thermostat:mydevice01", auth={"username":"use-token-auth", "password":"mydevicetoken"})`


# デバイスの実装について
C言語によるMQTT Clientのサンプルは、次に説明があります。
[MQTT C Client for Posix and Windows](https://eclipse.org/paho/clients/c/)

Watson IoT PlatformのDeviceの作成方法は次に説明があります。
[Watson IoT Platform でのデバイスの開発](https://console.ng.bluemix.net/docs/services/IoT/devices/device_dev_index.html#device_dev_index)