Sigfoxで送信したデータをGoogle Spreadsheet上のGoogle Apps Scriptで受信する設定手順をメモ書きとして残します。
受信プログラム(Google Apps Script)
Google Drive上にSpreadsheetを新規作成します。Spreadsheetを開き、「ツール」→「スクリプトエディタ」で以下のようなコードを書きます。
var sheet;
function readData(str) {
var pos = str.indexOf('\"data\"');
var data = str.substr(pos+10, 12);
var accX = parseInt(data.substr(0, 4), 16);
var accY = parseInt(data.substr(4, 4), 16);
var accZ = parseInt(data.substr(8, 4), 16);
sheet.appendRow([new Date(), "ACC", accX, accY, accZ ]);
}
function doPost(ee) {
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
var eeStr = decodeURI(ee.postData.getDataAsString());
readData(eeStr);
}
このコード例のうち、受信データの解析処理は後述するSigfox側の設定に依存します。この例は3つの数値が送信されてくる例になっています。
次に「デプロイ」→「新しいデプロイ」から「ウェブアプリ」を新規追加します。このとき「アクセスできるユーザー」を「全員」とします。こうしておかないと認証処理をしないとアクセスできなくなってしまいます。またこのときにURLが発行されるのでメモ(Copy)しておいてください。
また一度目の起動時にアクセス許可の設定が発生するので、手動で「実行」して、アクセス許可設定をしましょう。これをしておかないと見た目上のエラーなしで動作しないという面倒な状態になります。
マイコンとSigfoxデバイスの接続
ここで用いたSigfoxデバイスはマイコンとシリアル接続するようになっています。
ESP32と接続する場合にはIO16をTXに、IO17をRXに接続しました。
STM32F103C8ではPA03をTXに、PA02をRXに接続しました。
いずれもそれ以外に電源(3.3V)とGNDの接続が必要です。
SigfoxデバイスのIDとPACを調べる
次の手順の登録をするためには手元にあるデバイスのIDとPACが必要です。IDとPACはArduinoからであれば、以下のようなコードを使って調べることができます。
#include <Arduino.h>
void setup() {
Serial.begin(115200);
Serial2.begin(9600);
Serial.println("ID & PAC");
Serial2.println("AT$I=10");
Serial.print(Serial2.readString());
Serial2.println("AT$I=11");
Serial.print(Serial2.readString());
}
Sigfoxデバイスの登録
SigfoxデバイスはSigfoxサイトで登録しないと使えません。販売元のページ等に説明があると思います。
私はSigfox Breakout board BRKWS01を使用しました。他にM5Stack用Sigfoxモジュールも使用していますが手順は同じです。
デバイスの登録用ページへアクセスします。ここで「Activate my DevKit」をクリックし、画面の指示に従って入力します。2回目以降はアカウントでログインしてから追加した方がよいようです。
Callbackの設定
Sigfoxではデバイスから送信されたデータはSigfox社のサーバーへ届くだけです。このままでは再利用できないので、データを転送するなどの措置が必要です。ここではカスタム・コールバック機能を使用します。
Sigfox社のサイトにアクセスします。「Device」から設定したいデバイスをクリックします。
次の画面の左端から「CALLBACKS」をクリックし、「Custom Callbacks」を選びます。
次の画面が厄介?で画面の右端に「New」とあるのでこれをクリックします。私はこれに気づくのに丸1日かかりました…。修正時に「Edit」からアクセスします。
「Url pattern」にGoogle Apps Scriptのデプロイ時に発行されたURLをPasteします。
「Body」はここでは以下のように設定することにします。
{
"device":"{device}",
"time":{time},
"data":"{data}",
}
最後に「OK」で登録します。
3つのSigfoxデバイスで試行した範囲でしかないのではっきりしませんが、登録直後には機能しない(ことがある)ので、30分程度は待ってみるとよいかもしれません。
データ送信
データ送信はArduinoの場合、以下のようなコードで可能です。この例ではx, y, zに送信したいデータが入っている状態を想定しています。
sprintf(strData, "%04X%04X%04X", (unsigned short)x, (unsigned short)y, (unsigned short)z);
Serial2.print("AT$SF=");
Serial2.println(strData);
送信のタイムアウトはデバイスの仕様書等から2000msと読み取りました。このため、送信後2秒間以上は通電した状態を維持しないとならないようです。通常のプログラムでは気にするところではないかもしれませんが、省電力ためにDeep SleepやShutdownする場合にはこの点は重要です。実体験からすると最後の送信から3~4秒は待たないと送信できないことがあるようです。