|
原来一直用的做从机,没有调试过sdp,现在想调试多主多从,才开始调试sdp这部分,
host_att_discoveryService 函数返回超时了,在host_att_discoveryService 中调用的blc_gatt_pushReadByTypeRequest, blc_gatt_pushReadByTypeRequest接口返回值是成功的,
ble_sts_t host_att_discoveryService (u16 handle, att_db_uuid16_t *p16, int n16, att_db_uuid128_t *p128, int n128)
{
att_db_uuid16_t *ps16 = p16;
att_db_uuid128_t *ps128 = p128;
int i16 = 0;
int i128 = 0;
ps16->num = 0;
ps128->num = 0;
// char discovery: att_read_by_type
// hid discovery: att_find_info
u8 dat[256];//according to MTU to set size.//MTU_M_BUFF_SIZE_MAX
u16 s = 1;
u16 uuid = GATT_UUID_CHARACTER;
do {
dat[6] = ATT_OP_READ_BY_TYPE_REQ;
if (app_char_discovery(dat, handle, s, 0xffff, (u8 *)&uuid, 2)) // 1s
{
return GATT_ERR_SERVICE_DISCOVERY_TIEMOUT; //timeout
}
// process response data
ble_att_readByTypeRsp_t *p_rsp = (ble_att_readByTypeRsp_t *) dat;
if (p_rsp->opcode != ATT_OP_READ_BY_TYPE_RSP)
{
break;
}
if (p_rsp->datalen == 21) //uuid128
{
u8 *pd = p_rsp->data;
while(p_rsp->l2capLen > 21){
s = pd[3] + pd[4] * 256;
if (i128 < n128)
{
p128->property = pd[2];
p128->handle = s;
memcpy (p128->uuid, pd + 5, 16);
i128++;
p128++;
}
p_rsp->l2capLen -= 21;
pd += 21;
}
}
else if (p_rsp->datalen == 7) //uuid16
{
u8 *pd = p_rsp->data;
while (p_rsp->l2capLen > 7)
{
s = pd[3] + pd[4] * 256;
if (i16 < n16)
{
p16->property = pd[2];
p16->handle = s;
p16->uuid = pd[5] | (pd[6] << 8);
p16->ref = 0;
i16 ++;
p16++;
}
p_rsp->l2capLen -= 7;
pd += 7;
}
}
} while (1);
ps16->num = i16;
ps128->num = i128;
//--------- use att_find_info to find the reference property for hid ----------
p16 = ps16;
for (int i=0; i<i16; i++)
{
if (p16->uuid == CHARACTERISTIC_UUID_HID_REPORT) //find reference
{
dat[6] = ATT_OP_FIND_INFORMATION_REQ;
if (app_find_char_info(dat, handle, p16->handle, 0xffff)) // 1s
{
return GATT_ERR_SERVICE_DISCOVERY_TIEMOUT; //timeout
}
ble_att_findInfoRsp_t *p_rsp = (ble_att_findInfoRsp_t *) dat;
if (p_rsp->opcode == ATT_OP_FIND_INFO_RSP && p_rsp->format == 1)
{
int n = p_rsp->l2capLen - 2;
u8 *pd = p_rsp->data;
while (n > 0)
{
if ((pd[2]==U16_LO(GATT_UUID_CHARACTER) && pd[3]==U16_HI(GATT_UUID_CHARACTER)) ||
(pd[2]==U16_LO(GATT_UUID_PRIMARY_SERVICE) && pd[3]==U16_HI(GATT_UUID_PRIMARY_SERVICE)) )
{
break;
}
if (pd[2]==U16_LO(GATT_UUID_REPORT_REF) && pd[3]==U16_HI(GATT_UUID_REPORT_REF))
{
//----------- read attribute ----------------
dat[6] = ATT_OP_READ_REQ;
if(app_read_char_value(dat, handle, pd[0])){
return GATT_ERR_SERVICE_DISCOVERY_TIEMOUT; //timeout
}
ble_att_readRsp_t *pr = (ble_att_readRsp_t *) dat;
if (pr->opcode == ATT_OP_READ_RSP)
{
p16->ref = pr->value[0] | (pr->value[1] << 8);
}
break;
}
n -= 4;
pd += 4;
}
}
} //----- end for if CHARACTERISTIC_UUID_HID_REPORT
p16++;
}
return BLE_SUCCESS;
}
|
|