IoT Platformを日本版Alibaba Cloudで使う

2018年7月にAlibaba Cloud日本版に登場したIoT Platformを使いました。

ざっくり説明

IoT Platformで管理しているデバイスに対してプッシュ型の通信ができます。

IoT Platformで出来ること

IoT Platformでは現在以下のことができます。

  • バイス管理
  • MQTTでpublish/subscribe
  • ファームウェアのリモートアップデート
  • 受け取ったデータを別のサービス(Table Store/RDS/Message Service/Function Compute)に転送する

主な用途はMQTT Brokerだと思います。

プロダクトを作ってデバイスを登録する

まず、プロダクトを作ります。これはデバイスを収める箱のようなものです。

次にプロダクト画面の「デバイス」にアクセス

f:id:asmsuechan:20180721151403p:plain

次に「デバイス」->「デバイスの追加」からデバイスを追加します。

f:id:asmsuechan:20180721151539p:plain

できました。

f:id:asmsuechan:20180721151623p:plain

ProductNameProductkeyProductSecretをメモしておきます。

バイスSDKをインストールする

MQTTをsubscribe/publishするためにデバイスSDKをインストールします。

日本版ドキュメントはまだ日本語に翻訳されてない上にコード部分の改行が全部消えてて見にくいので英語版ドキュメントGitHubのReadmeを参照します。

ちなみにmacだとビルドが失敗します。Ubuntuをお使いください。

私はVagrantubuntuを立てました。

$ 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を実行します。

先ほどメモしたProductNameProductkeyProductSecretsample/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カテゴリの作成」をします。

f:id:asmsuechan:20180721153722p:plain

Topicカテゴリの名前をdataにし、デバイス操作権限をパブリッシュとサブスクライブにしてOKを押します。

f:id:asmsuechan:20180721153751p:plain

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を両方行なっています。

コンソールのプロダクト詳細にあるデバイスログをみると、ちゃんと送られていることが確認できました。

f:id:asmsuechan:20180721154433p:plain

まとめ

この記事の要点

  • Linuxを使う
  • 日本版を使うときはmqtt_multi_region-exampleを使い、-rオプションを指定する
  • ちゃんとDEVICE_NAMEなどの情報を変更する
  • ドキュメントよりコードを読む

※Alibaba Cloudは開発が速いので上に書いてあるドキュメントの間違いは修正されている可能性があります。