In [2]:
# This code can be used for checking duplicated ids based on badge mac IDs
# Since badges use CRC16 to calcualte a default ID, these duplicates are possible
In [3]:
import crc16
import collections
import csv
import numpy as np
In [4]:
# Initial value for CRC16-CCITT is 0xffff
# See: https://github.com/willemwouters/NRF51/blob/master/sdk_6_1/nrf51822/Source/app_common/crc16.c
def macArrayToCRC16(macArray):
"""
macArray
"""
tempArray = macArray[:]
tempArray.reverse()
key = struct.pack('%sB' % len(tempArray), *tempArray)
crc = crc16.crc16xmodem(key,0xFFFF)
return crc
def macStringToCRC16(macStr):
# convert hex to bytes and reverse
macstr = macStr.replace(':', '').decode('hex')[::-1]
crc = crc16.crc16xmodem(macstr,0xFFFF)
return crc
# basic tests
print(macStringToCRC16('CF:56:3F:E5:36:3F')) # 30837
print(macStringToCRC16('EF:21:18:08:F7:F6')) # 7384
print(macStringToCRC16('D2:92:7B:01:1A:A5')) # 9526
In [5]:
macs_file = 'macs.csv'
with open(macs_file, 'rb') as f:
reader = csv.reader(f)
badge_macs = list(x[0] for x in reader)
In [6]:
mac_and_ID = [{'mac:':x,'id':macStringToCRC16(x)} for x in badge_macs]
In [7]:
ids = [d['id'] for d in mac_and_ID]
print (len(ids))
In [8]:
counter=collections.Counter(ids)
print(len(counter))
In [9]:
unique_ids = [x for x in counter]
duplicate_ids = []
for mid in unique_ids:
if counter[mid] > 1:
print("Duplicate: {}".format(mid))
duplicate_ids.append(mid)
print(duplicate_ids)
In [10]:
# print duplicates
for mid in duplicate_ids:
for x in mac_and_ID:
if x['id'] == mid: print x