573主模式無法獲取只有write屬性的UUID的句柄

????使用GATT_ReadUsingCharUUID()查找句柄,無法獲取write屬性的UUID句柄(返回0x01),獲取read屬性正常


可以通過下面方式 在service 發(fā)現(xiàn)后的,通過傳入service 的起始結束handle調(diào)用下面代碼去查詢:

result = GATT_DiscAllChars(centralConnHandle,centralSvcStartHdl,centralSvcEndHdl,centralTaskId);?



????
static?void?centralGATTDiscoveryEvent(?gattMsgEvent_t?*pMsg?){
????uint8_t?result?;
????PRINT("centralGATTDiscoveryEvent\r\n");
?????
????switch(ble_db_dis_state){
????????case?BLE_DISC_STATE_SVC:
????????????//?Service?found,?store?handles
????????????if?(?pMsg->method?==?ATT_FIND_BY_TYPE_VALUE_RSP?){
????????????????if(?pMsg->msg.findByTypeValueRsp.numInfo?>?0?){
????????????????????centralSvcStartHdl?=?ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
????????????????????centralSvcEndHdl?=?ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);
????????????????????//?Display?Profile?Service?handle?range
????????????????????PRINT("Found?Profile?Service?handle?:?%x?~?%x?\n",centralSvcStartHdl,centralSvcEndHdl);
????????????????}
????????????????if(?(?pMsg->hdr.status?==?bleProcedureComplete?)||(?pMsg->method?==?ATT_ERROR_RSP?)?){
??????????????????????if?(?centralSvcStartHdl?!=?0?){
??????????????????????????//central_db_dis_change_state(BLE_DISC_STATE_CHAR);??
??????????????????????????result?=?GATT_DiscAllChars(centralConnHandle,centralSvcStartHdl,centralSvcEndHdl,centralTaskId);???
??????????????????????????PRINT("GATT_DiscAllChars:%02x\r\n",result);?????
??????????????????????}
????????????????}
????????????}??????????????
????????????break;
????????case?BLE_DISC_STATE_CHAR:
????????????//?Characteristic?found,?store?handle
????????????if?(?pMsg->method?==?ATT_READ_BY_TYPE_RSP?){
????????????????if(pMsg->msg.readByTypeRsp.numPairs?>?0?){
????????????????????//centralCharHdl?=?BUILD_UINT16(?pMsg->msg.readByTypeRsp.pDataList[0],
????????????????????//???????????????????????????????pMsg->msg.readByTypeRsp.pDataList[1]?);
???????????????????
????????????????????//PRINT("Found?Characteristic?1?handle?:?%x?\n",centralCharHdl);
????????????????????//?Iterate?through?all?three?pairs?found.
????????????????????for(unsigned?char?i?=?0;?i?<?pMsg->msg.readByTypeRsp.numPairs?;?i++){
#if?0????????????????????????
????????????????????????????//characteristic?properties
????????????????????????????uint8_t?char_properties?=?pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len?*?i?+?2];
#endif????????????????????????????
????????????????????????????uint16_t?char_value_handle?=?BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len?*?i+3],?\
????????????????????????????????????????????????????????????pMsg->msg.readByTypeRsp.pDataList[pMsg->msg.readByTypeRsp.len?*?i?+?4]);
????????????????????????????//characteristic?uuid?length
????????????????????????????uint8_t?char_uuid_length?=?pMsg->msg.readByGrpTypeRsp.len?-?5;
?????????????????????????????
????????????????????????????//uuid
????????????????????????????uint8_t?*chat_uuid?=?&(pMsg->msg.readByGrpTypeRsp.pDataList[pMsg->msg.readByGrpTypeRsp.len?*?i?+?5]);??????????????????????????
????????????????????????????if(sizeof(write_uuid)?==?char_uuid_length){
????????????????????????????????if(tmos_memcmp(write_uuid,chat_uuid,char_uuid_length)){
????????????????????????????????????PRINT("write_uuid?found,handle:%02x\r\n",char_value_handle);
????????????????????????????????}else?if(tmos_memcmp(notify_uuid,chat_uuid,char_uuid_length)){
????????????????????????????????????PRINT("notify?uuid?found,handle:%02x\r\n",char_value_handle);
????????????????????????????????}
????????????????????????????}
????????????????????}
????????????????}
????????????????if((pMsg->hdr.status?==?bleProcedureComplete?)?||?(?pMsg->method?==?ATT_ERROR_RSP?)?){
????????????????????central_db_dis_change_state(BLE_DISC_STATE_CCCD);
????????????????????PRINT("BLE_DISC_STATE_CHAR?done\r\n");
????????????????}
????????????}??
????????????break;
??????case?BLE_DISC_STATE_CCCD:
????????if?(?pMsg->method?==?ATT_READ_BY_TYPE_RSP){
????????????if(pMsg->msg.readByTypeRsp.numPairs?>?0?){
????????????????centralCCCDHdl?=?BUILD_UINT16(?pMsg->msg.readByTypeRsp.pDataList[0],
?????????????????????????????????????????????pMsg->msg.readByTypeRsp.pDataList[1]?);
?
????????????????PRINT("Found?client?characteristic?configuration?handle?:?%x?\n",centralCCCDHdl);
????????????????central_enbale_notify(centralConnHandle,centralCCCDHdl);
????????????}
????????????//centralDiscState?=?BLE_DISC_STATE_IDLE;
????????????ble_db_dis_state?=?BLE_DISC_STATE_IDLE;
????????}?
????????break;
??????default:
????????????break;
????}
}



void pv_drv_ble_center_gatt_discovery_event( gattMsgEvent_t *pMsg )

{

? ? attReadByTypeReq_t req;

? ? struct pv_ble_center_uuid_st uuid;


//? ? pv_printf("-> %d, %02X, %04X/%04X\r\n", centralDiscState, pMsg->method, pMsg->msg.handleValueNoti.handle, pMsg->msg.handleValueInd.handle);


? ? pv_ble_center_control(PV_BLE_CENTER_PORT(1), PV_BLE_CENTER_CTRL_GET_UUID, &uuid);


? ? if ( pv_drv_ble_center.discovery_state == BLE_DISC_STATE_SVC )

? ? {

? ? ? ? // Service found, store handles

? ? ? ? if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&

? ? ? ? ? ? ?pMsg->msg.findByTypeValueRsp.numInfo > 0 )

? ? ? ? {

? ? ? ? ? ? pv_drv_ble_center.svc_start_handle = ATT_ATTR_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);

? ? ? ? ? ? pv_drv_ble_center.svc_end_handle = ATT_GRP_END_HANDLE(pMsg->msg.findByTypeValueRsp.pHandlesInfo,0);


? ? ? ? ? ? // Display Profile Service handle range

? ? ? ? ? ? PV_LOG_D("Found Profile Service, UUID handle range: %x ~ %x\r\n",pv_drv_ble_center.svc_start_handle, pv_drv_ble_center.svc_end_handle);


? ? ? ? ? ? pv_drv_ble_center.discovery_state = BLE_DISC_STATE_UUID;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? PV_LOG_W("Not Found Profile Service handle: %04X\r\n", uuid.server_uuid);

? ? ? ? }

? ? }

? ? else if (pv_drv_ble_center.discovery_state == BLE_DISC_STATE_UUID)

? ? {

? ? ? ? // If procedure complete

? ? ? ? if (pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP && pMsg->hdr.status == bleProcedureComplete)

? ? ? ? {

? ? ? ? ? ? if (pv_drv_ble_center.svc_start_handle != 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? PV_ASSERT(uuid.uuid_cnt);


? ? ? ? ? ? ? ? // Discover characteristic

? ? ? ? ? ? ? ? pv_drv_ble_center.discovery_state = 0;


? ? ? ? ? ? ? ? req.startHandle = pv_drv_ble_center.svc_start_handle;

? ? ? ? ? ? ? ? req.endHandle = pv_drv_ble_center.svc_end_handle;

? ? ? ? ? ? ? ? req.type.len = ATT_BT_UUID_SIZE;

? ? ? ? ? ? ? ? req.type.uuid[0] = LO_UINT16(uuid.uuid[pv_drv_ble_center.discovery_state].uuid);

? ? ? ? ? ? ? ? req.type.uuid[1] = HI_UINT16(uuid.uuid[pv_drv_ble_center.discovery_state].uuid);


? ? ? ? ? ? ? ? GATT_DiscCharsByUUID( pv_drv_ble_center.connect_handle, &req, centralTaskId );


? ? ? ? ? ? ? ? PV_LOG_D("Set Fonud UUID (%02X%02X)\r\n", req.type.uuid[1], req.type.uuid[0]);

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? else if (pv_drv_ble_center.discovery_state < uuid.uuid_cnt)

? ? {

? ? ? ? // Characteristic found, store handle

? ? ? ? if ( pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0 )

? ? ? ? {

? ? ? ? ? ? pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].uuid = uuid.uuid[pv_drv_ble_center.discovery_state].uuid;

? ? ? ? ? ? pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].event = PV_BIT(pv_drv_ble_center.discovery_state);

? ? ? ? ? ? pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].cb = uuid.uuid[pv_drv_ble_center.discovery_state].cb;

? ? ? ? ? ? pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].permission = uuid.uuid[pv_drv_ble_center.discovery_state].permission;

? ? ? ? ? ? pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].handle = BUILD_UINT16( pMsg->msg.readByTypeRsp.pDataList[0], pMsg->msg.readByTypeRsp.pDataList[1] );


? ? ? ? ? ? // Start do read or write

? ? ? ? ? ? tmos_start_task( centralTaskId, pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].event, DEFAULT_READ_OR_WRITE_DELAY);


? ? ? ? ? ? // Display uuid handle

? ? ? ? ? ? PV_LOG_D("Found uuid (%04X) handle : %04x\r\n", uuid.uuid[pv_drv_ble_center.discovery_state].uuid, pv_drv_ble_center_uuid[pv_drv_ble_center.discovery_state].handle);

//? ? ? ? ? ? PV_LOG_D("permission: %d, %d/%d\r\n", uuid.uuid[centralDiscState].permission, centralDiscState, uuid.uuid_cnt);


? ? ? ? ? ? if (++pv_drv_ble_center.discovery_state >= uuid.uuid_cnt)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pv_drv_ble_center.lock = FALSE;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? // Found next uuid handle

? ? ? ? else if ((pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->hdr.status == bleProcedureComplete) ||

? ? ? ? ? ? ? ? ? pMsg->method == ATT_ERROR_RSP)

? ? ? ? {

? ? ? ? ? ? // Discover characteristic

? ? ? ? ? ? req.startHandle = pv_drv_ble_center.svc_start_handle;

? ? ? ? ? ? req.endHandle = pv_drv_ble_center.svc_end_handle;

? ? ? ? ? ? req.type.len = ATT_BT_UUID_SIZE;

? ? ? ? ? ? req.type.uuid[0] = LO_UINT16(uuid.uuid[pv_drv_ble_center.discovery_state].uuid);

? ? ? ? ? ? req.type.uuid[1] = HI_UINT16(uuid.uuid[pv_drv_ble_center.discovery_state].uuid);


? ? ? ? ? ? GATT_DiscCharsByUUID( pv_drv_ble_center.connect_handle, &req, centralTaskId );


? ? ? ? ? ? PV_LOG_D("Set Fonud UUID (%02X%02X)\r\n", req.type.uuid[1], req.type.uuid[0]);

? ? ? ? }

? ? }

}


結論:

GATT_DiscCharsByUUID(), 可以拿到UUID句柄,可參考開源項目:https://gitee.com/zhsing/pvt/tree/wch/


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频