Raspberry Pi で Sigfox 通信

# Sigfox とは？
IoT 用途の LPWA(Low Power Wide Area network）の一つで、とにかく通信料金が安く、多数の IoT 機器に使用しても運用可能コストで使用できます。
詳しくは、Sigfox の 日本でのオペレーターを務められている KCCS 様の Web サイトをご覧ください。

[KCCS Sigfoxとは](https://www.kccs-iot.jp/service/ "KCCS Sigfox")


# 本記事の特徴
Sigfox 通信のサンプルプログラムをググってもらうと、Arduino Uno に Sigfox Shield を接続したサンプルがたくさん出てきます。

下記リンクは、KCCS 様の Web サイトで、筆者の日比さんは、Qiita にも Sigfox 関連記事を多数投稿されています。
[KCCS Sigfox メッセージ送信方法 - Sigfox Shield for Arduino](https://www.kccs-iot.jp/20200420-technical/ "KCCS")

この記事は、非常に素晴らしいサンプルで、Arduino にセンサーを付けて Sigfox 経由で IoT データをクラウドに上げたいというご要望であれば、これだけで十分な参考資料です。

本記事は、Arduino ではなく、もう少しリッチなシステムでも Sigfox を試してみたいという方向けの資料となっており、

* Raspberry Pi
* Python

でのSigfox 通信のサンプル記事となっております。


# 今回の機材・構成・環境
## マイコンボード
Raspberry Pi をマイコンボードと呼んでよいかは甚だ疑問ですが、ベースとなるコントローラーは、Raspberry Pi 4 です。（以降 RPi4）
詳細には、Raspberry Pi 4 Model B 8GB RAM です。

Raspberry Pi 自体は、Qiita でも多くの人が紹介されているので、本稿での説明は割愛いたします。

## Sigfox モジュール
Sigfox モジュールは、Sigfox Breakout board BRKWS01 RC3 を使用します。
こちらは、スイッチサイエンスの Web サイトから購入可能で、執筆時点（2021/06/15）では、5,194円/pcs となっています。
[Sigfox Breakout board BRKWS01 RC3](https://www.switch-science.com/catalog/5373/ "BRKWS01 RC3")

実際に Sigfox を使用して IoT システムを運用する場合、日本では KCCS と回線契約を結ぶ必要がありますが、本製品は "Development Kit" という位置づけで、Activation から１年間無料で通信できる「無償回線付き」となっていますので、購入して手に入れたら即日実験開始できます。

こちらも、KCCS - 日比さんが、紹介記事を掲載されております。

[Sigfox Breakout Board (BRKWS01)の利用方法](https://www.kccs-iot.jp/20181226-technical/ "BRKWS01 RC3")

# RPi4 と Sigfox モジュールの通信
RPi4 と Sigfox は、UART を使用したシリアル通信で制御を行います。
RPi4 側からシリアル通信で制御コマンドを送ることで、Sigfox モジュールに LPWAの通信を行わせたり、モジュールのHWの設定を変更したりします。

## RPi4 の UART 
RPi4 では以下の UART が使用できます。

* UART1 Tx(GPIO14) Rx(GPIO15)
* UART2 Tx(GPIO0) Rx(GPIO1)
* UART3 Rx(GPIO5)
* UART4 Tx(GPIO8) Rx(GPIO9)
* UART5 Tx(GPIO12) Rx(GPIO13)

これは、RPi4 より前の型（Raspberry Pi3 とか）では異なるようなので、使用する Raspberry Pi の型に沿って適宜読み替えてください。

今回は、UART4 を使用します。
そのための設定として、/boot/config.txt を以下のように変更してリブートします。

```
[pi4] 
# Enable DRM VC4 V3D driver on top of the dispmanx display stack 
dtoverlay=vc4-fkms-v3d 
max_framebuffers=2 
dtoverlay=uart4,ctsrts
```

## Sigfox モジュールとRPi4 の接続
UART4 は、Tx(GPIO8) Rx(GPIO9) にアサインされています。

![RPi4_GPIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/cf9bf6ad-6897-3e98-3b3c-da4974893256.png)

この二つおよび 3V3 power/Ground と、Sigfox モジュール側の 3.3v power, Ground を接続します。

[GPIO www.raspberrypi.org](https://www.raspberrypi.org/documentation/usage/gpio/　"GPIO")

![Sigfox-RPi4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/b8eb4b11-a839-e50d-589b-c38e5170232a.jpeg)


## Sigfox モジュールとのシリアル通信
```
import serial

port = '/dev/ttyAMA1'

s = serial.Serial(port, 9600, timeout=10)
# Device ID を取得する AT コマンドを送付
s.write(b'AT$I=10\r');

# Sigfox Module からのレスポンスを読み込む
resp = s.readline()

print('Device ID : {}'.format(resp))
```
RPi4 から 'AT$I=10' というコマンドを Sigfox モジュールへシリアル送信すると、その Sigfox モジュールの Sigfox ID が返されます。

```
Device ID : b'007XXXX6\r\n'
```
この時点では、RPi4 と Sigfox モジュール間だけの 通信で、Sigfox 通信網を使った通信は発生しません。
ここで、レスポンスとして、Sigfox ID が取得できるのであれば、RPi4 と Sigfox モジュール間の接続は確立できていることが確認できます。

ちなみに、この Sigfox モジュールは、購入後自力ではんだ付けが必要になります。
私のはんだ付けスキル不足により、最初に接続したときは Sigfox モジュールからの応答がありませんでしたが、再度、はんだを溶かしたりして接触を浴したり（その辺もよくわかってないですが）した結果、正常に動作するようになりました。


## Sigfox 通信の実行
接続済の Sigfox モジュール から実際にデータを送信するためには、そのモジュールのアクティベーションの作業が必要となります。

こちらは、先ほどの KCCS - 日比さんの記事にも説明がありますので、そちらを参考に Activation してください。

[Sigfox Devkit（開発キット）を1年間の無償回線で利用する] (https://www.kccs-iot.jp/20181119-technical/ "Sigfox Activation")

デバイスが Activation されると、Sigfox Backend の方にこんな形で現れます。
![Screen_shot_01_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/aa9be14d-6948-7f07-2e5c-282b900588a4.png)

Device Type と Device Name は自動で付与されますので、後で自由に変更してください。

この状態で、RPi4 から メッセージ送信の AT コマンドを Sigfox モジュールに送信してみます。

```
import serial

port = '/dev/ttyAMA1'
s = serial.Serial(port, 9600, timeout=10)

# 送信するメッセージを指定（12byte(注))
message = '0123456789abcdef01234567'

# AT コマンドにコンバート
at_command = 'AT$SF={0}\r'.format(message)
# AT コマンドを Sigfox モジュールへ送信
s.write(at_command.encode())

# Sigfox モジュールから Sigfox ネットワークにデータを送信完了するまで待つ
while True:
    resp = s.readline()
    if resp != b'':
        break

print('Response: {}'.format(resp))

```
(注) Sigfox で送信可能なデータ量は、12 Byte です。ですが、ATコマンドで送るデータは、数値を16進数で文字列に変換したデータなので、python 上は 24 Byte になります。


送信が完了すると

```
Response: b'OK\r\n'
```
というメッセージが返ってきます。

Sigfox Backend で、このデバイスの受信メッセージを見ると Sigfox Cloud 上でメッセージが受信できていることが確認できます。

![Screen_shot_02_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/716263/02da094c-a8b6-b8e6-02ed-4cf5d115c728.png)