Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ZigBeeパケットのチェックサムを計算するRubyスクリプト

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パケットを生成するクラスを渡してあげてもいいでしょう。