def enumerate(self): """ Enumerate the services and/or characteristics of the specified BLE device. :return: """ # Documentation is wrong, the first keyword argument is deviceAddr instead of # deviceAddress. http://ianharvey.github.io/bluepy-doc/ if self.args.services is False and self.args.chars is False: TLog.fail( "Specify the enumerations option(s). Either or both - services, chars" ) self.reason = "Incomplete arguments" return TLog.generic( "Enumerating services/characteristics of the device {}".format( self.args.addr ) ) device = BlePeripheral() try: device.connect( self.args.addr, addrType=( ADDR_TYPE_RANDOM if self.args.randaddrtype else ADDR_TYPE_PUBLIC ), ) self.found = True if self.args.services is True: services = device.getServices() for service in services: TLog.success( "(service uuid={})(handlestart={})(handleend={})".format( service.uuid, hex(service.hndStart), hex(service.hndEnd) ) ) if self.args.chars is True: chars = device.getCharacteristics() for char in chars: TLog.success( "(characteristic uuid={})(handle={})".format( char.uuid, hex(char.getHandle()) ) ) if self.args.verbose is True: support_property = char.propertiesToString() supports_read = char.supportsRead() TLog.success(" (supported_properties={})".format(support_property)) if supports_read is True: TLog.success(" (value={})".format(char.read())) except: # noqa: E722 self.reason = "Exception caught: {}".format(sysexcinfo()) finally: device.disconnect() if self.found is False and self.reason is None: self.reason = "Couldn't find any devices"
def execute(self): """ Execute the plugin. Enumerate the services and/or characteristics of the specified BLE device. Returns: Nothing """ # Documentation is wrong, the first keyword argument is deviceAddr instead of # deviceAddress. http://ianharvey.github.io/bluepy-doc/ if self.args.services is False and self.args.chars is False: reason = "Incomplete args. Enumerate what? Either or both - services, chars" self.result.setstatus(passed=False, reason=reason) return TLog.generic( "Enumerating services/characteristics of the device {}".format( self.args.addr ) ) device = BlePeripheral() try: device.connect( self.args.addr, addrType=( ADDR_TYPE_RANDOM if self.args.randaddrtype else ADDR_TYPE_PUBLIC ), ) if self.args.services is True: services = device.getServices() for service in services: self.output_handler(service_uuid=str(service.uuid), service_uuid_name=service.uuid.getCommonName(), handle_start=hex(service.hndStart), handle_end=hex(service.hndEnd)) if self.args.chars is True: chars = device.getCharacteristics() for char in chars: chardict = {"char_uuid": str(char.uuid), "char_uuid_name": char.uuid.getCommonName(), "handle": hex(char.getHandle()), "supported_properties": char.propertiesToString()} if char.supportsRead(): chardict["readvalue"] = char.read() self.output_handler(**chardict) except: # noqa: E722 self.result.setstatus(passed=False, reason="Exception caught: {}".format(sysexcinfo())) finally: device.disconnect()
def enumerate(self): """ Enumerate the services and/or characteristsics of the specified BLE device :return: """ # documentation is wrong, the first keyword argument is deviceAddr instead of deviceAddress as per the doc # Doc: http://ianharvey.github.io/bluepy-doc/ if self.args.services is False and self.args.chars is False: TLog.fail( "Specify the enumerations option(s). Either or both - services, chars" ) self.reason = "Incomplete arguments" return TLog.generic( "Enumerating services/characteristics of the device {}".format( self.args.addr)) d = BlePeripheral() try: d.connect(self.args.addr, addrType=(Ble.ADDR_TYPE_RANDOM if self.args.randaddrtype else Ble.ADDR_TYPE_PUBLIC)) self.found = True if self.args.services is True: svcs = d.getServices() for s in svcs: TLog.success( "(service uuid={})(handlestart={})(handleend={})". format(s.uuid, hex(s.hndStart), hex(s.hndEnd))) if self.args.chars is True: chrs = d.getCharacteristics() for c in chrs: TLog.success("(characteristic uuid={})(handle={})".format( c.uuid, hex(c.getHandle()))) if self.args.verbose is True: sr = c.supportsRead() TLog.success(" (supports_read={})".format(sr)) if sr is True: TLog.success(" (value={})".format(c.read())) except: self.reason = "Exception caught: {}".format(sysexcinfo()) finally: d.disconnect() if self.found is False and self.reason is None: self.reason = "Couldnt find any devices"