Zigbeeパケットのチェックサムはちょっとヤヤコシイです。
手順としては
- 接頭辞0x7eとパケット長2バイトの合計3バイトを削る
- 末尾1バイトも削る
- 残った物を一バイト毎に分けて足し合わせる
- 0xff - さきほどの結果
……これがチェックサムです。
死ぬほどヤヤコシイですね。
実際のところ
下記のスクリプトでは、16進数の文字列を1バイトごとに切り分け、チェックサムを出します。
アンダーバーは可視性向上のために入れました。
頭の2バイトと尻尾の一バイトは[3..-2]という範囲指定の際に消しておきます。
(0xff - ARGV[0].delete("_").scan(/\w{2}/)[3..-2].map(&:hex).inject(&:+).&(0x00ff)).to_s(16)
これは
$ ruby checksum.rb 7E_000A_01_01_5001_00_48656C6C6F_B8 "b8"
てな感じで使えます。
余力があれば、ZigBeeパケットを生成するクラスを渡してあげてもいいでしょう。