summaryrefslogtreecommitdiffstats
path: root/gattctl.py
diff options
context:
space:
mode:
Diffstat (limited to 'gattctl.py')
-rwxr-xr-xgattctl.py136
1 files changed, 136 insertions, 0 deletions
diff --git a/gattctl.py b/gattctl.py
new file mode 100755
index 0000000..9f57947
--- /dev/null
+++ b/gattctl.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+
+from argparse import ArgumentParser
+import gatt
+
+device_manager = None
+
+
+class AnyDeviceManager(gatt.DeviceManager):
+ """
+ An implementation of ``gatt.DeviceManager`` that discovers any GATT device
+ and prints all discovered devices.
+ """
+
+ def device_discovered(self, device):
+ print("[%s] Discovered, alias = %s" % (device.mac_address, device.alias()))
+
+ def make_device(self, mac_address):
+ return AnyDevice(mac_address=mac_address, manager=self)
+
+
+class AnyDevice(gatt.Device):
+ """
+ An implementation of ``gatt.Device`` that connects to any GATT device
+ and prints all services and characteristics.
+ """
+
+ def __init__(self, mac_address, manager, auto_reconnect=False):
+ super().__init__(mac_address=mac_address, manager=manager)
+ self.auto_reconnect = auto_reconnect
+
+ def connect(self):
+ print("Connecting...")
+ super().connect()
+
+ 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))
+ if self.auto_reconnect:
+ self.connect()
+
+ 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:
+ print("[%s] Characteristic [%s]" % (self.mac_address, characteristic.uuid))
+
+
+def main():
+ arg_parser = ArgumentParser(description="GATT SDK Demo")
+ arg_parser.add_argument(
+ '--adapter',
+ default='hci0',
+ help="Name of Bluetooth adapter, defaults to 'hci0'")
+ arg_commands_group = arg_parser.add_mutually_exclusive_group(required=True)
+ arg_commands_group.add_argument(
+ '--power-on',
+ action='store_true',
+ help="Powers the adapter on")
+ arg_commands_group.add_argument(
+ '--power-off',
+ action='store_true',
+ help="Powers the adapter off")
+ arg_commands_group.add_argument(
+ '--powered',
+ action='store_true',
+ help="Print the adapter's power state")
+ arg_commands_group.add_argument(
+ '--discover',
+ action='store_true',
+ help="Lists all nearby GATT devices")
+ arg_commands_group.add_argument(
+ '--connect',
+ metavar='address',
+ type=str,
+ help="Connect to a GATT device with a given MAC address")
+ arg_commands_group.add_argument(
+ '--auto',
+ metavar='address',
+ type=str,
+ help="Connect and automatically reconnect to a GATT device with a given MAC address")
+ arg_commands_group.add_argument(
+ '--disconnect',
+ metavar='address',
+ type=str,
+ help="Disconnect a GATT device with a given MAC address")
+ args = arg_parser.parse_args()
+
+ global device_manager
+ device_manager = AnyDeviceManager(adapter_name=args.adapter)
+
+ if args.power_on:
+ device_manager.is_adapter_powered = True
+ print("Powered on")
+ return
+ elif args.power_off:
+ device_manager.is_adapter_powered = False
+ print("Powered off")
+ return
+ elif args.powered:
+ print("Powered: ", device_manager.is_adapter_powered)
+ return
+ if args.discover:
+ device_manager.start_discovery()
+ elif args.connect:
+ device = AnyDevice(mac_address=args.connect, manager=device_manager)
+ device.connect()
+ elif args.auto:
+ device = AnyDevice(mac_address=args.auto, manager=device_manager, auto_reconnect=True)
+ device.connect()
+ elif args.disconnect:
+ device = AnyDevice(mac_address=args.disconnect, manager=device_manager)
+ device.disconnect()
+ return
+
+ print("Terminate with Ctrl+C")
+ try:
+ device_manager.run()
+ except KeyboardInterrupt:
+ pass
+
+
+if __name__ == '__main__':
+ main()