The SDP UUID lists should be searched and ALL UUIDs matched for a record to be retrieved, not partial matches. Change the SDP code so that the entire list must be matched against a service attribute table's contents before it is returned.
Change matching algorithm so that it recursively searches through the entire attribute table, and not just pre-specified sequence attributes. Add browse lists and proper descriptions to the Serial Port service.
This commit is contained in:
parent
da51c1f974
commit
c362709a1e
5 changed files with 173 additions and 267 deletions
|
@ -30,86 +30,6 @@
|
|||
|
||||
#include "SDPServices.h"
|
||||
|
||||
/* ------------------------------ SDP SERVICE ATTRIBUTES ------------------------------ */
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint32_t Data;
|
||||
} PROGMEM SDP_Attribute_ServiceHandle =
|
||||
{
|
||||
(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),
|
||||
SWAPENDIAN_32(0x00010000),
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint16_t Size;
|
||||
ItemUUID_t UUIDList[];
|
||||
} PROGMEM SDP_Attribute_ServiceClassIDs =
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
|
||||
SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID}
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
Item16Bit_t VersionList[];
|
||||
} PROGMEM SDP_Attribute_Version =
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
(sizeof(Item16Bit_t) * 1),
|
||||
{
|
||||
{(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)}
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
char Text[];
|
||||
} PROGMEM SDP_Attribute_ServiceName =
|
||||
{
|
||||
(SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
|
||||
(sizeof("SDP") - 1),
|
||||
"SDP",
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
char Text[];
|
||||
} PROGMEM SDP_Attribute_ServiceDescription =
|
||||
{
|
||||
(SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
|
||||
(sizeof("Service Discovery Protocol Server") - 1),
|
||||
"Service Discovery Protocol Server",
|
||||
};
|
||||
|
||||
/** Service Discovery Protocol attribute table, listing all supported attributes of the service. */
|
||||
const ServiceAttributeTable_t SDP_Attribute_Table[] PROGMEM =
|
||||
{
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SDP_Attribute_ServiceClassIDs },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_VERSION, .Data = &SDP_Attribute_Version },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &SDP_Attribute_ServiceName },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SDP_Attribute_ServiceDescription },
|
||||
|
||||
SERVICE_ATTRIBUTE_TABLE_TERMINATOR
|
||||
};
|
||||
|
||||
|
||||
/* ------------------------------ RFCOMM SERVICE ATTRIBUTES ------------------------------ */
|
||||
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
|
@ -147,21 +67,54 @@ const struct
|
|||
{
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof(UUID_t),
|
||||
sizeof(ItemUUID_t),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},
|
||||
}
|
||||
},
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof(UUID_t),
|
||||
sizeof(ItemUUID_t),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint16_t Size;
|
||||
ItemUUID_t UUIDList[];
|
||||
} PROGMEM RFCOMM_Attribute_BrowseGroupList =
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
|
||||
SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), PUBLICBROWSEGROUP_CLASS_UUID}
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
ItemLangID_t OffsetList[];
|
||||
} PROGMEM RFCOMM_Attribute_LanguageBaseIDOffset =
|
||||
{
|
||||
.Header = (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
.Size = (sizeof(ItemLangID_t) * 1),
|
||||
.OffsetList =
|
||||
{
|
||||
{
|
||||
{(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x454E)},
|
||||
{(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x006A)},
|
||||
{(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)},
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
|
@ -186,105 +139,15 @@ const struct
|
|||
"Wireless Serial Port Service",
|
||||
};
|
||||
|
||||
const ServiceAttributeTable_t RFCOMM_Attribute_Table[] PROGMEM =
|
||||
const ServiceAttributeTable_t PROGMEM RFCOMM_Attribute_Table[] =
|
||||
{
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &RFCOMM_Attribute_ServiceClassIDs },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &RFCOMM_Attribute_ProtocolDescriptor },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &RFCOMM_Attribute_ServiceName },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &RFCOMM_Attribute_ServiceClassIDs },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &RFCOMM_Attribute_ProtocolDescriptor },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_BROWSEGROUPLIST, .Data = &RFCOMM_Attribute_BrowseGroupList },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_LANGUAGEBASEATTROFFSET, .Data = &RFCOMM_Attribute_LanguageBaseIDOffset},
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &RFCOMM_Attribute_ServiceName },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription },
|
||||
|
||||
SERVICE_ATTRIBUTE_TABLE_TERMINATOR
|
||||
};
|
||||
|
||||
|
||||
/* ------------------------------ L2CAP SERVICE ATTRIBUTES ------------------------------ */
|
||||
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint32_t Data;
|
||||
} PROGMEM L2CAP_Attribute_ServiceHandle =
|
||||
{
|
||||
(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),
|
||||
SWAPENDIAN_32(0x00010002),
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint16_t Size;
|
||||
ItemUUID_t UUIDList[];
|
||||
} PROGMEM L2CAP_Attribute_ServiceClassIDs =
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
|
||||
SWAPENDIAN_16(sizeof(ItemUUID_t) * 2),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID },
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID },
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint16_t Size;
|
||||
|
||||
ItemProtocol_t ProtocolList[];
|
||||
} PROGMEM L2CAP_Attribute_ProtocolDescriptor =
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),
|
||||
SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),
|
||||
{
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof(UUID_t),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},
|
||||
}
|
||||
},
|
||||
{
|
||||
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof(UUID_t),
|
||||
{
|
||||
{(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
char Text[];
|
||||
} PROGMEM L2CAP_Attribute_ServiceName =
|
||||
{
|
||||
(SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof("L2CAP") - 1,
|
||||
"L2CAP",
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
uint8_t Header;
|
||||
uint8_t Size;
|
||||
char Text[];
|
||||
} PROGMEM L2CAP_Attribute_ServiceDescription =
|
||||
{
|
||||
(SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),
|
||||
sizeof("Logical Link Layer") - 1,
|
||||
"Logical Link Layer",
|
||||
};
|
||||
|
||||
const ServiceAttributeTable_t L2CAP_Attribute_Table[] PROGMEM =
|
||||
{
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &L2CAP_Attribute_ServiceHandle },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &L2CAP_Attribute_ServiceClassIDs },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &L2CAP_Attribute_ProtocolDescriptor },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &L2CAP_Attribute_ServiceName },
|
||||
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &L2CAP_Attribute_ServiceDescription },
|
||||
|
||||
SERVICE_ATTRIBUTE_TABLE_TERMINATOR
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue