Sigfox Callback - Custom Payload Config 応用

技術情報

Sigfox Callbackのcustom payload configになじみのない方は、

LPWAを使ったアプリケーションを開発する際は、如何にデータサイズを抑えるかが、重要なポイントになっています。例えば次のようなデータを送りたいとします。

データ名内容サイズデータ例
Speed 速度情報 8bits(1Byte) 0km/h~255km/h
Direction 進行方向 4bits 北、北東、東、南東...北西(8パターン)
Status モノの状態コード 4bits 0~15で表すコード

これをSigfoxのペイロードに乗せようとした場合、ひとつの方法は、Speed、Direction、Statusで各1バイトずつ使う方法もあります。が、4bitsで十分なデータに8bits(1byte)も使いたくないということがあると思います。
そのような場合、

20191211-technical-01.jpg

となるペイロード構成をとることになります。
では、このペイロードをSigfoxのCustom Payload Configで変数定義したい場合、どうなるでしょうか?

間違ったやり方

まずは、間違った定義をお見せします。
Speed::uint:8 Direction::uint:4 Status::uint:4
このように定義すれば、Body内(例えばJSON構文)でcustomData#Speed, customData#Direction, customData#Statusといった変数が使えるようになるから、それでいいと思うかもしれません。

何が起きるか?

このような定義をした場合、何が起きるのかを説明します。

20191211-technical-02.jpg

まずは、
[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]です。

20191211-technical-03.jpg

[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画面で確認することができます。

20191211-technical-04.jpg

Payload displayは、表示だけですので、システムに影響を及ぼすこともないかと思いますので、一度、ご自身の環境で試してみてください。