Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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