diff options
Diffstat (limited to 'gattctl.py')
-rwxr-xr-x | gattctl.py | 136 |
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() |