AWS IoT Core Device Locationで遊ぼう

# 始めに

この記事は[AWS Community Builders Advent Calendar 2022](https://adventar.org/calendars/7633)の12月11付けとして登録されています。

## AWS Community Buildersって何？

[AWS Community Builders Advent Calendar 2022](https://adventar.org/calendars/7633)の12月25日分（最終日）に解説記事が出る予定です。お楽しみに！

# 本題

年に一度開催される、AWS関連イベントとしては世界最大級の規模を誇る学習型カンファレンス「re:Invent 2022」及びその前後に発表された新技術の中から、GPSなどの位置情報取得技術を用いることなくデバイスの位置を利用することができる「[AWS IoT Core Device Location](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-iot-core-new-device-location-feature/)」について紹介します。

## AWS IoT Coreとは

[AWS IoT Core](https://aws.amazon.com/jp/iot-core/)は、多岐に渡るAWSのIoTサービス群の中でも、その名の通りコア部分を占めるサービスです。基本的には

* デバイスのメタデータを管理する
* デバイスとクラウドの間で状態を同期する（デジタルツイン）
* デバイスとクラウドを安全に接続する
* デバイスとAWS内／外のサービスとの間でルールベースのメッセージ配送（ルーティング）を行う

などの機能を提供するほか、これらの組み合わせによって更に高度な機能を提供しています。まさにAWSでIoTサービス群を利用する上で必須の技術基盤となっています。

## AWS IoT Core Device Locationとは

今回発表された「AWS IoT Core Device Location」は独立した新サービスではなく、デバイス状態のひとつとして位置情報を取り扱うことを可能にする機能拡張です。取り扱う、というのは下記のような機能を提供することを指しています。

* 下記の元データからの位置情報算出（解決）
    * 近隣のWi-Fiアクセスポイント
    * 携帯電話の基地局情報
    * 割り当てられたIPアドレス
    * GPSの生データ（NAVメッセージ）
* AWSの地理情報サービス（[Amazon Location Service](https://aws.amazon.com/jp/location/)）との連携

下図はAWS IoT Core Device Locationの動作を示した模式図です（[AWSドキュメント](https://docs.aws.amazon.com/iot/latest/developerguide/device-location.html)より引用）。ユーザー(Customer)から提供された生データ(raw measurement data)を適切な形式に整形し、位置情報プロバイダセレクタ(Provider selector)に供給することで位置情報(Resolved location)を得ることができます。またプロバイダセレクタは元データに応じたレゾルバ(resolver)に対して位置情報の解決を依頼し、結果を得ます。

![AWS IoT Core Device Location](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/iot-device-location.png)

## 位置を取得してみよう

AWS IoT Core Device Locationを使うには、

1. ウェブコンソールを使う方法
1. AWS CLIを使う方法
1. 各種SDKを用いる方法

がありますが、ここではウェブコンソールを用いた手順をご紹介します。

### 全体像

位置情報の解決は、それぞれの元データをJSON形式で記述したものをサービスに送信することで行います。AWSのウエブコンソールからAWS IoT Core -> テスト -> Device Locationを選択すると、下記のような画面が出てきます。

![](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-0.png)

ステップ1で説明されているとおり、本物のデバイスを利用する場合は何らかの手段で元データを入手する必要があります。ここでは手作業でデータを生成することにしましょう。データが準備できたら、それをペイロードデータとして与えて「解決」ボタンを押すと位置情報が表示されるようになっています。

### Wi-Fiアクセスポイントを用いた例

Wi-Fiアクセスポイントの情報から位置情報を得る場合のJSONペイロードは次のような形式になります。

```JSON
{
  "WiFiAccessPoints": [
    {
      "MacAddress": "00:00:5e:00:53:00",
      "Rss": -94
    },
    {
      "MacAddress": "00:00:5e:00:53:01",
      "Rss": -74
    }
  ]
}
```

WiFiAccessPointsの値として1つ以上のMacAddressとRss（信号強度）の組み合わせを与えることができます。留意すべき事項としては下記のような点が上げられます。

* 複数のアクセスポイント情報を与えることで精度を向上させることができる
* アクセスポイント情報から位置情報が解決できない場合はエラーとなる
* 複数のアクセスポイント情報を与えた場合、全てのアクセスポイントについて位置情報が解決可能でなければならない
    * つまり、闇雲に複数の情報を与えてしまうとエラーになる確率が上がる

実際に著者の勤務先で取得したアクセスポイント情報を元に位置を求めてみましょう。macの場合、airportコマンドを用いて近隣のアクセスポイント情報を得ることができます。

```sh
$ cd /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/
$ sudo ./airport -s
Password:
                            SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                          ****** 04:ab:18:83:**:** -95  36      Y  JP WPA(PSK/AES,TKIP/TKIP) RSN(PSK/AES,TKIP/TKIP)
             ******************* d4:2c:46:ab:**:** -79  6       Y  JP RSN(SAE/AES/AES)
                  ************** d4:2c:46:ab:**:** -79  6       Y  JP RSN(PSK/AES/AES)
                          ****** b0:c7:45:06:**:** -74  4,+1    Y  -- RSN(PSK/TKIP/TKIP)
                    ************ 34:76:c5:33:**:** -54  1       Y  -- WPA(PSK/TKIP,AES/TKIP) RSN(PSK/TKIP,AES/TKIP)
```

5つのアクセスポイントから位置情報を得ることができました。一例を以下に示します。

![Wi-Fiアクセスポイントによる位置情報解決](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-wifi.png)

結果として位置座標（経度、緯度）の他に、水平方向の精度(accuracy)、信頼性のレベル、タイムスタンプなどが返ってきます。慣れないと理解しづらいのは精度の考え方です。統計に詳しい方はすぐピンときたと思いますが、信頼性レベル0.68というのは推定値から±1σの間に真の値が存在する確率を示しており、accuracyがその1σに相当する値になります。即ち、accuracyが851ということは、得られた推定位置から半径851メートルの円内に真の位置が入っている確率が68%であることを示しています。

では、これら5つのアクセスポイント情報を全て使って位置情報を求めてみましょう。

![5点のWi-Fiアクセスポイントによる位置情報解決](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-wifi-5ap.png)

今度は精度が59となり大きく改善しました。用途にもよりますが、屋内のGPSが使えない場所としてはまずまず使えそうな値ではないでしょうか。

参考として、5つのアクセスポイントを単独で用いた場合および全て利用した場合のAccuracyと、実際の位置との差をまとめて示します。6つの例でいずれも真の位置は推定位置を中心とした半径accuracyの円内に収まっており、仕様である68％は充分に満たしていそうです。

|AP|Accuracy|真値との距離[m]|
|:-:|:-:|:-:|
|1|586|580|
|2|851|553|
|3|845|590|
|4|856|590|
|5|790|505|
|1,2,3,4,5|59|35|

### 携帯電話の基地局情報を用いた例

携帯電話（LTE）の基地局情報から位置情報を得る場合のJSONペイロードは次のような形式になります。

```JSON
{
  "CellTowers": {
    "Lte": [{
      "Mcc": 440,
      "Mnc": 10,
      "EutranCid": ********
    }]
  }
}
```

Wi-Fiアクセスポイントの場合と違い、耳慣れない用語が続きます。それぞれ下記のような値となります。

<dl>
  <dt>Mcc</dt>
  <dd>Mobile Country Codeの略。概ね運用地域の国・地域を示す。</dd>
  <dt>Mnc</dt>
  <dd>Mobile Network Codeの略。MCC内で運用される携帯電話ネットワークを示す。     <dt>EutranCid</dt>
  <dd>E-UTRAN (Evolved Universal Terrestrial Radio Access Network) Cell Global Identifierの略。基地局（正確には基地局が形成するセル）のID。</dd>
</dl>


これらの値を用いることで携帯端末が接続されている基地局（セル）を特定することができ、LTEモデムのATコマンド、linuxのnmcliコマンド、あるいはSORACOM回線であればコンソールのSIM情報詳細から調べることができます。

Wi-Fiアクセスポイントの場合と同様、筆者の勤務先に設置してあるIoT端末に挿入してあるSORACOM Air SIMの情報をコンソールから確認してみましょう。室内の定位置にずっと設置しているのですが、時によって異なる基地局に接続しているようです。

![LTE基地局情報を用いた位置情報解決](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-lte.png)

MMCは440、MNCは10で固定されていますが（docomo系のSIMは全てこうなります）セルIDは2通りあります。まずは1つの基地局情報から位置情報を取得してみます。

![1基のLTE基地局情報を用いた位置情報解決](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-lte-1.png)

今度は水平方向の精度に加え、垂直方向の精度が出力されました。しかし、位置情報として高さの値が与えられていないため、垂直方向の精度には事実上意味が無いように思えます。このあたり詳しい方がいらっしゃったらぜひフォローアップいただければ幸いです。

次にWi-Fiアクセスポイントの場合と同様、複数の基地局情報を用いることで精度向上するかどうかを試してみましょう。

![2基のLTE基地局情報を用いた位置情報解決](https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202212/device-location-console-lte-2.png)

伏せ字になってしまっているので分かりませんが、基地局情報1つのみを用いた結果と全く同一になってしまいました。たまたま効果がなかったのか、それとも基地局情報を用いた場合は複数の情報を合わせて使う効果が（あまり）ないのか、などの詳細は分かりません。Wi-Fiの場合は周囲にあるアクセスポイント情報が短時間に取得できますが、携帯電話網の場合はそういう訳にいきませんので、実用上の問題はなさそうです。

# まとめ

* AWS IoT Core Device Locationを用いることで、GPSなどの位置情報取得技術が利用できない場合でも簡単にデバイスの位置情報が得られました。
* Wi-Fiアクセスポイントの情報を用いる場合、複数のアクセスポイント情報を合わせることで精度の向上が期待できますが、エラーの発生確率も上がるため注意して利用する必要があります。
* 携帯電話（LTE）の基地局情報を用いる場合、複数の基地局情報を合わせることの効果は確認できませんでした。しかし同時に複数の基地局情報を収集すること自体が難しいため、実用上の問題はなさそうです。