2018年7月にAlibaba Cloud日本版に登場したIoT Platformを使いました。
ざっくり説明
IoT Platformで管理しているデバイスに対してプッシュ型の通信ができます。
IoT Platformで出来ること
IoT Platformでは現在以下のことができます。
- デバイス管理
- MQTTでpublish/subscribe
- ファームウェアのリモートアップデート
- 受け取ったデータを別のサービス(Table Store/RDS/Message Service/Function Compute)に転送する
主な用途はMQTT Brokerだと思います。
プロダクトを作ってデバイスを登録する
まず、プロダクトを作ります。これはデバイスを収める箱のようなものです。
次にプロダクト画面の「デバイス」にアクセス
次に「デバイス」->「デバイスの追加」からデバイスを追加します。
できました。
ProductName
とProductkey
とProductSecret
をメモしておきます。
デバイスにSDKをインストールする
MQTTをsubscribe/publishするためにデバイスにSDKをインストールします。
日本版ドキュメントはまだ日本語に翻訳されてない上にコード部分の改行が全部消えてて見にくいので英語版ドキュメントとGitHubのReadmeを参照します。
ちなみにmacだとビルドが失敗します。Ubuntuをお使いください。
$ git clone https://github.com/aliyun/iotkit-embedded $ cd iotkit-embedded $ make distclean && make SELECTED CONFIGURATION: VENDOR : ubuntu MODEL : x86 CONFIGURE .............................. [sample] CONFIGURE .............................. [src/cmp] CONFIGURE .............................. [src/coap] CONFIGURE .............................. [src/cota] (中略) 100.00% lite-log.o | log 4352 / 4352 ----------------------------------------------------------------- 30.71% [ dm ] 112632 Bytes 21.52% [ utils ] 78904 Bytes 14.06% [ mqtt ] 51552 Bytes 10.49% [ cmp ] 38472 Bytes 5.64% [ ota ] 20672 Bytes 5.60% [ shadow ] 20552 Bytes 4.92% [ system ] 18040 Bytes 2.71% [ http ] 9928 Bytes 1.78% [ cota ] 6512 Bytes 1.39% [ fota ] 5112 Bytes 1.19% [ log ] 4352 Bytes ========================================================================= $
これでエラーなくmakeできればひとまず安心です。
makeが完了したらoutput
ディレクトリができて、ここにビルドされたサンプルコードの実行ファイルが配置されます。
サンプルを実行する
さて、ドキュメントではoutput/release/bin/mqtt-example
を実行するよう書かれていますが実はこれだと日本版IoT Platformは動きません。
なぜなら日本版Alibaba CloudのIoT Platformはデバイスを作成すると自動で日本リージョンに設定されてしまい、そしてmqtt-example
の設定が上海リージョンのみの対応だからです。
ということでサンプルにあるmqtt_multi_region-example
を実行します。
先ほどメモしたProductName
とProductkey
とProductSecret
をsample/mqtt/mqtt_multi_region-example.c
の30行目くらいに書きます。
// sample/mqtt/mqtt_multi_region-example.c /* Japan Domain */ #define PRODUCT_KEY_JP "a1n38xxxxxx" #define DEVICE_NAME_JP "206rFj0AJxxxxxxxxxxxxxx" #define DEVICE_SECRET_JP "5ehmRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
これでビルドし直します。
$ make distclean && make
さて、これで./output/release/bin/mqtt_multi_region-example
を実行できるのですが、まだ設定することがあります。
このmqtt_multi_region-example
は/a1n3xxxxxx/xxxxxxxxxxxxxx/data
というトピックにpublishするので新しくトピックを作成しておきます。
「プロダクト管理」のメッセージタブから「Topicカテゴリの作成」をします。
Topicカテゴリの名前をdata
にし、デバイス操作権限をパブリッシュとサブスクライブ
にしてOKを押します。
mqtt_multi_region-example
でリージョンを指定するには-r
オプションを使います。(-hってないんだ)
$ ./output/release/bin/mqtt_multi_region-example -h ./output/release/bin/mqtt_multi_region-example: invalid option -- 'h' usage: mqtt_multi_region-example -r [PARAMTER] -r sh Select Shanghai demain. -r sg Select Singapore demain. -r jp Select Japan demain. -r us Select America demain. -r ger Select Germany demain. $ ./output/release/bin/mqtt_multi_region-example -r jp main|399 :: Japan Domain selected [inf] iotx_device_info_init(40): device_info created successfully! [dbg] iotx_device_info_set(50): start to set device info! [dbg] iotx_device_info_set(64): device_info set successfully! [dbg] guider_print_dev_guider_info(271): .................................................... [dbg] guider_print_dev_guider_info(272): ProductKey : a1n38xVIGuM [dbg] guider_print_dev_guider_info(273): DeviceName : 2xxxxxxxxxxxxxxxxxxxxxx [dbg] guider_print_dev_guider_info(274): DeviceID : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [dbg] guider_print_dev_guider_info(276): .................................................... [dbg] guider_print_dev_guider_info(277): PartnerID Buf : ,partner_id=example.demo.partner-id [dbg] guider_print_dev_guider_info(278): ModuleID Buf : ,module_id=example.demo.module-id [dbg] guider_print_dev_guider_info(279): Guider URL : [dbg] guider_print_dev_guider_info(281): Guider SecMode : 2 (TLS + Direct) [dbg] guider_print_dev_guider_info(283): Guider Timestamp : 2524608000000 [dbg] guider_print_dev_guider_info(284): .................................................... (中略) [dbg] iotx_mc_report_mid(2292): MID Report: topic name = '/sys/a1n38xVIGuM/xxxxxxxxxxxxxxxxxxxxxx/thing/status/update' [dbg] iotx_mc_report_mid(2309): MID Report: finished, IOT_MQTT_Publish() = 0 mqtt_client|274 :: publish message: topic: /a1n38xVIGuM/xxxxxxxxxxxxxxxxxxxxxx/update payload: update: hello! start! rc = 1 [inf] iotx_mc_subscribe(1388): mqtt subscribe success,topic = /a1n38xVIGuM/xxxxxxxxxxxxxxxxxxxxxx/data! mqtt_client|296 :: publish message: topic: /a1n38xVIGuM/xxxxxxxxxxxxxxxxxxxxxx/data payload: data: hello! start! rc = 3 [dbg] iotx_mc_cycle(1260): PUBACK (略) $
mqtt_multi_region-example
は1度の実行中にSubscribeとPublishを両方行なっています。
コンソールのプロダクト詳細にあるデバイスログをみると、ちゃんと送られていることが確認できました。
まとめ
この記事の要点
- Linuxを使う
- 日本版を使うときは
mqtt_multi_region-example
を使い、-r
オプションを指定する - ちゃんと
DEVICE_NAME
などの情報を変更する - ドキュメントよりコードを読む
※Alibaba Cloudは開発が速いので上に書いてあるドキュメントの間違いは修正されている可能性があります。