#!/usr/bin/perl -w use strict; use MIME::Base32 qw( RFC ); my @beacons; if(!$ARGV[0] || $ARGV[0] eq "-") { @beacons = ; } else { open(my $fh, "<", $ARGV[0]) or die "Unable to open file " . $ARGV[0]; @beacons = <$fh>; close($fh) } foreach(@beacons) { my $beacon = $_; $beacon =~ s/\s*$//g; $beacon =~ s/^\s*//g; if($beacon =~ /([^ ]+) ([A-Z2-7]{3}) ([A-Z2-7])/) { my $preamble = $1; my $cnt = $2; my $checksum = $3; my $cntval = unpack("n", MIME::Base32::decode($cnt . "=")) >> 1; my $csval_recv = unpack("C", MIME::Base32::decode($checksum . "=")) >> 3; my $csval_calc = ord('N') - ord(' '); my @values = unpack("C*", $preamble); @values = (@values, unpack("C*", $cnt)); foreach(@values) { $csval_calc ^= $_ - ord(' '); } $csval_calc = ($csval_calc & 0x1F) ^ (($csval_calc & 0x20) >> 5); print $beacon . " -> cnt: " . $cntval; if($csval_calc != $csval_recv) { print " checksom wrong! (" . sprintf("%02X", $csval_recv) . " vs. " . sprintf("%02X", $csval_calc) . ")\n"; } else { print " checksom ok! (" . sprintf("%02X", $csval_recv) . ")\n"; } } else { print $beacon . " -> Beacon format error!\n"; } }