MosquittoでAWS IoT CoreにPub/Sub


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コンソールで 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 オプションをつけること。