Data Advanced Callbackで受信品質(LQI)とデバイス位置情報(Atlas)を取得する

ここでは、SigfoxクラウドのCallback機能のひとつである**Data Advanced Callback**を使って、メッセージ受信品質（LQI: Link Quality Indicator）と、デバイス位置情報を取得する方法を説明します。

#Data Advanced Callbackを使ってみる
Callbackは、DeviceType単位での設定です。[Sigfox Callback機能](https://qiita.com/ghibi/items/53259381a30363538a6d)を参考に、Custom Callback設定画面まで移動してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/7cc3414b-7839-ad62-2c6c-840ad749b135.png)
Type項目で[SERVICE]_[DATA_ADVANCED]を選択するとData Advanced Callbackパラメータとして、
`device, time, data, seqNumber, lqi, fixedLat, fixedLng, operatorName, countryCode, deviceTypeId, computedLocation`
が利用できるようになります。


|Callback param|説明|
|:---|:--|
|device|デバイスID|
|time|メッセージ受信時刻(Unixタイムスタンプ)|
|data|ペイロードデータ|
|seqNumber|メッセージシーケンス番号|
|lqi|Link Quality Indicator([詳しくはこちら](https://qiita.com/ghibi/items/11acba7b61ad986a6559))|
|fixedLat,fixedLng|Device設定で固定的に登録した緯度経度|
|operatorName|Sigfox Operator名|
|countryCode|国コード([ISO 3166-1参照](https://ja.wikipedia.org/wiki/ISO_3166-1))|
|deviceTypeId|デバイスタイプID|
|**computedLocation**|デバイス位置情報|

##Data Advanced Callbackは約30秒後
Data Advanced CallbackはLink Qualityを計算します。Link Qualityは、複数受信局の受信レベルにより計算されるため、Sigfoxクラウド上に受信局情報が集まってきてから計算する必要があります。
なので、Sigfox社は、Data Advanced Callbackが送信される時間を**25秒～30秒後**とアナウンスしています。

###実際のデータで確認する
Data Advanced Callbackを実際に設定して試してみます。
下図がDeviceのMessagesビューで確認できるCallbackの送信ログです。![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/94a8c93a-011b-6f7b-0c3f-bef35a601138.png)ボタンをクリックするとCallbackログが見れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/4323c606-f184-310c-2e38-6dbb6df16f4d.png)
ここでMessageの受信時刻は*2018-09-02 19:27:52 (UNIXタイムスタンプ:1535884072)*となっています。

では、受信側のプラットフォームのログを見ています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5055cf38-0f9b-9d33-cf88-f8de2c1687db.png)
{time}として送られてきた時刻は、赤枠の*1535884072（2018-09-02 19:27:52）*となっています。Messageの受信時刻は変わらないとうことです。
ただ、青枠の時刻は*2018-09-02 19:28:18*となっています。つまり、今回のケース、DeviceのMessage受信時刻（Sigfox基地局がMessageを受信した時刻）とData Advanced Callbackが送信された時間の差として、*26秒の差*がありました。
この時間差は生じるものとして、システム設計すれば十分に使えそうです。

#Data Advanced Callbackで取得できる位置情報
Data Advanced Callbackで取得できる位置情報には

1. fixedLat / fixedLng
2. computedLocation

の2種類があります。
##fixedLat / fixedLngは事前設定したデバイスの固定位置情報
fixedLatとfixedLngは、どういう時に使えばよいでしょうか？
例えば、ガスメーターや土壌監視など、デバイスが移動しないような場合に、その位置をシステム上で扱いたい時に使用します。
使い方は単純で、固定的に設置したデバイスの緯度経度をDEVICEのEdit画面で設定します。（下図）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/a9f1496b-1ae9-c3e1-28a8-0dce138147db.png)
ここで、緯度経度を設定することにより、Device Messages画面のLocationアイコンをクリックするとデバイスの位置を確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/69aa5f50-b96b-839a-d331-a1d0c83c0184.png)

##computedLocationはAtlas位置情報サービス
Sigfoxは、受信基地局情報によるデバイス位置推定サービス**Atlas native**と、WiFiアクセスポイント情報による位置推定サービス**Atlas wifi**をリリースしています。
（その他位置情報サービスもありますが、ここでは割愛します。）
**computedLocation**をData Advanced CallbackのBody部で指定することにより、Atlas nativeやAtlas wifiにより推定されたデバイス位置情報を取得することができます。
例えば、下記のようなJSONをCallback bodyに設定した場合

```body.json
{
  "device":"{device}",
  "time":{time},
  "data":"{data}",  
  "lqi":"{lqi}",
  "computedLocation":{computedLocation}
}
```
下記のような結果が得られるようになります。

```callback.json
{
  "device": "1234AB",
  ...（略）
  "computedLocation": {
    "lat":35.5xxxxxxxxxxx,
    "lng":139.7xxxxxxxxxxx,
    "radius":2412,
    "source":2,
    "status":1
  }
}
```
ここで、"computedLocation"の"lat"と"lng"が推定されたデバイス位置情報となります。
"source"が2となっている場合、Altas native、つまり、受信基地局情報による推定位置であることを意味しています。また、"radius"は推定誤差です。

なお、Atlas wifiの説明（[こちら](https://qiita.com/ghibi/items/1e11470cc590a2795568)）にも、WiFi位置測位を例にした、より詳しい説明を載せていますので、見てみてください。

#位置情報サービスに関する留意点
Altas Suite（Altas native, Atlas wifi）によるデバイス位置情報を取得するためには、下記2点を確認してください。

1. Atlasサービスオプション契約がONになっていること
2. Data Advanced Callbackを使うこと

この2つの条件を満たさない場合、SigfoxクラウドのMessages画面で表示可能なLocation情報は、**単にメッセージを受信した基地局のうち１つをピックアップした想定エリア**、つまり、シミュレーション上の電波伝搬範囲を表示するだけです。
また、上記1.が有効になっていても、Data Advance Callbackをキックしていない場合は、Altasサービスも働かないようになっています。
では、Altasサービスオプションが有効になっているかどうかを、どのように確認すればよいでしょうか？

##Atlasサービスオプション契約の確認方法
まずは、該当デバイスタイプに紐づくContract情報を見てください。
>DEVICETYPEメニューから、確認したいデバイスが属しているデバイスタイプを検索し、そのデバイスタイプ情報画面にある"Contracts"のところをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/aa80619d-a4e7-4f8f-8021-56cb4d40f0b3.png)

ここで、Optionsの**Sigfox geolocation service**を確認し、**Network location**となっていれば、Atlas native（受信基地局推定）オプションが有効になっています。**WiFi location**となっていれば、Atlas wifiオプションが有効になっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/30d5389d-7df5-b007-f9e9-fcea2a28eb05.png)
なお、2019年12月現在、Sigfox Buyでアクティベーションする場合は、Atlas wifiは有効にできません。*（Altas nativeは有効にできます）*
Sigfox Operator（[KCCS](https://www.kccs-iot.jp/)）もしくは、回線再販チャネルパートナー経由で申し込んでいただく必要があります。



[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)