Sigfox Callbackのcustom payload configになじみのない方は、
- Sigfox Callback機能
-
Custom Payload Config機能
を読んでください。
LPWAを使ったアプリケーションを開発する際は、如何にデータサイズを抑えるかが、重要なポイントになっています。例えば次のようなデータを送りたいとします。
では、このペイロードをSigfoxのCustom Payload Configで変数定義したい場合、どうなるでしょうか?
#間違ったやり方
まずは、間違った定義をお見せします。
Speed::uint:8 Direction::uint:4 Status::uint:4
このように定義すれば、Body内(例えばJSON構文)でcustomData#Speed, customData#Direction, customData#Statusといった変数が使えるようになるから、それでいいと思うかもしれません。
###何が起きるか?
このような定義をした場合、何が起きるのかを説明します。
まずは、
[1] Speed::uint:8
により、Speed情報は先頭から8ビットをuint型として読み取るため、問題ありません
[2] Direction::uint:4
により、次のバイトの先頭から4ビットをuint型として読み取るため、これも問題ないでしょう。
[3] 問題は、ここです。[2]でuintを使ったので、自動的に次のバイト(上図でいう"NEXT")までポインタが飛んでしまいます。
ですので、Status::uint:4
は、"NEXT"のところから4ビットを取ってきてしまいます。
#解決例
次のようにcustom payload configを定義してみましょう。
Speed::uint:8 Direction::uint:4 Status:1:uint:4::3
違いは、Statusのところです。2フィールド目(byte_index)に1が、そして6フィールド目(最後)に3がついています。
Status:1:uint:4::3
を見てみます。下図の[4][5]です。
[4] 2フィールド目(byte_index)を"1"にしたため、ペイロードの2バイト目にポインタが移ります。(0にしたら、1バイト目に移ります。byte_indexは0~9のいずれかが使えます)
[5] 最終フィールドを"3"とすることにより、4ビットシフトとなります。
Sigfoxのヘルプを見てみると
uint (unsigned integer) : parameters are the number of bits to include in the value, optionally the endianness for multi-bytes integers, and optionally the bit offset where to start the reading of the first byte. Default is big endian and 7 for the offset.
と書かれています。...optionally the bit offset where to start the reading of the first byte. Default is 7 for the offset.
ビットオフセットのデフォルトは7ということです。つまり、オフセットしたくない場合が7ということは、4ビットオフセットしたい場合は7-4=3でいいですね。
#試してみる
Custom payload configを試すだけであれば、わざわさ、Callbackを作成する必要もありません。
ご自身のデバイスのDeviceTypeを選択し、Edit画面にあるPayload displayに設定するだけで、デバイスのMessages画面で確認することができます。
Payload displayは、表示だけですので、システムに影響を及ぼすこともないかと思いますので、一度、ご自身の環境で試してみてください。