経緯
WioLTE M1/NBを使っている人が思うこと、LTE-Mの通信料の高さに驚いている人も居るとおもいます。
なんとかパケット使用料を減らそうと、バイナリでデータをUDP等で送る訳なのですが、位置情報をどのようにバイナリデータにすればいいんだ?と悩んで居る方がきっと居ると思うので、サンプルを作ってみました。
バイナリパーサーの設定
SORACOMコンソールで、下記のようにバイナリパーサーを設定したとして、floatの変数に位置情報が入っているとして、UDPパケットで送るデータを作成し、実際に、SORACOMに送信した際にサーバに届いた結果も合わせて公開します。
バイナリパーサフォーマット作成に役立つ、Playground
SORACOM Blogで『新機能: バイナリパーサーを簡単にお試しいただけるようになりました』が出ていましたので、使ってみました。
(https://blog.soracom.jp/blog/2019/06/21/binary-parser-playground/)
ここからがコード
データ作成のみを掲載しています。
sample.ide
// SORACOMバイナリパーサーを使ってGPSデータを送るとしたらのサンプル
// Programed by kazuyuki Eguchi
// パーサーのフォーマット
// lng::float:32 lat::float:32
#include <WioCellLibforArduino.h>
void setup() {
SerialUSB.begin(115200);
delay(4000);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------");
float lng = 139.725328;
float lat = 35.62754;
// double型の大きさを調べて見よう
SerialUSB.printf("sizeof(lng)=%d",sizeof(lng));
SerialUSB.println("");
int lng_i = *( ( int* )&lng );
int lat_i = *( ( int* )&lat );
SerialUSB.printf( "lng=%f ( %08x )",lng,lng_i);
SerialUSB.println("");
SerialUSB.printf( "lat=%f ( %08x )",lat,lat_i);
SerialUSB.println("");
// 送信するデータを作ってみよう
char data[8];
data[0] = (lng_i >> 24) & 0xff;
data[1] = (lng_i >> 16) & 0xff;
data[2] = (lng_i >> 8) & 0xff;
data[3] = lng_i & 0xff;
data[4] = (lat_i >> 24) & 0xff;
data[5] = (lat_i >> 16) & 0xff;
data[6] = (lat_i >> 8) & 0xff;
data[7] = lat_i & 0xff;
// 人間がデータを確認するために16進数の文字列で表現しているよ(Webでの確認するため)
SerialUSB.printf("data=%02x%02x%02x%02x%02x%02x%02x%02x",data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]);
SerialUSB.println("");
}
void loop() {
}
サーバで受信した結果
{"lng":139.72532653808594,"lat":35.627540588378906}
となりました!
以上、ご参考までに