Skip to content

Instantly share code, notes, and snippets.

@besi

besi/Readme.md Secret

Last active February 11, 2023 15:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save besi/c639b72bf81ecc0562376513e714f672 to your computer and use it in GitHub Desktop.
Save besi/c639b72bf81ecc0562376513e714f672 to your computer and use it in GitHub Desktop.
Debug HID over Gatt

See

Remote Control

Unix

Discover LE devices

sudo hcitool lescan
...
AA:BB:CC:DD:EE:FF Swisscom RC

Gattool

# Press 1 & 3 to unpair the remote from existing devices
gatttool -I -b AA:BB:CC:DD:EE:FF
connect
# Press the OK button on the remote

Install Python GATT library

sudo apt-get install -y python3 python3-pip python3-dbus
pip3 install gatt
[04:a3:16:3d:8f:3f] Service [0000180a-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [PnP ID]
[04:a3:16:3d:8f:3f] Characteristic [Firmware Revision String]
[04:a3:16:3d:8f:3f] Characteristic [Model Number String]
[04:a3:16:3d:8f:3f] Characteristic [Hardware Revision String]
[04:a3:16:3d:8f:3f] Characteristic [Serial Number String]
[04:a3:16:3d:8f:3f] Characteristic [Manufacturer Name String]
[04:a3:16:3d:8f:3f] Characteristic [IEEE 11073-20601 Regulatory Certification Data List]
[04:a3:16:3d:8f:3f] Characteristic [System ID]
[04:a3:16:3d:8f:3f] Characteristic [Software Revision String]
[04:a3:16:3d:8f:3f] Service [00001800-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [Appearance]
[04:a3:16:3d:8f:3f] Characteristic [Peripheral Preferred Connection Parameters]
[04:a3:16:3d:8f:3f] Characteristic [Device Name]
[04:a3:16:3d:8f:3f] Characteristic [Peripheral Privacy Flag]
[04:a3:16:3d:8f:3f] Characteristic [Reconnection Address]
[04:a3:16:3d:8f:3f] Service [f000ffc0-0451-4000-b000-000000000000]
[04:a3:16:3d:8f:3f] Characteristic [f000ffc2-0451-4000-b000-000000000000]
[04:a3:16:3d:8f:3f] Characteristic [f000ffc1-0451-4000-b000-000000000000]
[04:a3:16:3d:8f:3f] Service [00001801-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [Service Changed]
[04:a3:16:3d:8f:3f] Service [644bffc0-e3e2-11e2-8c34-0002a5d5c51b]
[04:a3:16:3d:8f:3f] Characteristic [644bffc4-e3e2-11e2-8c34-0002a5d5c51b]
[04:a3:16:3d:8f:3f] Characteristic [644bffc3-e3e2-11e2-8c34-0002a5d5c51b]
[04:a3:16:3d:8f:3f] Characteristic [644bffc2-e3e2-11e2-8c34-0002a5d5c51b]
[04:a3:16:3d:8f:3f] Characteristic [644bffc1-e3e2-11e2-8c34-0002a5d5c51b]
[04:a3:16:3d:8f:3f] Service [0000180f-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [Battery Level]
[04:a3:16:3d:8f:3f] Service [00001812-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [Report]
[04:a3:16:3d:8f:3f] Characteristic [Report]
[04:a3:16:3d:8f:3f] Characteristic [Report Map]
[04:a3:16:3d:8f:3f] Characteristic [HID Control Point]
[04:a3:16:3d:8f:3f] Characteristic [Report]
[04:a3:16:3d:8f:3f] Characteristic [HID Information]
[04:a3:16:3d:8f:3f] Characteristic [Protocol Mode]
[04:a3:16:3d:8f:3f] Service [00001813-0000-1000-8000-00805f9b34fb]
[04:a3:16:3d:8f:3f] Characteristic [Scan Refresh]
[04:a3:16:3d:8f:3f] Characteristic [Scan Interval Window]
import gatt
names = {}
names["00001811-0000-1000-8000-00805f9b34fb"] = "Alert Notification Service"
names["0000180f-0000-1000-8000-00805f9b34fb"] = "Battery Service"
names["00001810-0000-1000-8000-00805f9b34fb"] = "Blood Pressure"
names["00001805-0000-1000-8000-00805f9b34fb"] = "Current Time Service"
names["00001818-0000-1000-8000-00805f9b34fb"] = "Cycling Power"
names["00001816-0000-1000-8000-00805f9b34fb"] = "Cycling Speed and Cadence"
names["0000180a-0000-1000-8000-00805f9b34fb"] = "Device Information"
names["00001800-0000-1000-8000-00805f9b34fb"] = "Generic Access"
names["00001801-0000-1000-8000-00805f9b34fb"] = "Generic Attribute"
names["00001808-0000-1000-8000-00805f9b34fb"] = "Glucose"
names["00001809-0000-1000-8000-00805f9b34fb"] = "Health Thermometer"
names["0000180d-0000-1000-8000-00805f9b34fb"] = "Heart Rate"
names["00001812-0000-1000-8000-00805f9b34fb"] = "Human Interface Device"
names["00001802-0000-1000-8000-00805f9b34fb"] = "Immediate Alert"
names["00001803-0000-1000-8000-00805f9b34fb"] = "Link Loss"
names["00001819-0000-1000-8000-00805f9b34fb"] = "Location and Navigation"
names["00001807-0000-1000-8000-00805f9b34fb"] = "Next DST Change Service"
names["0000180e-0000-1000-8000-00805f9b34fb"] = "Phone Alert Status Service"
names["00001806-0000-1000-8000-00805f9b34fb"] = "Reference Time Update Service"
names["00001814-0000-1000-8000-00805f9b34fb"] = "Running Speed and Cadence"
names["00001813-0000-1000-8000-00805f9b34fb"] = "Scan Parameters"
names["00001804-0000-1000-8000-00805f9b34fb"] = "Tx Power"
names["00002a43-0000-1000-8000-00805f9b34fb"] = "Alert Category ID"
names["00002a42-0000-1000-8000-00805f9b34fb"] = "Alert Category ID Bit Mask"
names["00002a06-0000-1000-8000-00805f9b34fb"] = "Alert Level"
names["00002a44-0000-1000-8000-00805f9b34fb"] = "Alert Notification Control Point"
names["00002a3f-0000-1000-8000-00805f9b34fb"] = "Alert Status"
names["00002a01-0000-1000-8000-00805f9b34fb"] = "Appearance"
names["00002a19-0000-1000-8000-00805f9b34fb"] = "Battery Level"
names["00002a49-0000-1000-8000-00805f9b34fb"] = "Blood Pressure Feature"
names["00002a35-0000-1000-8000-00805f9b34fb"] = "Blood Pressure Measurement"
names["00002a38-0000-1000-8000-00805f9b34fb"] = "Body Sensor Location"
names["00002a22-0000-1000-8000-00805f9b34fb"] = "Boot Keyboard Input Report"
names["00002a32-0000-1000-8000-00805f9b34fb"] = "Boot Keyboard Output Report"
names["00002a33-0000-1000-8000-00805f9b34fb"] = "Boot Mouse Input Report"
names["00002a5c-0000-1000-8000-00805f9b34fb"] = "CSC Feature"
names["00002a5b-0000-1000-8000-00805f9b34fb"] = "CSC Measurement"
names["00002a2b-0000-1000-8000-00805f9b34fb"] = "Current Time"
names["00002a66-0000-1000-8000-00805f9b34fb"] = "Cycling Power Control Point"
names["00002a65-0000-1000-8000-00805f9b34fb"] = "Cycling Power Feature"
names["00002a63-0000-1000-8000-00805f9b34fb"] = "Cycling Power Measurement"
names["00002a64-0000-1000-8000-00805f9b34fb"] = "Cycling Power Vector"
names["00002a08-0000-1000-8000-00805f9b34fb"] = "Date Time"
names["00002a0a-0000-1000-8000-00805f9b34fb"] = "Day Date Time"
names["00002a09-0000-1000-8000-00805f9b34fb"] = "Day of Week"
names["00002a00-0000-1000-8000-00805f9b34fb"] = "Device Name"
names["00002a0d-0000-1000-8000-00805f9b34fb"] = "DST Offset"
names["00002a0c-0000-1000-8000-00805f9b34fb"] = "Exact Time 256"
names["00002a26-0000-1000-8000-00805f9b34fb"] = "Firmware Revision String"
names["00002a51-0000-1000-8000-00805f9b34fb"] = "Glucose Feature"
names["00002a18-0000-1000-8000-00805f9b34fb"] = "Glucose Measurement"
names["00002a34-0000-1000-8000-00805f9b34fb"] = "Glucose Measurement Context"
names["00002a27-0000-1000-8000-00805f9b34fb"] = "Hardware Revision String"
names["00002a39-0000-1000-8000-00805f9b34fb"] = "Heart Rate Control Point"
names["00002a37-0000-1000-8000-00805f9b34fb"] = "Heart Rate Measurement"
names["00002a4c-0000-1000-8000-00805f9b34fb"] = "HID Control Point"
names["00002a4a-0000-1000-8000-00805f9b34fb"] = "HID Information"
names["00002a2a-0000-1000-8000-00805f9b34fb"] = "IEEE 11073-20601 Regulatory Certification Data List"
names["00002a36-0000-1000-8000-00805f9b34fb"] = "Intermediate Cuff Pressure"
names["00002a1e-0000-1000-8000-00805f9b34fb"] = "Intermediate Temperature"
names["00002a6b-0000-1000-8000-00805f9b34fb"] = "LN Control Point"
names["00002a6a-0000-1000-8000-00805f9b34fb"] = "LN Feature"
names["00002a0f-0000-1000-8000-00805f9b34fb"] = "Local Time Information"
names["00002a67-0000-1000-8000-00805f9b34fb"] = "Location and Speed"
names["00002a29-0000-1000-8000-00805f9b34fb"] = "Manufacturer Name String"
names["00002a21-0000-1000-8000-00805f9b34fb"] = "Measurement Interval"
names["00002a24-0000-1000-8000-00805f9b34fb"] = "Model Number String"
names["00002a68-0000-1000-8000-00805f9b34fb"] = "Navigation"
names["00002a46-0000-1000-8000-00805f9b34fb"] = "New Alert"
names["00002a04-0000-1000-8000-00805f9b34fb"] = "Peripheral Preferred Connection Parameters"
names["00002a02-0000-1000-8000-00805f9b34fb"] = "Peripheral Privacy Flag"
names["00002a50-0000-1000-8000-00805f9b34fb"] = "PnP ID"
names["00002a69-0000-1000-8000-00805f9b34fb"] = "Position Quality"
names["00002a4e-0000-1000-8000-00805f9b34fb"] = "Protocol Mode"
names["00002a03-0000-1000-8000-00805f9b34fb"] = "Reconnection Address"
names["00002a52-0000-1000-8000-00805f9b34fb"] = "Record Access Control Point"
names["00002a14-0000-1000-8000-00805f9b34fb"] = "Reference Time Information"
names["00002a4d-0000-1000-8000-00805f9b34fb"] = "Report"
names["00002a4b-0000-1000-8000-00805f9b34fb"] = "Report Map"
names["00002a40-0000-1000-8000-00805f9b34fb"] = "Ringer Control Point"
names["00002a41-0000-1000-8000-00805f9b34fb"] = "Ringer Setting"
names["00002a54-0000-1000-8000-00805f9b34fb"] = "RSC Feature"
names["00002a53-0000-1000-8000-00805f9b34fb"] = "RSC Measurement"
names["00002a55-0000-1000-8000-00805f9b34fb"] = "SC Control Point"
names["00002a4f-0000-1000-8000-00805f9b34fb"] = "Scan Interval Window"
names["00002a31-0000-1000-8000-00805f9b34fb"] = "Scan Refresh"
names["00002a5d-0000-1000-8000-00805f9b34fb"] = "Sensor Location"
names["00002a25-0000-1000-8000-00805f9b34fb"] = "Serial Number String"
names["00002a05-0000-1000-8000-00805f9b34fb"] = "Service Changed"
names["00002a28-0000-1000-8000-00805f9b34fb"] = "Software Revision String"
names["00002a47-0000-1000-8000-00805f9b34fb"] = "Supported New Alert Category"
names["00002a48-0000-1000-8000-00805f9b34fb"] = "Supported Unread Alert Category"
names["00002a23-0000-1000-8000-00805f9b34fb"] = "System ID"
names["00002a1c-0000-1000-8000-00805f9b34fb"] = "Temperature Measurement"
names["00002a1d-0000-1000-8000-00805f9b34fb"] = "Temperature Type"
names["00002a12-0000-1000-8000-00805f9b34fb"] = "Time Accuracy"
names["00002a13-0000-1000-8000-00805f9b34fb"] = "Time Source"
names["00002a16-0000-1000-8000-00805f9b34fb"] = "Time Update Control Point"
names["00002a17-0000-1000-8000-00805f9b34fb"] = "Time Update State"
names["00002a11-0000-1000-8000-00805f9b34fb"] = "Time with DST"
names["00002a0e-0000-1000-8000-00805f9b34fb"] = "Time Zone"
names["00002a07-0000-1000-8000-00805f9b34fb"] = "Tx Power Level"
names["00002a45-0000-1000-8000-00805f9b34fb"] = "Unread Alert Status"
report_uuid = "00002a4d-0000-1000-8000-00805f9b34fb"
manager = gatt.DeviceManager(adapter_name='hci0')
class AnyDevice(gatt.Device):
def connect_succeeded(self):
super().connect_succeeded()
print("[%s] Connected" % (self.mac_address))
def connect_failed(self, error):
super().connect_failed(error)
print("[%s] Connection failed: %s" % (self.mac_address, str(error)))
def disconnect_succeeded(self):
super().disconnect_succeeded()
print("[%s] Disconnected" % (self.mac_address))
def characteristic_value_updated(self, characteristic, value):
print("Updated", characteristic, value)
def characteristic_enable_notification_succeeded(self):
print("notification happend")
def characteristic_enable_notification_failed(self):
print("notification failed")
def services_resolved(self):
super().services_resolved()
print("[%s] Resolved services" % (self.mac_address))
for service in self.services:
print("[%s] Service [%s]" % (self.mac_address, service.uuid))
for characteristic in service.characteristics:
characteristic.enable_notifications()
print("[%s] Characteristic [%s]" % (self.mac_address, names.get(characteristic.uuid, characteristic.uuid )))
device = AnyDevice(mac_address='AA:BB:CC:DD:EE:FF', manager=manager)
device.auto_reconnect = True
device.connect()
manager.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment