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