【アップデート】AWS IoT Device Management のフリートインデックスでデバイスの位置情報がサポートされました

2023.11.17

どういうアップデート?

今回のアップデートで、デバイスの位置情報(緯度、軽度)をフリートインデックスの対象にすることができるようになりました。
これにより、位置情報を元にしたデバイスのクエリを行えるようになりました。例えば「半径2キロメートル以内にあるデバイスの抽出」などがフリートインデックスを使って簡単にできるようになります。

位置情報はデバイスシャドウに保存し、シャドウをインデックスの対象にすることで位置情報をクエリできるようになっています。

やってみる

今回は「都内にある GPS 機能付き自転車」を想定して検証してみることにします。

AWS IoT Core 上の名前 自転車がある場所 緯度, 経度 名前付きシャドウ名
Bike-1 日比谷フォートタワー前 35.669760, 139.753038 Bike-shadow
Bike-2 産報佐久間ビル前
(秋葉原)
35.697495, 139.774743 Bike-shadow

(余談:日比谷フォートタワーはクラスメソッドのオフィスがある場所です。産報佐久間ビルは以前オフィスがあった場所です。)

最初に自転車をデバイスとして AWS IoT にモノとして作成します。

  • Bike-1 の作成
    • 属性である attributes は適当です。(本記事では特に使いません)
aws iot create-thing --thing-name "Bike-1" \
--attribute-payload '{"attributes": {"model":"OEM-2302-12", "battery":"35", "acqDate":"06/09/23"}}'

作成できたら次のようなレスポンスが返ってきます。

{
    "thingName": "Bike-1",
    "thingArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxx:thing/Bike-1",
    "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
  • Bike-2 の作成
    • 自転車1と同様に作成します。
aws iot create-thing --thing-name "Bike-2" \
--attribute-payload '{"attributes": {"model":"OEM-2302-10", "battery":"40", "acqDate":"17/02/22"}}'

次にデバイスシャドウを登録します。今回は「名前付きシャドウ」にしてみました。(クラシックシャドウでも構いません)
今回のアップデートではデバイスシャドウに位置情報を格納するのですが、Bike-1Bike-2 の位置情報は先ほど表に記載した通りとします。

  • Bike-1 の位置情報を登録
aws iot-data update-thing-shadow \
--thing-name Bike-1 \
--shadow-name Bike-shadow \
--cli-binary-format raw-in-base64-out \
--payload '{"state":{"reported":{"coordinates":{"lat": 35.669760, "lon": 139.753038}}}}' \
"output.txt"
  • Bike-2 の位置情報を登録
aws iot-data update-thing-shadow \
--thing-name Bike-2 \
--shadow-name Bike-shadow \
--cli-binary-format raw-in-base64-out \
--payload '{"state":{"reported":{"coordinates":{"lat": 35.697495, "lon": 139.774743}}}}' \
"output.txt"

それぞれ日比谷と秋葉原の位置情報をシャドウにセットできました。コンソール上では次のように Bike-shadow というシャドウが見えているはずです。

01-shadow-of-bike-1

登録した位置情報も格納されています。

02-bike-1-shadow

次にフリートインデックスの設定を行います。既に他の作業で既存の設定があったので、マネジメントコンソールから設定しています。
メニューから Settings の画面を開いて Fleet Indexing の項目まで移動します。まだ Index location data が未設定になっているので、画面右上の Manage Indexing をクリックして編集します。

10-manage-fleet-index

ConfigrationAdd shadow names をクリックします。 (Add named shadows にチェックが入っていなければ入れてください)

11-add-shadow-names

インデックスに利用するシャドウの名前を入力します(今回は Bike-shadow

12-add-bike-shadow

追加されました。

13-added-named-shadow-to-indexing

次に Index location data の部分で Add new field をクリックします。

14-add-index-location-data

ここではインデックスしたいパスを指定します。

  • Data path: shadow.name.Bike-shadow.reported.coordinates
    • 書式:shadow.name.[named_shadow_name].reported.coordinates
  • Sequence : Lat, long (デフォルトのまま)

15-add-data-path

セットできたら Update をクリックして登録します。

16-click-update-2

これでフリートインデックスの設定が完了しました。

17-updated-group-indexing

ジオクエリを試す

準備ができたので実際にクエリを発行してみます。今回は次の3パターンを試します。

  • JR 新橋駅前から半径 5km 圏内にある自転車を検索
  • JR 新橋駅前から半径 1km 圏内にある自転車を検索
  • JR 新橋駅前から半径 1km 圏内より外側にある自転車を検出

JR 新橋駅前から半径 5km 圏内にある自転車を検索

次のコマンドを実行します。
ここで利用している 35.667283,139.757371 の位置情報は「JR 新橋駅前」のものです。JR 新橋駅前を起点として、半径 5km の距離内にある自転車をシャドウのデータを使って検索しています。

aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,5km"

次のようなレスポンスが得られます。Bike-1Bike-2 の両方が検出できています。
(JR 新橋駅前を起点とすると日比谷と秋葉原は 5km 圏内になります)

{
    "things": [
        {
            "thingName": "Bike-1",
            "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "attributes": {
                "acqDate": "06/09/23",
                "battery": "35",
                "model": "OEM-2302-12"
            },
            "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.66976,\"lon\":139.753038}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205142},\"lon\":{\"timestamp\":1700205142}}}},\"hasDelta\":false,\"version\":1}}}"
        },
        {
            "thingName": "Bike-2",
            "thingId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
            "attributes": {
                "acqDate": "17/02/22",
                "battery": "40",
                "model": "OEM-2302-10"
            },
            "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.697495,\"lon\":139.774743}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205148},\"lon\":{\"timestamp\":1700205148}}}},\"hasDelta\":false,\"version\":1}}}"
        }
    ]
}

JR 新橋駅前から半径 1km 圏内にある自転車を検索

次のコマンドを実行します。半径の値を変えただけのものになります。

aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,1km"

レスポンスは次のとおり、日比谷フォートタワー付近にある Bike-1 のみとなりました。

{
    "things": [
        {
            "thingName": "Bike-1",
            "thingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "attributes": {
                "acqDate": "06/09/23",
                "battery": "35",
                "model": "OEM-2302-12"
            },
            "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.66976,\"lon\":139.753038}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205142},\"lon\":{\"timestamp\":1700205142}}}},\"hasDelta\":false,\"version\":1}}}"
        }
    ]
}

JR 新橋から半径 1km 圏内より外側にある自転車を検出

次のコマンドを実行します。AND, NOT 句を使ってクエリしています。
最初は NOT 句のみで検索したのですが、クラシックシャドウもヒットしてしまったので名前付きシャドウのみを検索対象とするために AND 句を使っています。

aws iot search-index --query-string "shadow.name.Bike-shadow.reported.coordinates:* AND (NOT shadow.name.Bike-shadow.reported.coordinates:geo_distance,35.667283,139.757371,1km)"

レスポンスは次の通り、秋葉原の産報佐久間ビル前にある Bike-2 のみとなりました。

{
    "things": [
        {
            "thingName": "Bike-2",
            "thingId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
            "attributes": {
                "acqDate": "17/02/22",
                "battery": "40",
                "model": "OEM-2302-10"
            },
            "shadow": "{\"name\":{\"Bike-shadow\":{\"reported\":{\"coordinates\":{\"lat\":35.697495,\"lon\":139.774743}},\"metadata\":{\"reported\":{\"coordinates\":{\"lat\":{\"timestamp\":1700205148},\"lon\":{\"timestamp\":1700205148}}}},\"hasDelta\":false,\"version\":1}}}"
        }
    ]
}

最後に

今回のアップデートで簡単にデバイスの位置情報を基準にした検索ができるようになりました。
GPS 機能がないデバイスでも「AWS IoT Core Device Location」を使うことで位置情報を取得できるので、積極的に利用していきたいと思います。

以上です。

参考リンク