AWS IoTのテストにmosquittoを使うと、デバイスの開発の際にちょっと設定をテストしたり、ちょっとハマったときにコマンドラインで検証をしたりと、何かと便利。
準備
- mosquitto一式をインストールする。macOSでhomebrewが使えるなら
brew install mosquitto
で必要なものが全部入れられる。 - AWS IoTの証明書一式を準備する。
- AWS IoT CoreのWebコンソールで Security > Certificates > Add certificate > Create certificate を選んで
- Device certificate (xxx-certificate.pem.crt)
- Public key file (xxxx-public.pem.key) 今回は使わないけれど一応
- Private key file (xxxx-private.pem.key)
- Root CA certificates > RSA 2048 bit key (AmazonRootCA1.pem)
- 証明書を作ったらPolicyをアタッチしておく
- 証明書をActiveにする
- AWS IoT CoreのWebコンソールで Security > Certificates > Add certificate > Create certificate を選んで
- エンドポイントを把握しておく。AWS IoT CoreのWebコンソールで Settingsを開く。Device data endpointというパネルにEndpointという項目があり、
xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
みたいな文字列が書かれている。これがエンドポイント。 - AWS IoTのThingとしての振る舞いを再現したい場合は、Thingに証明書をアタッチしておく。
mosquitto_pubでpublish
$ mosquitto_pub -h IOT_CORE_ENDPOINT -p 8883 -i THING_NAME \
-t "topic/to/publish" -m '{"foo":"bar"}' \
--cafile path/to/CA1.cer --cert path/to/certificate.pem.crt \
--key path/to/private.pem.key -d
- -h : ホスト。AWS IoT Coreのエンドポイントを指定する。
- -t : publish先のトピック。
- -i : (オプション) Client IDを指定できる。Thingとしてpub/subしたい場合はここでThing nameを入れる。
- -p : ポート。MQTT over TLSは通常8883を使う。
- —cafile : Root CA certificateのパス。
- —cert : Device certificateのパス。
- —key : Private key fileのパス。
- -m : データ。
- -d : つけておくとデバッグモードになる。
mosquitto_subでsubscribe
$ mosquitto_sub -h IOT_CORE_ENDPOINT -p 8883 -i THING_NAME \
-t "topicfilter/to/subscribe" \
--cafile path/to/CA1.cer --cert path/to/certificate.pem.crt \
--key path/to/private.pem.key -d
- -h : ホスト。AWS IoT Coreのエンドポイントを指定する。
- -t : トピックフィルタ。
- -i : (オプション) Client IDを指定できる。Thingとしてpub/subしたい場合はここでThing nameを入れる。
- -p : ポート。MQTT over TLSは通常8883を使う。
- —cafile : Root CA certificateのパス。
- —cert : Device certificateのパス。
- —key : Private key fileのパス。
- -d : つけておくとデバッグモードになるよ。
subscribeしながらpublishしたい場合はmosquitto_rrを使おう
mosquitto_rr
を使うと、subscribeしつつpublishすることができる。
たとえば、AWS IoTでの証明書の取得などでは $aws/certificates/create/json/accepted
をsubscribeして結果を待ち受けしながら $aws/certificates/create/json
にpublishする必要がある。そういったシチュエーションを再現したい場合は
$ mosquitto_rr -i CLIENT_ID -h IOT_CORE_ENDPOINT -p 8883 \
-t 'topic/to/pub' -e 'topicfilter/to/sub' -m '{"foo":"bar"}' \
--cafile path/to/CA1.cer --cert path/to/certificate.pem.crt \
--key path/to/private.pem.key -d -V 311 -d
のように mosquitto_rr を使う。
mosquitto_rrはデフォルトでプロトコルバージョン5.0を使うので注意が必要。AWSでは3.1.1を使う必要がある。-V 311 オプションをつけること。