xref: /btstack/tool/bluetooth_gatt.py (revision 66fd3432507fdb9cbd184cdd46ba6e8ebf96a67e)
10e0e9559SMatthias Ringwald#!/usr/bin/env python
20e0e9559SMatthias Ringwald#
30e0e9559SMatthias Ringwald# Scrape GATT UUIDs from Bluetooth SIG page
40e0e9559SMatthias Ringwald# Copyright 2016 BlueKitchen GmbH
50e0e9559SMatthias Ringwald#
60e0e9559SMatthias Ringwald
70e0e9559SMatthias Ringwaldfrom lxml import html
80e0e9559SMatthias Ringwaldimport datetime
90e0e9559SMatthias Ringwaldimport requests
100e0e9559SMatthias Ringwaldimport sys
110e0e9559SMatthias Ringwaldimport os
120e0e9559SMatthias Ringwald
130e0e9559SMatthias Ringwaldprogram_info = '''
140e0e9559SMatthias RingwaldBTstack GATT UUID Scraper for BTstack
150e0e9559SMatthias RingwaldCopyright 2016, BlueKitchen GmbH
160e0e9559SMatthias Ringwald'''
170e0e9559SMatthias Ringwald
180e0e9559SMatthias Ringwaldheader = '''
190e0e9559SMatthias Ringwald/**
200e0e9559SMatthias Ringwald * bluetooth_gatt.h generated from Bluetooth SIG website for BTstack
210e0e9559SMatthias Ringwald */
220e0e9559SMatthias Ringwald
230e0e9559SMatthias Ringwald#ifndef __BLUETOOTH_GATT_H
240e0e9559SMatthias Ringwald#define __BLUETOOTH_GATT_H
250e0e9559SMatthias Ringwald'''
260e0e9559SMatthias Ringwald
270e0e9559SMatthias Ringwaldpage_info = '''
280e0e9559SMatthias Ringwald/**
290e0e9559SMatthias Ringwald * Assigned numbers from {page}
300e0e9559SMatthias Ringwald */
310e0e9559SMatthias Ringwald'''
320e0e9559SMatthias Ringwald
330e0e9559SMatthias Ringwaldtrailer = '''
340e0e9559SMatthias Ringwald#endif
350e0e9559SMatthias Ringwald'''
360e0e9559SMatthias Ringwald
370e0e9559SMatthias Ringwalddef scrape_page(fout, url):
380e0e9559SMatthias Ringwald    print("Parsing %s" % url)
390e0e9559SMatthias Ringwald    fout.write(page_info.format(page=url))
400e0e9559SMatthias Ringwald    page = requests.get(url)
410e0e9559SMatthias Ringwald    tree = html.fromstring(page.content)
420e0e9559SMatthias Ringwald    # get all <tr> elements in <table id="gattTable">
430e0e9559SMatthias Ringwald    rows = tree.xpath('//table[@id="gattTable"]/tr')
440e0e9559SMatthias Ringwald    for row in rows:
450e0e9559SMatthias Ringwald        children = row.getchildren()
460e0e9559SMatthias Ringwald        summary = children[0].text_content()
470e0e9559SMatthias Ringwald        id      = children[1].text_content()
480e0e9559SMatthias Ringwald        uuid    = children[2].text_content()
490e0e9559SMatthias Ringwald        if (len(id)):
50*66fd3432SMatthias Ringwald            tag = id.upper().replace('.', '_').replace('-','_')
51*66fd3432SMatthias Ringwald            fout.write("#define %-80s %s // %s\n" %  (tag, uuid, summary))
520e0e9559SMatthias Ringwald
530e0e9559SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
540e0e9559SMatthias Ringwaldgen_path = btstack_root + '/src/bluetooth_gatt.h'
550e0e9559SMatthias Ringwald
560e0e9559SMatthias Ringwaldprint(program_info)
570e0e9559SMatthias Ringwald
580e0e9559SMatthias Ringwaldwith open(gen_path, 'wt') as fout:
590e0e9559SMatthias Ringwald    fout.write(header.format(datetime=str(datetime.datetime.now())))
600e0e9559SMatthias Ringwald    scrape_page(fout, 'https://www.bluetooth.com/specifications/gatt/declarations')
610e0e9559SMatthias Ringwald    scrape_page(fout, 'https://www.bluetooth.com/specifications/gatt/services')
620e0e9559SMatthias Ringwald    scrape_page(fout, 'https://www.bluetooth.com/specifications/gatt/characteristics')
630e0e9559SMatthias Ringwald    scrape_page(fout, 'https://www.bluetooth.com/specifications/gatt/descriptors')
640e0e9559SMatthias Ringwald    fout.write(trailer)
650e0e9559SMatthias Ringwald
660e0e9559SMatthias Ringwaldprint('Scraping successful!\n')