1#!/usr/bin/env python 2# BlueKitchen GmbH (c) 2014 3 4# primitive dump for PacketLogger format 5 6# APPLE PacketLogger 7# typedef struct { 8# uint32_t len; 9# uint32_t ts_sec; 10# uint32_t ts_usec; 11# uint8_t type; // 0xfc for note 12# } 13 14import re 15import sys 16import time 17import datetime 18 19packet_types = [ "CMD =>", "EVT <=", "ACL =>", "ACL <="] 20 21def read_net_32(f): 22 a = f.read(1) 23 if a == '': 24 return -1 25 b = f.read(1) 26 if b == '': 27 return -1 28 c = f.read(1) 29 if c == '': 30 return -1 31 d = f.read(1) 32 if d == '': 33 return -1 34 return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d) 35 36def as_hex(data): 37 str_list = [] 38 for byte in data: 39 str_list.append("{0:02x} ".format(ord(byte))) 40 return ''.join(str_list) 41 42if len(sys.argv) == 1: 43 print 'Dump PacketLogger file' 44 print 'Copyright 2014, BlueKitchen GmbH' 45 print '' 46 print 'Usage: ', sys.argv[0], 'hci_dump.pklg' 47 exit(0) 48 49infile = sys.argv[1] 50 51with open (infile, 'rb') as fin: 52 pos = 0 53 try: 54 while True: 55 len = read_net_32(fin) 56 if len < 0: 57 break 58 ts_sec = read_net_32(fin) 59 ts_usec = read_net_32(fin) 60 type = ord(fin.read(1)) 61 packet_len = len - 9; 62 if (packet_len > 66000): 63 print ("Error parsing pklg at offset %u (%x)." % (pos, pos)) 64 break 65 packet = fin.read(packet_len) 66 pos = pos + 4 + len 67 time = "[%s.%03u]" % (datetime.datetime.fromtimestamp(ts_sec).strftime("%Y-%m-%d %H:%M:%S"), ts_usec / 1000) 68 if type == 0xfc: 69 print time, "LOG", packet 70 continue 71 if type <= 0x03: 72 print time, packet_types[type], as_hex(packet) 73 except TypeError: 74 print ("Error parsing pklg at offset %u (%x)." % (pos, pos)) 75 76