\r
#include "SDPServices.h"\r
\r
+/* ------------------------------ SDP SERVICE ATTRIBUTES ------------------------------ */\r
+\r
const struct\r
{\r
uint8_t Header;\r
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
{\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}}}\r
- }\r
- };\r
-\r
-const struct\r
-{\r
- uint8_t Header;\r
- uint16_t Size;\r
- ItemProtocol_t ProtocolList[];\r
-} PROGMEM SDP_Attribute_ProtocolDescriptor =\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
- SWAPENDIAN_16(sizeof(ItemProtocol_t) * 1),\r
- {\r
- {\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
- sizeof(UUID_t),\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00}}},\r
- }\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID}\r
}\r
};\r
\r
{\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &SDP_Attribute_ServiceHandle },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &SDP_Attribute_ServiceClassIDs },\r
-// {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &SDP_Attribute_ProtocolDescriptor },\r
{.AttributeID = SDP_ATTRIBUTE_ID_VERSION, .Data = &SDP_Attribute_Version },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &SDP_Attribute_ServiceName },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &SDP_Attribute_ServiceDescription },\r
SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
};\r
\r
+\r
+/* ------------------------------ RFCOMM SERVICE ATTRIBUTES ------------------------------ */\r
+\r
+\r
const struct\r
{\r
uint8_t Header;\r
(SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
SWAPENDIAN_16(sizeof(ItemUUID_t) * 1),\r
{\r
- {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x11, 0x01}}}\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID}\r
}\r
};\r
\r
const struct\r
{\r
- uint8_t Header;\r
- uint8_t Size;\r
- Item16Bit_t OffsetList[];\r
-} PROGMEM RFCOMM_Attribute_LangOffset =\r
+ uint8_t Header;\r
+ uint16_t Size;\r
+\r
+ ItemProtocol_t ProtocolList[];\r
+} PROGMEM RFCOMM_Attribute_ProtocolDescriptor =\r
{\r
- (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
- (sizeof(Item16Bit_t) * 1),\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+ SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),\r
{\r
- {(SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_16Bit), SWAPENDIAN_16(0x0100)}\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+ sizeof(UUID_t),\r
+ {\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},\r
+ }\r
+ },\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+ sizeof(UUID_t),\r
+ {\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},\r
+ }\r
+ }\r
}\r
};\r
\r
{\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &RFCOMM_Attribute_ServiceHandle },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &RFCOMM_Attribute_ServiceClassIDs },\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &RFCOMM_Attribute_ProtocolDescriptor },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &RFCOMM_Attribute_ServiceName },\r
{.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &RFCOMM_Attribute_ServiceDescription },\r
\r
SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
};\r
+\r
+\r
+/* ------------------------------ L2CAP SERVICE ATTRIBUTES ------------------------------ */\r
+\r
+\r
+const struct\r
+{\r
+ uint8_t Header;\r
+ uint32_t Data;\r
+} PROGMEM L2CAP_Attribute_ServiceHandle =\r
+ {\r
+ (SDP_DATATYPE_UnsignedInt | SDP_DATASIZE_32Bit),\r
+ SWAPENDIAN_32(0x00010002),\r
+ };\r
+\r
+const struct\r
+{\r
+ uint8_t Header;\r
+ uint16_t Size;\r
+ ItemUUID_t UUIDList[];\r
+} PROGMEM L2CAP_Attribute_ServiceClassIDs =\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+ SWAPENDIAN_16(sizeof(ItemUUID_t) * 2),\r
+ {\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SDP_CLASS_UUID },\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), SP_CLASS_UUID },\r
+ }\r
+ };\r
+\r
+const struct\r
+{\r
+ uint8_t Header;\r
+ uint16_t Size;\r
+\r
+ ItemProtocol_t ProtocolList[];\r
+} PROGMEM L2CAP_Attribute_ProtocolDescriptor =\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable16Bit),\r
+ SWAPENDIAN_16(sizeof(ItemProtocol_t) * 2),\r
+ {\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+ sizeof(UUID_t),\r
+ {\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), L2CAP_UUID},\r
+ }\r
+ },\r
+ {\r
+ (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit),\r
+ sizeof(UUID_t),\r
+ {\r
+ {(SDP_DATATYPE_UUID | SDP_DATASIZE_128Bit), RFCOMM_UUID},\r
+ }\r
+ }\r
+ }\r
+ };\r
+ \r
+const struct\r
+{\r
+ uint8_t Header;\r
+ uint8_t Size;\r
+ char Text[];\r
+} PROGMEM L2CAP_Attribute_ServiceName =\r
+ {\r
+ (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
+ sizeof("L2CAP") - 1,\r
+ "L2CAP",\r
+ };\r
+\r
+const struct\r
+{\r
+ uint8_t Header;\r
+ uint8_t Size;\r
+ char Text[];\r
+} PROGMEM L2CAP_Attribute_ServiceDescription =\r
+ {\r
+ (SDP_DATATYPE_String | SDP_DATASIZE_Variable8Bit),\r
+ sizeof("Logical Link Layer") - 1,\r
+ "Logical Link Layer",\r
+ };\r
+\r
+const ServiceAttributeTable_t L2CAP_Attribute_Table[] PROGMEM =\r
+ {\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE, .Data = &L2CAP_Attribute_ServiceHandle },\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICECLASSIDS, .Data = &L2CAP_Attribute_ServiceClassIDs },\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST, .Data = &L2CAP_Attribute_ProtocolDescriptor },\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICENAME, .Data = &L2CAP_Attribute_ServiceName },\r
+ {.AttributeID = SDP_ATTRIBUTE_ID_SERVICEDESCRIPTION, .Data = &L2CAP_Attribute_ServiceDescription },\r
+ \r
+ SERVICE_ATTRIBUTE_TABLE_TERMINATOR\r
+ };\r
/** First 80 bits common to all standardized Bluetooth services. */\r
#define BASE_80BIT_UUID SWAPENDIAN_32(0xFB349B5F), SWAPENDIAN_16(0x8000), SWAPENDIAN_16(0x0080), SWAPENDIAN_16(0x0010)\r
\r
+ #define SDP_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}\r
+ #define RFCOMM_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}}\r
+ #define L2CAP_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x01, 0x00}}\r
+ #define UPNP_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x00, 0x10}}\r
+ #define SDP_CLASS_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00}}\r
+ #define SP_CLASS_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x11, 0x01}}\r
+ #define UPNP_CLASS_UUID {BASE_80BIT_UUID, {0x00, 0x00, 0x00, 0x00, 0x12, 0x00}}\r
+ \r
#define SDP_ATTRIBUTE_ID_SERVICERECORDHANDLE 0x0000\r
#define SDP_ATTRIBUTE_ID_SERVICECLASSIDS 0x0001\r
#define SDP_ATTRIBUTE_ID_PROTOCOLDESCRIPTORLIST 0x0004\r
uint8_t Header; /**< Data Element header, should be (SDP_DATATYPE_Sequence | SDP_DATASIZE_Variable8Bit) */\r
uint8_t Size; /**< Size of the inner Data Element sequence */\r
\r
- ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */\r
+ struct\r
+ {\r
+ ItemUUID_t UUID; /**< UUID to store in the protocol list Data Element sequence */\r
+ } Protocol;\r
} ItemProtocol_t;\r
\r
/* External Variables: */\r
extern const ServiceAttributeTable_t SDP_Attribute_Table[];\r
extern const ServiceAttributeTable_t RFCOMM_Attribute_Table[];\r
+ extern const ServiceAttributeTable_t L2CAP_Attribute_Table[];\r
\r
#endif\r