【アップデート】AWS IoT Core Device Location が MQTT トピックによる位置情報の解決をサポートしました

2023.07.26

先日、AWS IoT Core Device Location に新しいアップデートがありました。

従来は AWS IoT Core Device Location で位置情報を取得するには以下の方法で利用することができました。

  • マネジメントコンソール
  • AWS CLI
  • SDK

そのため、デバイス側もしくは IoT Core のルールアクションで Lambda などで API を叩いて位置情報を取得する必要がありました。

今回のアップデートで、専用の MQTT トピックに IP アドレスや WiFi 情報などを送ることで位置情報を MQTT で受け取ることができるようになりました。

本機能のドキュメントは下記になります。

利用する MQTT トピック

今回のアップデートに伴い、専用の予約トピックが使えるようになりました。

  • $aws/device_location/customer_device_id/get_position_estimate
    • 許可される操作:Publish
    • デバイスから送られる IP アドレスや WiFi 情報などを送るトピックです。
  • $aws/device_location/customer_device_id/get_position_estimate/accepted
    • 許可される操作:Subscribe
    • get_position_estimate トピックに送られた情報から位置を解決できたら、このトピックに位置情報が publish されます。
  • $aws/device_location/customer_device_id/get_position_estimate/rejected
    • 許可される操作:Subscribe
    • 位置の解決に失敗した場合、エラー情報が publish されます。

トピックで指定する customer_device_id はデバイスを識別する一意の ID になりますが、デバイスが AWS IoT Core に登録されているなら、その thing_name を指定することが推奨されています。
(これは AWS IoT Core で MQTT を使う際の全般的な推奨事項になります)

やってみる

今回は簡単に動作確認したいので、AWS IoT Core のマネジメントコンソールにあるテストクライアントを使います。

最初に位置情報を受け取るトピックをサブスクライブしておきます。
テストクライアントの画面から、Subscribe to a topic のタブを開いてトピックをサブスクライブします。トピックの「デバイス ID」にはワイルドカード + を使いました。(個々の ID を指定しても構いません)

  • サブスクライブするトピック:$aws/device_location/+/get_position_estimate/accepted

02-aws-iot-core-subscribe

次に位置情報をパブリッシュします。デバイス ID は適当に sampleThing としています。(必要に応じて変更してください)

  • パブリッシュするトピック:$aws/device_location/sampleThing/get_position_estimate

送信するメッセージは、デバイスの IP アドレスを想定したものにしました。
MessageIdTimestamp はオプションです。Timestamp が無い場合、リクエストを受信した時間が付与されます。位置情報が正常に解決できた場合、メッセージペイロードは同じ MessageId 情報を返します。

 {
	"MessageId": "ABCD1",
	"Timestamp": "1664313161",
	"Ip":{
		"IpAddress": "54.240.198.35"
	}
}

03-aws-iot-core-publish

これでメッセージをパブリッシュすると $aws/device_location/+/get_position_estimate/accepted のトピックにて、位置情報を受け取ることができました。

04-get-position-estimage

なお、位置情報を受け取れないなどうまくできない時は、トピック get_position_estimate/rejected も合わせてサブスクライブしてエラー内容を確認しましょう。

下記はメッセージペイロードのフォーマットが正しくなかったときのエラーメッセージになります。

{
  "errorMessage": "Validation error: Incorrect message payload",
  "errorCode": 400
}

最後に

今回のアップデートで従来よりもさらに簡単にデバイスの位置情報を取得できるようになりました。
すでにデータのやりとりで MQTT を利用されている場合は、ぜひ検討いただければと思います。

以上です。