Alibaba CloudへSIGFOXでデータ転送



#SIGFOXとは
少なくとも３つの意味がありそう。

## 1. 無線通信の規格として
日本ではunlicensedな周波数を利用する。unlicensedでわかりやすい例はwifi。誰でもAPを立ち上げて電波を利用できる（技適とは別の話。電波を出す機器はもちろん要技適）。逆にlicensedの例は携帯通信事業者のLTEサービスで、各社に特定の周波数が割り当てられ、その通信事業者はその周波数を独占的に使うことができる。

## 2. 無線ネットワークサービスとして
公衆LPWA(Low Power Wide Area)のサービスとしてのSIGFOXがある。事業者が基地局(WiFiで言うところのAP)を建ててエリアを作る。日本では京セラコミュニケーションシステムが事業者。ユーザは端末があればサービスを利用できる。他の公衆LPWAには例えばLTE NB-IoT/Cat M1があり、licensedである点でSigfoxとは異なる。

## 3. 企業名として
上記1,2を束ねているのがフランスのSigfox社。

#特徴
##長所
- シンプルな規格のためデバイスが安価(vs NB-IoT)
- シンプルな規格のため低消費電力(vs NB-IoT)
- 国際ローミング可能

水色の部分がカバレッジ。ヨーロッパ、日本、台湾が先行。
https://www.sigfox.com/en/coverage
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/113f42a0-f72a-05f6-a72d-c9b0ad53856c.png)


##短所
- 最大の経済圏の米中がまだ弱い
- uplinkで最大140回/日、	downlink最大4回／日、一度の通信で12byteまでなどの制約
- 国ごとに使える周波数(RC:Radio Configurations )が違う。日本は日本のみが利用するRC3という920Mhz帯を使った周波数が割り当てられていて、さらに技適制度の影響もあって他の国で使えるデバイスが日本では使えない場合も多い。

##プラットフォーム
非TCP/IPだが、"backend"というクラウドプラットフォームも提供していて、SIGFOXデバイスから受けた情報をAPIを使ってインターネット越しにシステム連携可能。今日はSigfoxのデバイスからの情報をwebhookでAlibaba Cloudへ送信してみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/573a7de5-bcff-818b-fde4-431b599aa0b1.png)


##想定される使いかた
オンライン検針が典型的かな？

- リアルタイム性が不要
- 原則アップリンクのデータ送信のみ
- 消費電力が少なく電池で長時間動く

#don't think just do it
基本的に読んでも頭に入ってこない。まず触ってみる。

##モジュール
Sigfox Breakout board BRKWS01 RC3（5,100円）
https://www.switch-science.com/catalog/5373/

3.3VのUARTのpinが出ているのでそこからATコマンドで弄れる。USBケーブル、USB-UART、ジャンパーワイヤーなどは付属せず。ちょっと割高な気がしたけど**１年間SIGFOXのネットワークが無料で使える**ということなので納得感あり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/e9eefc41-7f99-b740-d7f1-20831b77f18c.png)

##ATコマンド
シンプルだ。セルラー系の規格のSoCのような事前準備コマンドが不要。いきなりデータを送れる。
`AT&SF=[送るデータ/16進数/最大12byte]`

慣れれば問題ないけど以下、最初焦った点。

- 大文字しか受け付けない。atはNG。ATはOK。
- エコーバックをオンにできない。ATEぐらいは実装してほしかった。

## sigfox portal
詳細は割愛するけど、sigfoxのIDをこのポータルに登録すると先ほどのATコマンドで送ったデータをここで処理できるようになる。ただ、細かいデータ処理は難しそうなのでクラウドやDCへデータを転送するのが基本的な使いかたなのかな？

https://backend.sigfox.com/welcome/news
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/7c2567de-f043-dd64-37d8-d2d6ef87a6b7.png)


### Alibaba Cloudへデータを転送する設定
該当する**DEVICE TYPE**のデータを受信したときの**CALLBACKS**の設定を記述することでデータを転送することができる。以下はAlibaba CloudのFunction Compute(AWSで言うところのLambda)のHTTPトリガーのURLへデータをポストする設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/39efc7f4-3e2b-6d45-8500-186c23869d92.png)

Bodyはモジュールから届いたデータのほかに、おおよその緯度経度、受信した基地局のID、電波の状態なども送信できる。{}で囲まれた文字列が変数で、たとえば`{device}`は実際のデバイスIDに置き換えられる。全部送るならbodyはこんな感じ。

```json
{
  "device":"{device}",
  "time":"{time}",
  "duplicate":"{duplicate}",
  "snr":"{snr}",
  "station":"{station}",
  "data":"{data}",
  "avgSnr":"{avgSnr}",
  "lat":"{lat}",
  "lng":"{lng}",
  "rssi":"{rssi}",
  "seqNumber":"{seqNumber}"
}
```

#Alibaba Cloud側の設定
詳細は割愛。
##function Computeのコード
HTTPトリガーで受けたBodyをそのままLogへ出力するだけのコード

```python
# -*- coding: utf-8 -*-

import logging

def handler(environ, start_response):
    logger = logging.getLogger() 
    try:
      request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):
      request_body_size = 0
    request_body = environ['wsgi.input'].read(request_body_size)
    logger.info(request_body)

    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return "api gateway"
``` 

ATコマンドで1126を送ってみた。無事にとどくようだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/94b156a4-9446-ba46-c407-96774df9a9fa.png)

#その他
##基地局のカバレッジ
ポータルからデータを送信したときの場所を確認できる。たぶんこの青い円の真ん中に基地局があるんだろうけど、ほんとに飛ぶんだね、とあらためて思った。半径20Kmぐらいはあるかな。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/282b166e-eb97-915b-c7b2-8be2f9eeed4e.png)
##最後に
これは個人的活動であって所属するどんな組織の考え方も反映していません。