HERE Positioning APIとSigfox Atlas WiFiの検証

Sigfox位置情報サービス[**Atlas Suite**](https://build.sigfox.com/geolocation-sigfox-atlas)のひとつとして提供されているAtlas WiFi。WiFi MACアドレスをSigfoxで送信することにより、IoTデバイスの位置情報を推定するサービスですが、[こちらの記事](https://www.sigfox.com/en/news/here-and-sigfox-join-forces-create-global-iot-location-service-logistics-and-supply-chain)にある通り、位置推定のコアは欧州のHere社との提携の下、開発されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/079591cd-53be-f418-913b-259c2f35e2c7.png)
ここでは、Altas WiFiのサービス仕様を振り返りつつ、HERE社の位置情報サービス（HERE Positioning API）との違いを検証します。

#Atlas WiFiサービス
Sigfox社が提供するAtlas WiFiサービスの基本的な使い方は[こちら](https://qiita.com/ghibi/items/1e11470cc590a2795568)を参照してください。
Atlas WiFiサービスを使用するには、[KCCSのパートナー](https://www.kccs-iot.jp/partner/)からAtlas WiFiに対応した回線サービスを購入いただく必要があります。（Sigfox Buyからの回線には、このサービスは含まれていません）
そのうえで、IoTデバイスでスキャンしたWi-FiネットワークのMACアドレスを2つ送信することとなりますが、送信するMACアドレスは、サービスのアベイラビリティを向上するために、いくつかの注意点があります。
##Atlas WiFiにおけるMACアドレスの選択
Atlas WiFiにおいて送信するMACアドレスは下記のルールに従ってください。
###MUST
1. **ビーコン**フレームもしくは**プローブ応答**フレームで得られたMACアドレスであること
2. アドホックモードネットワークではなく、**インフラストラクチャモード**のネットワークであること
3. **ユニキャスト**であること（**先頭オクテットのb0ビットが"0"**であること)
4. リザーブMACアドレス（00:00:00:00:00:00、FF:FF:FF:FF:FF:FF）でないこと

###Recommendation
1. **グローバルアドレス**であること（**先頭オクテットのb1ビットが"0"**であること)
2. テザリング端末やWi-Fiモバイルルータをフィルタリングすること（SSIDでの識別を推奨）
3. ステルスSSIDを避けること
4. RSSIが強いアクセスポイントを優先すること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/2e9337d0-72d7-b41e-92bb-0719474c1b1d.png)

##Atlas WiFiサービスを適用しないメッセージ
上記ルールの下、選択された2つのMACアドレスをSigfox上りメッセージで送信することにより、Altas WiFiによる位置推定結果をData Advanced Callbackで受信することができますが、位置情報ではないメッセージを送りたい場合もあるかと思います。
そのような場合は、**先頭オクテットのb0ビットとb1ビット両方を"1"とする**ことにより、そのメッセージは位置推定からは外れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/e54db0e1-4ff2-eac0-32b0-fc6f921a0eb5.png)

#HERE社Positioning API
一方、HERE社は、同様のサービスを**Positioning API**として提供しています。
HERE社のREST APIは、これ以外にもMapサービスやジオコーディングサービスなど多岐にわたっていますので、[同社のDeveloperサイト](https://developer.here.com/develop/rest-apis)を参考にしてください。
Positioning APIはAPI KEYを取得したうえで、下記エンドポイントにMACアドレスをPOSTすることにより利用可能です。
`https://pos.ls.hereapi.com/positioning/v1/locate?apiKey={YOUR_API_KEY}`
HTTPヘッダに`Content-Type=application/json`を追加し、下記Bodyを送信します。

```here-positioning-request.json
{
 "wlan": [
  {"mac": "AA-AA-AA-AA-AA-AA"},
  {"mac": "BB-BB-BB-BB-BB-BB"},
  {"mac": "CC-CC-CC-CC-CC-CC"}
  ]
}
```
応答は下記のようなJSONが返ってきます。

```here-positioing-response.json
{
  "location": {
  "lat": 52.5187469,
  "lng": 13.37551117,
  "accuracy": 338
  }
}
```

#HERE Positioning APIとSigfox Atlas WiFiの比較
##比較その1
仮に、この2つのMACアドレス（BC-5C-4C-15-FE-4?、84-AF-EC-F5-47-F?）が取得できたとします。
>?のところは、隠しています。

Sigfox Altas WiFiとHERE Positioning APIそれぞれに上記2MACアドレスを送信したところ、下記の通り、同じ位置推定結果が得られました。

|    |Sigfox Altas WiFi|HERE Positioning API|Google Geolocation API|
|:---|:----------------|:-------------------|:---------------------|
|lat|35.7?78051|35.7?78051|35.7x83267|
|lng|139.7?59457|139.7?59457|139.7x62130|
|accuracy(radius)|250|250|150|
確かに、HERE社のエンジンを使っていることが推測できます。
Google Geolocation APIとも比較しましたが、今回の場合、accuracyはGoogleの方が良いものの、実際の位置との誤差はHEREの方が若干良い結果でした。（これは、場所によって変わると思いますが）

##比較その2
次に、2つ目のMACアドレスを別のものに変え、この2つのMACアドレス（BC-5C-4C-15-FE-4?、50-C4-DD-CD-6B-E?）を送信してみました。
結果は、HERE社のPositioning APIは404エラーを返してきました。おそらく、2つ目のMACアドレスが登録されていないのではないかと思います。

|    |Sigfox Altas WiFi|HERE Positioning API|Google Geolocation API|
|:---|:----------------|:-------------------|:---------------------|
|lat|35.7?3913|404 error|35.7x83267|
|lng|139.7?3475|404 error|139.7x62130|
|accuracy(radius)|250|404 error|150|

これから想像するに、Sigfox Atlas WiFiサービスは、メッセージを受信したSigfox BaseStation情報も位置推定に使われており、少ないMACアドレス数でも位置推定しやすくしているのだと思います。（あくまで想像ですが）

###404エラーはやめて
HERE社のPositioning APIですが、送信したMACアドレスから位置推定できなかった場合に、404エラーを返してきます。（こんな感じ）

```error.json
{
    "error": {
        "code": 404,
        "message": "Not Found",
        "description": "Position not found"
    }
}
```
URLが間違っていた場合でも同じエラーでdescriptionだけが違うので、原因切り分けが面倒ですね。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d6ad10bc-75ba-8124-14d4-f144657c6473.png)](https://twitter.com/ghibi)