def hdl_wid_120(desc): # Lookup characteristic handle that does not permit write chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_val: continue att_rsp, val_len, val = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] if not (perm & Perm.write) or not (prop & Prop.write): return '{0:04x}'.format(handle, 'x') return '0000'
def hdl_wid_115(desc): # Lookup characteristic UUID that requires read authentication chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_val: continue att_rsp, val_len, val = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] if perm & Perm.read_authn: return btp.btp2uuid(uuid_len, chrc_uuid) return '0000'
def hdl_wid_121(desc): # Lookup characteristic UUID that returns Insufficient Encryption Key Size chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(handle) if not chrc_val: continue (att_rsp, val_len, val) = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(handle) if not chrc_value_data: continue # Check if returned ATT Insufficient Authorization error att_rsp, val_len, val = chrc_value_data if att_rsp != 0x0c: continue return '{0:04x}'.format(handle, 'x') return '0000'
def hdl_wid_111(desc): bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() # Lookup characteristic UUID that does not permit reading chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not chrc_val: continue att_rsp, val_len, val = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] if not (perm & Perm.read) or not (prop & Prop.read): return btp.btp2uuid(uuid_len, chrc_uuid) return '0000'
def hdl_wid_152(desc): chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_data: continue att_rsp, val_len, val = chrc_data hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] if perm & Perm.read and perm & Perm.write: chrc_value_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_value_data: continue _, val_len, _ = chrc_value_data if val_len == 300: return '{0:04x}'.format(handle, 'x')
def hdl_wid_121(desc): # Lookup characteristic UUID that returns Insufficient Encryption Key Size # TODO This needs reworking chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_val: continue (att_rsp, val_len, val) = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_value_data: continue if perm & Perm.write_enc and perm & Perm.read_enc: return '{0:04x}'.format(handle, 'x') return '0000'
def hdl_wid_144(desc): bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() attrs = btp.gatts_get_attrs(type_uuid='2803') for attr in attrs: if not attr: continue (handle, permission, type_uuid) = attr data = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not data: continue (att_rsp, val_len, val) = data hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len (props, handle, chrc_uuid) = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue (handle, permission, type_uuid) = chrc_value_attr[0] if permission & Perm.read_enc: return format(handle, 'x').zfill(4) return False
def hdl_wid_25(desc): # Please confirm IUT have following characteristics in services UUID= '1801'O handle='0002'O handle='0005'O # handle='0007'O pattern = re.compile(r"(UUID|handle)\s?=\s?'([0-9a-fA-F]+)'") pts_data = pattern.findall(desc) if not pts_data: logging.error("parsing error") return False pts_chrc_uuid = None pts_chrc_handles = [] for d in pts_data: if d[0] == 'UUID': pts_chrc_uuid = d[1] else: pts_chrc_handles.append(int(d[1], 16)) iut_start_handle = None iut_end_handle = None # Find pts_chrc_uuid service and it's handle range svcs = btp.gatts_get_attrs(type_uuid='2800') for svc in svcs: handle, perm, type_uuid = svc if iut_start_handle: iut_end_handle = handle - 1 break svc_val = btp.gatts_get_attr_val(handle) if not svc_val: continue att_rsp, uuid_len, uuid = svc_val if btp.btp2uuid(uuid_len, uuid) == pts_chrc_uuid: iut_start_handle = handle if iut_start_handle is None or iut_end_handle is None: logging.error("service %s not found", pts_chrc_uuid) return False iut_chrc_handles = [] # Lookup all services within service range chrcs = btp.gatts_get_attrs(type_uuid='2803', start_handle=iut_start_handle, end_handle=iut_end_handle) for chrc in chrcs: handle, perm, type_uuid = chrc iut_chrc_handles.append(handle) if iut_chrc_handles != pts_chrc_handles: return False return True
def hdl_wid_25(desc): MMI.reset() MMI.parse_description(desc) pts_chrc_uuid = MMI.args[0] pts_chrc_handles = [ int(MMI.args[1], 16), int(MMI.args[2], 16), int(MMI.args[3], 16), int(MMI.args[4], 16) ] iut_start_handle = None iut_end_handle = None bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() # Find pts_chrc_uuid service and it's handle range svcs = btp.gatts_get_attrs(type_uuid='2800') for svc in svcs: handle, perm, type_uuid = svc if iut_start_handle: iut_end_handle = handle - 1 break svc_val = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not svc_val: continue att_rsp, uuid_len, uuid = svc_val if btp.btp2uuid(uuid_len, uuid) == pts_chrc_uuid: iut_start_handle = handle if iut_start_handle is None or iut_end_handle is None: logging.error("service %s not found", pts_chrc_uuid) return False iut_chrc_handles = [] # Lookup all services within service range chrcs = btp.gatts_get_attrs(type_uuid='2803', start_handle=iut_start_handle, end_handle=iut_end_handle) for chrc in chrcs: handle, perm, type_uuid = chrc iut_chrc_handles.append(handle) if iut_chrc_handles != pts_chrc_handles: return False return True
def hdl_wid_119(desc): # Lookup UUID that is not present on IUT GATT Server uuid_list = [] chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(handle) if not chrc_val: continue att_rsp, val_len, val = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, uuid = struct.unpack("<BH%ds" % uuid_len, val) uuid_list.append(btp.btp2uuid(uuid_len, uuid)) if len(uuid_list) == 0: logging.error("No attribute found!") return "0000" uuid_invalid = 1 while True: if format(uuid_invalid, 'x').zfill(4) in uuid_list: uuid_invalid += 1 else: uuid_invalid = format(uuid_invalid, 'x').zfill(4) break return uuid_invalid
def hdl_wid_17(desc): # This pattern is matching Primary Service pattern = re.compile(r"Service\s=\s'([0-9a-fA-F]+)'") pts_services = pattern.findall(desc) if not pts_services: logging.error("%s parsing error", hdl_wid_17.__name__) return False iut_services = [] # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: handle, perm, type_uuid = attr (_, uuid_len, uuid) = btp.gatts_get_attr_val(handle) uuid = btp.btp2uuid(uuid_len, uuid) iut_services.append(uuid) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %s found", service) continue else: logging.error("Service %s not found", service) return False return True
def hdl_wid_161(desc): match = re.findall(r'(0[xX])?([0-9a-fA-F]{4})', desc) handle = int(match[0][1], 16) attr = btp.gatts_get_attrs(handle, handle) if not attr: return (handle, permission, type_uuid) = attr.pop() # Check if characteristic has signed write property value = btp.gatts_get_attr_val(handle - 1) if not value: return (att_rsp, val_len, val) = value hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len (properties, value_handle, chrc_uuid) = struct.unpack("<BH%ds" % uuid_len, val) if properties & Prop.auth_swrite == 0: return chrc_uuid = btp.btp2uuid(uuid_len, chrc_uuid) value = btp.gatts_get_attr_val(handle) if not value: return (att_rsp, val_len, val) = value return val_len
def hdl_wid_17(desc): MMI.reset() MMI.parse_description(desc) pts_services = MMI.args if not pts_services: logging.error("%s parsing error", hdl_wid_17.__name__) return False iut_services = [] # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: handle, perm, type_uuid = attr (_, uuid_len, uuid) = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) uuid = btp.btp2uuid(uuid_len, uuid) iut_services.append(uuid) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %s found", service) continue else: logging.error("Service %s not found", service) return False return True
def gatt_server_fetch_db(): db = GattDB() bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() attrs = btp.gatts_get_attrs() for attr in attrs: handle, perm, type_uuid = attr attr_val = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not attr_val: logging.debug("cannot read value %r", handle) continue att_rsp, val_len, val = attr_val if type_uuid == '2800' or type_uuid == '2801': uuid = btp.btp2uuid(val_len, val) if type_uuid == '2800': db.attr_add(handle, GattPrimary(handle, perm, uuid, att_rsp)) else: db.attr_add(handle, GattSecondary(handle, perm, uuid, att_rsp)) elif type_uuid == '2803': hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, value_handle, uuid = struct.unpack("<BH%ds" % uuid_len, val) uuid = btp.btp2uuid(uuid_len, uuid) db.attr_add( handle, GattCharacteristic(handle, perm, uuid, att_rsp, prop, value_handle)) elif type_uuid == '2802': hdr = "<HH" hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len incl_svc_hdl, end_grp_hdl, uuid = struct.unpack( hdr + "%ds" % uuid_len, val) uuid = btp.btp2uuid(uuid_len, uuid) db.attr_add( handle, GattServiceIncluded(handle, perm, uuid, att_rsp, incl_svc_hdl, end_grp_hdl)) else: uuid = type_uuid.replace("0x", "").replace("-", "").upper() db.attr_add( handle, GattCharacteristicDescriptor(handle, perm, uuid, att_rsp, val)) return db
def hdl_wid_22(desc): MMI.reset() MMI.parse_description(desc) parsed_args = [] for arg in MMI.args: parsed_args.append([char for char in arg if char != "-"]) handles = [] uuids = [] # Extract UUID's from parsed arguments uuids_from_parse = parsed_args[::3] # Delete unwanted UUID values del parsed_args[0::3] parsed_handles = parsed_args # Convert remaining arguments to integers parsed_handles = [int("".join(arg), 16) for arg in parsed_handles] # Increment every 2th handle parsed_handles[1::2] = [arg + 1 for arg in parsed_handles[1::2]] # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: start_handle, perm, type_uuid = attr val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), start_handle) if not val: continue (_, uuid_len, uuid) = val uuids.append(str(btp.btp2uuid(uuid_len, uuid))) handles.append(start_handle) for uuid in uuids_from_parse: if uuid in uuids_from_parse: logging.debug("UUUID %r present", uuid) continue else: logging.debug("UUID %r not present", uuid) return False for handle in parsed_handles: if handle in parsed_handles: logging.debug("Handle %r present", handle) continue else: logging.debug("Handle $r not present", handle) return False return True
def hdl_wid_122(desc): bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() # Lookup characteristic UUID that returns Insufficient Encryption Key Size chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_data = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not chrc_data: continue att_rsp, val_len, val = chrc_data hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not chrc_value_data: continue att_rsp, val_len, val = chrc_value_data # Check if returned ATT Insufficient Authorization error if att_rsp != 0x0c: continue return btp.btp2uuid(uuid_len, chrc_uuid) return '0000'
def hdl_wid_118(desc): # Lookup invalid attribute handle handle = None attrs = btp.gatts_get_attrs() for attr in attrs: handle, perm, type_uuid = attr if handle is None: logging.error("No attribute found!") return "0000" return '{0:04x}'.format(handle + 1, 'x')
def hdl_wid_112(desc): bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() # Lookup characteristic handle that requires read authorization chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_val = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not chrc_val: continue (att_rsp, val_len, val) = chrc_val hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not chrc_value_data: continue # Check if returned ATT Insufficient Authorization error att_rsp, val_len, val = chrc_value_data if att_rsp != 8: continue return '{0:04x}'.format(handle, 'x') return '0000'
def hdl_wid_113(_: WIDParams): # Lookup characteristic UUID that requires "read" authorization chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, type_uuid = chrc chrc_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_data: continue att_rsp, val_len, val = chrc_data hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len prop, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, type_uuid = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_value_data: continue att_rsp, val_len, val = chrc_value_data # Check if returned ATT Insufficient Authorization error if att_rsp != 8: continue return btp.btp2uuid(uuid_len, chrc_uuid) return '0000'
def hdl_wid_24(desc): MMI.reset() MMI.parse_description(desc) # Include service in description should have 3 parameters: # Attribute Handle, Included Service Attribute Handle and End Group Handle num_includes = len(MMI.args) / 3 pts_services = [] for i in range(num_includes): pts_services.append([ int(MMI.args[i + 0], 16), int(MMI.args[i + 1], 16), int(MMI.args[i + 2], 16) ]) iut_services = [] # Get all Included services attrs = btp.gatts_get_attrs(type_uuid='2802') for attr in attrs: handle, perm, type_uuid = attr val = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not val: continue (_, val_len, attr_value) = val hdr = '<HH' hdr_len = struct.calcsize(hdr) data_len = val_len - hdr_len incl_hdl, end_hdl, _ = struct.unpack(hdr + '%ds' % data_len, attr_value) iut_services.append([handle, incl_hdl, end_hdl]) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %r found", service) continue else: logging.error("Service %r not found", service) return False return True
def hdl_wid_23(desc): # This pattern is matching Primary Service uuid_pattern = re.compile(r"UUID\s?=\s'([0-9a-fA-F]+)'") start_hdl_pattern = re.compile(r"start\shandle\s=\s'([0-9a-fA-F]+)'") end_hdl_pattern = re.compile(r"end\shandle\s=\s'([0-9a-fA-F]+)'") uuids = uuid_pattern.findall(desc) start_hdls = start_hdl_pattern.findall(desc) end_hdls = end_hdl_pattern.findall(desc) # Normalize start_hdls = [int(hdl, 16) for hdl in start_hdls] end_hdls = [int(hdl, 16) for hdl in end_hdls] pts_services = [list(a) for a in zip(start_hdls, end_hdls, uuids)] iut_services = [] # [start_hdl, end_hdl, uuid] iut_service = None # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: start_handle, perm, type_uuid = attr if iut_service is not None: iut_service[1] = start_handle - 1 iut_services.append(iut_service) iut_service = None val = btp.gatts_get_attr_val(start_handle) if not val: continue (_, uuid_len, uuid) = val iut_service = [start_handle, "unknown", btp.btp2uuid(uuid_len, uuid)] iut_services.append(iut_service) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %r found", service) continue else: logging.error("Service %r not found", service) return False return True
def hdl_wid_103(desc): """ Implements: CONFIRM_INVALID_DATA :param desc: Please confirm the invalid data is not written to handle = %s. :return: """ # Mesh Provisioning data in attr = btp.gatts_get_attrs(type_uuid='2adb') if not attr: return (handle, permission, type_uuid) = attr.pop() if not permission & Perm.write: return False # Mesh Provisioning data out attr = btp.gatts_get_attrs(type_uuid='2adc') if not attr: return (handle, permission, type_uuid) = attr.pop() if permission & Perm.write: return False return True
def hdl_wid_122(desc): # Lookup characteristic UUID that returns Insufficient Encryption Key Size # TODO This needs reworking chrcs = btp.gatts_get_attrs(type_uuid='2803') for chrc in chrcs: handle, perm, _ = chrc chrc_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_data: continue _, val_len, val = chrc_data hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len _, handle, chrc_uuid = struct.unpack("<BH%ds" % uuid_len, val) chrc_value_attr = btp.gatts_get_attrs(start_handle=handle, end_handle=handle) if not chrc_value_attr: continue handle, perm, _ = chrc_value_attr[0] chrc_value_data = btp.gatts_get_attr_val(btp.pts_addr_type_get(), btp.pts_addr_get(), handle) if not chrc_value_data: continue _, val_len, val = chrc_value_data if perm & Perm.read and perm & Perm.read_enc: return btp.btp2uuid(uuid_len, chrc_uuid) return '0000'
def hdl_wid_23(desc): MMI.reset() MMI.parse_description(desc) pts_services = [[int(MMI.args[1], 16), int(MMI.args[2], 16), MMI.args[0]]] if not pts_services: logging.debug("parsing error") return False bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() iut_services = [] # [start_hdl, end_hdl, uuid] iut_service = None # Get all primary services attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: start_handle, perm, type_uuid = attr if iut_service is not None: iut_service[1] = start_handle - 1 iut_services.append(iut_service) iut_service = None val = btp.gatts_get_attr_val(bd_addr_type, bd_addr, start_handle) if not val: continue (_, uuid_len, uuid) = val iut_service = [start_handle, "unknown", btp.btp2uuid(uuid_len, uuid)] iut_services.append(iut_service) # Verification for service in pts_services: if service in iut_services: iut_services.remove(service) logging.debug("Service %r found", service) continue else: logging.error("Service %r not found", service) return False return True
def handle_wid_161(description): """ project_name: GAP wid: 161 description: Please confirm the signed write characteristic handle 0x0007. And enter the length of this handle's characteristic value in integer. style: MMI_Style_Edit1 0x12040 response: 17807656 <type 'int'> 94810264930128 response_size: 2048 response_is_present: 0 <type 'int'> """ match = findall(r'(0[xX])?([0-9a-fA-F]{4})', description) handle = int(match[0][1], 16) attr = btp.gatts_get_attrs(handle, handle) if not attr: return (handle, permission, type_uuid) = attr.pop() # Check if characteristic has signed write property value = btp.gatts_get_attr_val(handle - 1) if not value: return (att_rsp, val_len, val) = value hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len (properties, value_handle, chrc_uuid) = struct.unpack("<BH%ds" % uuid_len, val) if properties & Prop.auth_swrite == 0: return chrc_uuid = btp.btp2uuid(uuid_len, chrc_uuid) value = btp.gatts_get_attr_val(handle) if not value: return (att_rsp, val_len, val) = value return val_len
def hdl_wid_17(desc): MMI.reset() MMI.parse_description(desc) iut_services = [] attrs = btp.gatts_get_attrs(type_uuid='2800') for attr in attrs: handle, _, _ = attr (_, uuid_len, uuid) = btp.gatts_get_attr_val( btp.pts_addr_type_get(), btp.pts_addr_get(), handle) uuid = btp.btp2uuid(uuid_len, uuid) iut_services.append(uuid) return bool(iut_services == MMI.args)
def hdl_wid_161(params: WIDParams): match = re.findall(r'(0[xX])?([0-9a-fA-F]{4})', params.description) handle = int(match[0][1], 16) attr = btp.gatts_get_attrs(handle, handle) if not attr: return None (handle, permission, type_uuid) = attr.pop() bd_addr = btp.pts_addr_get() bd_addr_type = btp.pts_addr_type_get() # Check if characteristic has signed write property value = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle - 1) if not value: return None (att_rsp, val_len, val) = value hdr = '<BH' hdr_len = struct.calcsize(hdr) uuid_len = val_len - hdr_len (properties, value_handle, chrc_uuid) = struct.unpack("<BH%ds" % uuid_len, val) if properties & Prop.auth_swrite == 0: return None value = btp.gatts_get_attr_val(bd_addr_type, bd_addr, handle) if not value: return None (att_rsp, val_len, val) = value return val_len