SORACOM バイナリパーサーで、位置情報送ってみよう!


経緯

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}

となりました!

以上、ご参考までに