LoRaWANの下り通信

お待たせしました。
LoRaWANの下り通信ができるようになりました(今更か)。


手順:デバイス側
1.ライブラリをアップデートする
  EEAB-P1というライブラリフォルダを右クリックし、メニューの「アップデート」をクリックしてください。

2.LoRa送信メソッドの変更
 これまで、sendLoRaString()メソッドで送信していた部分を、sendLoRaStringAndReceiveResponse()というセンスの無い名前のメソッドに差し替えます。

    int sendLoRaStringAndReceiveResponse(char res[], const char * format, ...);

resには、下り通信で受信できたデータが16進数文字列で格納されます。char型の配列を指定してください。(ヌル文字を含めて最大23バイトのデータが格納される可能性があります)
返り値は、送信に成功した場合は0が、それ以外の場合は負の値となります。送信に成功した際に、SORACOMのサーバーに下りのデータがセットされていれば、データを受信します(注1)。

サンプルコードは下記のようになります。
char res[23];
int ret;

ret = board.sendLoRaStringAndReceiveResponse(res, "hello %d", i++);
if (0 <= ret) {
        board.debug("res=%s\r\n", res);
} else {
        board.debug("ret=%d\r\n", ret);
 }

手順:サーバー側
基本は、SORACOM APIリファレンスを参照してください。
https://dev.soracom.io/jp/docs/api/#!/LoraDevice/sendDataToLoraDevice

API Keyなどをヘッダに設定したHTTP POSTメソッドで所定のURLを叩くと、サーバーに下りのデータがセットされます。

URLは、下記のようなフォーマットです。
https://api.soracom.io/v1/lora_devices/{device_id}/data
device_idには、LoRaモジュールに記載されているdeveuiを指定してください。

enebularで上記APIを叩くサンプルフローを用意しましたので、下記のJSONをコピーして、Importしてください。device_id, API Key, Tokenは別途指定する必要があります。
[{"id":"edd5c7b3.aede48","type":"inject","z":"4d8aff0c.38b3f","name":"","topic":"","payload":"","payloadType":"date","repeat":"30","crontab":"","once":false,"x":213.10000610351562,"y":141.60000610351562,"wires":[["36b51297.9b383e"]]},{"id":"36b51297.9b383e","type":"function","z":"4d8aff0c.38b3f","name":"","func":"msg.headers = {\n    'Content-Type': 'application/json',\n    'Accept': 'application/json',\n    'X-Soracom-API-Key': '',\n    'X-Soracom-Token': ''\n};\nmsg.payload = {\"data\": \"303132\"};\nreturn msg;","outputs":1,"noerr":0,"x":389.10003662109375,"y":192.8000030517578,"wires":[["62fa19b8.6d2018"]]},{"id":"62fa19b8.6d2018","type":"http request","z":"4d8aff0c.38b3f","name":"sendDataToLoraDevice","method":"POST","ret":"txt","url":"https://api.soracom.io/v1/lora_devices/000b78fffe050ccc/data","x":595.1000366210938,"y":231.60000610351562,"wires":[["90d708b3.0059a8"]]},{"id":"90d708b3.0059a8","type":"debug","z":"4d8aff0c.38b3f","name":"","active":true,"console":"false","complete":"true","x":811.1000709533691,"y":271.00000762939453,"wires":[]}]

注意事項
1.サーバーからデバイスに対してデータを送信するタイミングは、デバイスからのデータを受信したタイミングです
2.サーバーにセットしたデータは、一度サーバーからデバイスに対して送信されたら、サーバーのキューから取り除かれます。(キューといっても一つだけです。)
3.サーバーからデバイスに対して送信されたデータが、デバイスに届く保証はありません
4.サーバーにセットしたデータが送信された(キューから取り除かれた)ことを確認するAPIはありません

サーバーにセットしたデータが、デバイスに届く保証はまったくありませんので、サーバーにデータをセットするAPIは繰り返し叩いておくなど、工夫が必要となります。

コメント

このブログの人気の投稿

遅ればせながら・・・第2回のレポート前編

enebuler X MotionBoard による、IoT リアルタイムモニタリング