1#!/usr/bin/env python3 2 3import struct 4import math 5import sys, os 6import pickle 7 8devices = dict() 9delays = dict() 10scan_start_timestamp = 0 11scan_nr = -1 12 13def delta(s): 14 rs = list() 15 for i in range(len(s)-1): 16 rs.append(s[i+1] - s[i]) 17 return rs 18 19def normalize(s): 20 return map(lambda x: (x - s[0]), s) 21 22def average(s): 23 if len(s) == 0: return 0 24 return sum(s) * 1.0 / len(s) 25 26def stder(s, mean): 27 if len(s) == 0: return 0 28 variance = map(lambda x: (x - mean)**2, s) 29 return math.sqrt(average(variance)) 30 31 32def reset_timestamp(packet_type, packet, time_sec): 33 global scan_start_timestamp, scan_nr 34 if packet_type != 0x00 or packet[0] != 0x0C or packet[1] != 0x20: 35 return 36 if (int(packet[3])): 37 scan_start_timestamp = time_sec 38 scan_nr = scan_nr + 1 39 print("Scanning started at %u"%scan_start_timestamp) 40 41 else: 42 print("Scanning stopped") 43 44def read_scan(packet_type, packet, time_sec): 45 if packet_type != 0x01 or packet[0] != 0x3E or packet[2] != 0x02: 46 return 47 48 if packet[3] != 1: 49 print("More then one report") 50 return 51 52 (event_type, addr_type, addr, data_len) = struct.unpack('<BB6sB', packet[4:13]) 53 if event_type == 0x04: 54 return 55 56 unpack_format = '<%usB' % data_len 57 (data, rssi) = struct.unpack(unpack_format,packet[13:]) 58 59 bt_addr = bytearray(addr) 60 bt_addr_str = '' 61 for b in bt_addr: 62 bt_addr_str = '%02x:%s' % (b, bt_addr_str) 63 64 if scan_start_timestamp <= 0: 65 return 66 67 normalized_timestamp = time_sec - scan_start_timestamp 68 if not bt_addr_str in devices.keys(): 69 print("new device at %u %u" % (time_sec, scan_start_timestamp)) 70 devices[bt_addr_str] = list() 71 delays[bt_addr_str] = list() 72 73 devices[bt_addr_str].append(normalized_timestamp) 74 if (len(delays[bt_addr_str]) == 0 or len(delays[bt_addr_str]) < scan_nr): 75 delays[bt_addr_str].append(normalized_timestamp) 76 77 #print("%03u, %08u, %08u, 0x%02X, adv: %s"%(length, time_sec, time_usec, packet_type, bt_addr_str)) 78 return 79 80def process_pklg(exp_name, sensor_name, scanning_type, pklg_file_name): 81 print("Opening %s" % pklg_file_name) 82 with open(pklg_file_name, "rb") as f: 83 while True: 84 try: 85 (length, time_sec, time_usec, packet_type) = struct.unpack('>IIIB',f.read(13)) 86 except: 87 break 88 packet = bytearray(f.read(length - 9)) 89 reset_timestamp(packet_type, packet, time_sec) 90 read_scan(packet_type, packet, time_sec) 91 92 f.close(); 93 94 prefix = '../data/processed/' 95 for k in devices.keys(): 96 data_file_name = '' 97 if k == '5c:f3:70:60:7b:87:': #BCM 98 data_file_name = prefix + exp_name+'_'+scanning_type +'_mac.data' 99 if k == '00:1a:7d:00:86:7c:': #neo 100 data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'.data' 101 102 if k == '00:07:80:67:45:bc:': #xg 1 103 data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'1.data' 104 105 if k == '00:07:80:67:46:00:': #xg 2 106 data_file_name = prefix + exp_name+'_'+scanning_type +'_'+sensor_name+'2.data' 107 108 if not data_file_name: 109 continue 110 111 pickle.dump(devices[k], open(data_file_name, 'wb')) 112 mes_index = 0 113 # take the last measurement 114 for i in range(len(devices[k])-1): 115 if devices[k][i] > devices[k][i+1]: 116 mes_index = i+1 117 pickle.dump(devices[k][mes_index:len(devices[k])], open(data_file_name, 'wb')) 118 119def init(): 120 global devices, delays, scan_start_timestamp, scan_nr 121 devices = dict() 122 delays = dict() 123 scan_start_timestamp = 0 124 scan_nr = -1 125 126init() 127data_folder = "../data/processed" 128if not os.access(data_folder, os.F_OK): 129 os.mkdir(data_folder) 130 131prefix = '../data/pklg/' 132process_pklg('exp1','nio','continuous_mac', prefix+'BCM20702A0_nio_continuous_scanning.pklg') 133process_pklg('exp1','nio','continuous_rug', prefix+'RugGear_nio_continuous_scanning.pklg') 134 135init() 136process_pklg('exp1','nio','normal_rug', prefix+'RugGear_nio_normal_scanning.pklg') 137process_pklg('exp1','nio','normal_mac', prefix+'BCM20702A0_nio_normal_scanning.pklg') 138 139 140init() 141process_pklg('exp2','xg','continuous_mac', prefix+'BCM20702A0_xg_continuous_scanning.pklg') 142process_pklg('exp2','xg','continuous_rug', prefix+'RugGear_xg_continuous_scanning.pklg') 143 144init() 145process_pklg('exp2','xg','normal_rug', prefix+'RugGear_xg_normal_scanning.pklg') 146process_pklg('exp2','xg','normal_mac', prefix+'BCM20702A0_xg_normal_scanning.pklg') 147 148