mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-08 23:24:33 +02:00
sdp support create and search PBAPC record
This commit is contained in:
@@ -50,6 +50,9 @@ static const uint8_t UUID_OBEX_OBJECT_PUSH[] = {0x00, 0x00, 0x11, 0x05, 0x00, 0
|
||||
static const uint8_t UUID_PBAP_PSE[] = {0x00, 0x00, 0x11, 0x2F, 0x00, 0x00, 0x10, 0x00,
|
||||
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
|
||||
};
|
||||
static const uint8_t UUID_PBAP_PCE[] = {0x00, 0x00, 0x11, 0x2E, 0x00, 0x00, 0x10, 0x00,
|
||||
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
|
||||
};
|
||||
static const uint8_t UUID_MAP_MAS[] = {0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00,
|
||||
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
|
||||
};
|
||||
@@ -223,6 +226,28 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_RE
|
||||
}
|
||||
}
|
||||
|
||||
static void bta_create_pce_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_REC *p_rec)
|
||||
{
|
||||
tSDP_DISC_ATTR *p_attr;
|
||||
UINT16 pversion;
|
||||
|
||||
record->pce.hdr.type = SDP_TYPE_PBAP_PCE;
|
||||
record->pce.hdr.service_name_length = 0;
|
||||
record->pce.hdr.service_name = NULL;
|
||||
record->pce.hdr.rfcomm_channel_number = 0; // unused
|
||||
record->pce.hdr.l2cap_psm = -1; // unused
|
||||
record->pce.hdr.profile_version = 0;
|
||||
|
||||
if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL) {
|
||||
record->pce.hdr.service_name_length = SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
|
||||
record->pce.hdr.service_name = (char *)p_attr->attr_value.v.array;
|
||||
}
|
||||
|
||||
if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS, &pversion)) {
|
||||
record->pce.hdr.profile_version = pversion;
|
||||
}
|
||||
}
|
||||
|
||||
static void bta_create_ops_sdp_record(bluetooth_sdp_record *record, tSDP_DISC_REC *p_rec)
|
||||
{
|
||||
tSDP_DISC_ATTR *p_attr, *p_sattr;
|
||||
@@ -395,6 +420,9 @@ static void bta_sdp_search_cback(UINT16 result, void *user_data)
|
||||
} else if (IS_UUID(UUID_PBAP_PSE, uuid->uu.uuid128)) {
|
||||
APPL_TRACE_DEBUG("%s() - found PBAP (PSE) uuid\n", __func__);
|
||||
bta_create_pse_sdp_record(&evt_data.records[count], p_rec);
|
||||
} else if (IS_UUID(UUID_PBAP_PCE, uuid->uu.uuid128)) {
|
||||
APPL_TRACE_DEBUG("%s() - found PBAP (PCE) uuid\n", __func__);
|
||||
bta_create_pce_sdp_record(&evt_data.records[count], p_rec);
|
||||
} else if (IS_UUID(UUID_OBEX_OBJECT_PUSH, uuid->uu.uuid128)) {
|
||||
APPL_TRACE_DEBUG("%s() - found Object Push Server (OPS) uuid\n", __func__);
|
||||
bta_create_ops_sdp_record(&evt_data.records[count], p_rec);
|
||||
|
@@ -484,7 +484,53 @@ static int add_pbaps_sdp(const bluetooth_sdp_pse_record* rec)
|
||||
if (!status) {
|
||||
SDP_DeleteRecord(sdp_handle);
|
||||
sdp_handle = 0;
|
||||
BTC_TRACE_ERROR("%s() FAILED", __func__);
|
||||
BTC_TRACE_ERROR("%s() FAILED, status = %d", __func__, status);
|
||||
} else {
|
||||
bta_sys_add_uuid(service); /* UUID_SERVCLASS_MESSAGE_ACCESS */
|
||||
BTC_TRACE_DEBUG("%s(): SDP Registered (handle 0x%08x)", __func__, sdp_handle);
|
||||
}
|
||||
|
||||
return sdp_handle;
|
||||
}
|
||||
|
||||
/* Create a PBAP Client SDP record based on information stored in a bluetooth_sdp_pse_record */
|
||||
static int add_pbapc_sdp(const bluetooth_sdp_pce_record* rec)
|
||||
{
|
||||
UINT16 service = UUID_SERVCLASS_PBAP_PCE;
|
||||
UINT16 browse = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
|
||||
bool status = true;
|
||||
UINT32 sdp_handle = 0;
|
||||
|
||||
BTC_TRACE_DEBUG("%s(): scn 0x%02x, psm = 0x%04x\n service name %s", __func__,
|
||||
rec->hdr.rfcomm_channel_number, rec->hdr.l2cap_psm, rec->hdr.service_name);
|
||||
|
||||
if ((sdp_handle = SDP_CreateRecord()) == 0) {
|
||||
BTC_TRACE_ERROR("%s(): Unable to register PBAP Client Service", __func__);
|
||||
return sdp_handle;
|
||||
}
|
||||
|
||||
/* add service class */
|
||||
status &= SDP_AddServiceClassIdList(sdp_handle, 1, &service);
|
||||
|
||||
/* Add a name entry */
|
||||
status &= SDP_AddAttribute(sdp_handle,
|
||||
(UINT16)ATTR_ID_SERVICE_NAME,
|
||||
(UINT8)TEXT_STR_DESC_TYPE,
|
||||
(UINT32)(rec->hdr.service_name_length + 1),
|
||||
(UINT8 *)rec->hdr.service_name);
|
||||
|
||||
/* Add in the Bluetooth Profile Descriptor List */
|
||||
status &= SDP_AddProfileDescriptorList(sdp_handle,
|
||||
UUID_SERVCLASS_PHONE_ACCESS,
|
||||
rec->hdr.profile_version);
|
||||
|
||||
/* Make the service browseable */
|
||||
status &= SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse);
|
||||
|
||||
if (!status) {
|
||||
SDP_DeleteRecord(sdp_handle);
|
||||
sdp_handle = 0;
|
||||
BTC_TRACE_ERROR("%s() FAILED, status = %d", __func__, status);
|
||||
} else {
|
||||
bta_sys_add_uuid(service); /* UUID_SERVCLASS_MESSAGE_ACCESS */
|
||||
BTC_TRACE_DEBUG("%s(): SDP Registered (handle 0x%08x)", __func__, sdp_handle);
|
||||
@@ -663,14 +709,15 @@ static int btc_handle_create_record_event(int id)
|
||||
case SDP_TYPE_PBAP_PSE:
|
||||
handle = add_pbaps_sdp(&record->pse);
|
||||
break;
|
||||
case SDP_TYPE_PBAP_PCE:
|
||||
handle = add_pbapc_sdp(&record->pce);
|
||||
break;
|
||||
case SDP_TYPE_OPP_SERVER:
|
||||
handle = add_opps_sdp(&record->ops);
|
||||
break;
|
||||
case SDP_TYPE_SAP_SERVER:
|
||||
handle = add_saps_sdp(&record->sap);
|
||||
break;
|
||||
case SDP_TYPE_PBAP_PCE:
|
||||
// break; not yet supported
|
||||
default:
|
||||
BTC_TRACE_DEBUG("Record type %d is not supported",record->hdr.type);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user