Metadata-Version: 2.4 Name: bluetooth-data-tools Version: 1.29.18 Summary: Tools for converting bluetooth data and packets License-Expression: Apache-2.0 License-File: LICENSE Author: J. Nick Koston Author-email: nick@koston.org Requires-Python: >=3.10 Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 Classifier: Topic :: Software Development :: Libraries Provides-Extra: docs Requires-Dist: Sphinx (>=5,<9) ; extra == "docs" Requires-Dist: cryptography (>=47.0.0) Requires-Dist: myst-parser (>=0.18,<4.1) ; extra == "docs" Requires-Dist: sphinx-rtd-theme (>=1,<4) ; extra == "docs" Project-URL: Bug Tracker, https://github.com/bdraco/bluetooth-data-tools/issues Project-URL: Changelog, https://github.com/bdraco/bluetooth-data-tools/blob/main/CHANGELOG.md Project-URL: Documentation, https://bluetooth-data-tools.readthedocs.io Project-URL: Repository, https://github.com/bdraco/bluetooth-data-tools Description-Content-Type: text/markdown # Bluetooth Data Tools

CI Status Documentation Status Test coverage percentage CodSpeed Badge

Poetry black pre-commit

PyPI Version Supported Python versions License

Tools for converting bluetooth data and packets ## Installation Install this via pip (or your favourite package manager): `pip install bluetooth-data-tools` ## Usage ### Parsing BLE GAP Advertisement Data Parse raw BLE advertisement bytes into structured data: ```python from bluetooth_data_tools import parse_advertisement_data_bytes # Parse raw GAP advertisement bytes parsed = parse_advertisement_data_bytes(raw_bytes) local_name = parsed[0] # str | None service_uuids = parsed[1] # list[str] service_data = parsed[2] # dict[str, bytes] manufacturer_data = parsed[3] # dict[int, bytes] tx_power = parsed[4] # int | None ``` Or use the object-oriented interface: ```python from bluetooth_data_tools import BLEGAPAdvertisement, parse_advertisement_data adv = parse_advertisement_data([raw_bytes1, raw_bytes2]) print(adv.local_name) print(adv.service_uuids) print(adv.service_data) print(adv.manufacturer_data) print(adv.tx_power) ``` ### Bluetooth Address Utilities ```python from bluetooth_data_tools import ( int_to_bluetooth_address, mac_to_int, short_address, human_readable_name, ) # Convert integer to MAC address int_to_bluetooth_address(0x123456789ABC) # "12:34:56:78:9A:BC" # Convert MAC address to integer mac_to_int("FF:FF:FF:FF:FF:FF") # 281474976710655 # Get short address (last 2 octets) short_address("AA:BB:CC:DD:EE:FF") # "EEFF" # Format a human-readable device name human_readable_name("My Sensor", "", "AA:BB:CC:DD:EE:FF") # "My Sensor (EEFF)" ``` ### Distance Estimation Estimate distance from TX power and RSSI: ```python from bluetooth_data_tools import calculate_distance_meters distance = calculate_distance_meters(power=-59, rssi=-60) # ~1.135 meters ``` ### Monotonic Time A fast monotonic clock optimized for Bluetooth event timing. On Linux, uses `CLOCK_MONOTONIC_COARSE` via Cython for lower overhead: ```python from bluetooth_data_tools import monotonic_time_coarse now = monotonic_time_coarse() ``` ### Private Address Resolution (RPA) Resolve Bluetooth Low Energy random private addresses using an Identity Resolving Key: ```python from bluetooth_data_tools import get_cipher_for_irk, resolve_private_address cipher = get_cipher_for_irk(irk_bytes) # 16-byte Identity Resolving Key is_match = resolve_private_address(cipher, "40:01:02:0A:C4:A6") ``` ## Contributors ✨ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! ## Credits This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [browniebroke/cookiecutter-pypackage](https://github.com/browniebroke/cookiecutter-pypackage) project template.