Sigfox CallbackとAzure IoT Hub連携

Sigfox Callbackには、Custom Callback以外にAWS IoT、AWS Kinesis、Microsoft Azure Event hub、Microsoft Azure IoT hub、IBM Watson IoT Platformへの連携が用意されています。
ここでは、Azure IoT Hubとの連携方法を記載します。

#Sigfox Callback設定とAzure IoT Hubの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/ec21b559-88be-9721-147e-606c4b61184b.png)
まずは、AzureのWebコンソールから、Azure IoT Hubのリソースを作成します。ここでは、リソースグループ「SigfoxJapanKCCS」、IoT Hub名を「SigfoxIoT」として作成します。
作成されたSigfoxIoTを選択し、左メニューからShared access policiesを選択、iothubownerを選択すると、Shared access keys情報が表示されますので、Connection String（下図赤枠のところをコピーしておきます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/ac4d893a-8ba3-c5c3-ea5e-e19e0925a0a4.png)

次に、Sigfoxクラウドで、Callback設定画面に移動し、「Microsoft Azure IoT hub」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/dcd577a8-775d-9ff1-9577-efa05014bb62.png)
その後、下図のCallback編集画面が表示されるので、Connection stringの入力テキストボックスに先ほどコピーしたAzure IoT HubのConnection Stringを貼り付けます。
![screencapture-backend-sigfox-devicetype-5a17978f5005747c7760123d-callbacks-5bbdd43d2564320775fdf3cc-edit-2018-10-10-21_46_49.png](https://qiita-image-store.s3.amazonaws.com/0/172313/8877f141-27f2-0527-a467-77eadb48671f.png)
あとは、Azure IoT Hub側に送りたいJSONを記載します。今回は、下記のようなJSONを送ります。

```sigfox_callback.json
{ 
  "device" : "{device}", 
  "data" : "{data}", 
  "time" : {time}, 
  "seqNumber" : {seqNumber} 
}
```
これで、連携完了です。
Azure IoT Hubに戻り、ExplorersのIoT devicesを選択すると、下図のようにCallbackされたデバイスIDが表示されていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/e2931bcc-ccd3-a31d-28ed-11ef4522ed43.png)

#Stream Analytics JobによりDBにデータを保存する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/8f94d016-0658-4f20-8974-9abc27db33b6.png)
今回は、Cosmos DBにSigfoxのデバイスメッセージを保存していくので、Azure Cosmos DBのリソースを作成します。

##Azure Cosmos DBの作成
Azure Cosmos DBの作成画面は下図の通りです。Account Nameは適当（今回は「sigfoxcosmos」）APIは「SQL」として作成してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/1dea6d62-af42-391a-6183-5ece8e457b4c.png)
[Create]ボタンを押すと作成がはじまります。

##Stream Analytics Jobの作成
Stream Analytics Jobは、IoT Hubから、今回のケースではCosmos DBにデータを移す役割になります。
今まで同様、リソースの作成で、Stream Analytics Jobを選択すると、下図のような画面になります。
ここで、Job nameは適当（今回は「SigfoxStreamJob」）に設定して、[作成]ボタンをクリックすると作成されます。*（ごめんなさい。下記画像はStringJobになっていますが。。。）*
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/6d4e1232-66ab-d345-fc06-91e3dc6f4ada.png)
作成後の設定項目ですが、基本的には**Input**、**Output**、**Query**を設定することにより、どこから、どこへ、どのようにデータを受け渡すかの設定が完了します。
###Input
Inputは、左メニューのInputsを選択し、[+Add stream Input]から[IoT Hub]を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5c0b2eac-55e6-5c93-4219-4b50d6e10894.png)
下図の設定画面になりますので、Input aliasの入力（今回は"InputFromIoTHub"にしました）、IoT Hub名の選択、IoT Hubから受け入れるデータのフォーマット（今回はJSON）等を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/d68cfe74-4b01-c967-ffed-40db7f765079.png)

###Output
Outputも、左メニューのOutputsを選択し、[+Add]から[Cosmos DB]を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/7161d92a-8721-3fce-ddd7-75343d5c756f.png)
下図の設定画面になりますので、Output aliasの入力（今回は"OutputToCosmosDB"にしました）、Output先のCosmos DB情報を入力します。DatabaseやCollectionは、先のCosmos DB作成の時に適当に作っておいてください。（新規作成でもできそうですが）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/f8a717eb-b6f9-d8ee-d7a4-78703a4ffef8.png)

###Query
最後に、InputからOutputへ受け渡すQueryを設定します。
Queryも、左メニューのQueryを選択します。実際のQuery文は、Output先にどのようなデータを渡したいかによりますが、とりあえず全部ということであれば、下記のようなクエリで出来ると思います。

```
SELECT
    *
INTO
    [OutputToCosmosDB]　<- Outputのalias名
FROM
    [InputFromIotHub]  <- Inputのalias名
```
設定したQueryを[Save]後、Stream Analytics Jobを開始するとデータの受け渡しが始まります。

##Cosmos DBでデータの確認
念のため、Cosmos DBのData Explorerから、DatabaseとCollectionを選択すると、格納されたデータを確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/e01a1075-170f-9a9b-e8a1-44852af3de36.png)

#おまけ
Stream Analytics Jobには、Functionsという機能があります。これは、InputデータをJavascript言語で加工することができます。
例えば、加速度計のX,Y,Zの値を元に加速度の値ACCをACC=√(X2+Y2+Z2)という式で求めて、その結果をDBに保存したい場合などに使えます。
Javascript UDFをAddし、下記のような関数を定義すれば

```acc.js
function acc(x, y, z) {
    return Math.pow((Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)), 0.5);
}
```
先程のQuery文で、下記のようにacc関数を呼び出すことができます。

```
SELECT
    *,
    udf.acc(x,y,z)
INTO
    [OutputToCosmosDB]　<- Outputのalias名
FROM
    [InputFromIotHub]  <- Inputのalias名
```
お試しください。

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