xref: /btstack/tool/dump_tlv.py (revision a8d51f092f1b660d0f6921369ad2bc3f9368296c)
1#!/usr/bin/env python3
2# BlueKitchen GmbH (c) 2017
3
4# primitive dump for .tlv format
5
6import sys
7
8def read_net_32(f):
9    a = f.read(1)
10    if a == '':
11    	return -1
12    b = f.read(1)
13    if b == '':
14    	return -1
15    c = f.read(1)
16    if c == '':
17    	return -1
18    d = f.read(1)
19    if d == '':
20    	return -1
21    return ord(a) << 24 | ord(b) << 16 | ord(c) << 8 | ord(d)
22
23def as_hex(data):
24	str_list = []
25	for byte in data:
26	    str_list.append("{0:02x} ".format(byte))
27	return ''.join(str_list)
28
29if len(sys.argv) == 1:
30	print ('Dump TLV file')
31	print ('Copyright 2017, BlueKitchen GmbH')
32	print ('')
33	print ('Usage: ', sys.argv[0], 'file.tlv')
34	exit(0)
35
36infile = sys.argv[1]
37
38with open (infile, 'rb') as fin:
39	pos = 0
40	try:
41		# check header
42		magic_0 = read_net_32(fin)
43		magic_1 = read_net_32(fin)
44		if magic_0 != 0x42547374 or magic_1 != 0x61636b00:
45			print("%x" % magic_0)
46			print("%x" % magic_1)
47			print ("Not a valid BTstack .tlv file\n")
48			exit(0)
49		pos += 8
50		print("Valid .tlv file")
51		while True:
52			tag     = read_net_32(fin)
53			if tag < 0:
54				break
55			pos += 4
56			len     = read_net_32(fin)
57			pos += 4
58			packet  = fin.read(len)
59			pos += len
60			print('%04x: ' % tag + as_hex(packet))
61		print("Done")
62
63	except TypeError:
64		print ("Error parsing tlv at offset %u (%x)." % (pos, pos))
65