以CH583EVT里面的代碼為例子(實現通道讀寫控制的講解)


if(events & START_READ_OR_WRITE_EVT) //對0xFFE1 屬性通道的讀寫操作 { if(centralProcedureInProgress == FALSE) { if(centralDoWrite) //自定義標志,用於演示讀寫交替 { // Do a write attWriteReq_t req; req.cmd = FALSE; req.sig = FALSE; req.handle = centralCharHdl; //屬性0xFFE1的handle值 req.len = 1; req.pValue = GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0); //申請內存 if(req.pValue != NULL) { *req.pValue = centralCharVal; //發送數賦值 if(GATT_WriteCharValue(centralConnHandle, &req, centralTaskId) == SUCCESS) //啟動寫,判斷返回值,0成功,非0失敗 { centralProcedureInProgress = TRUE; centralDoWrite = !centralDoWrite; //成功,翻轉自定義標志,下個任務啟動read 讀 tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY); //重新啟動任務 } else { GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ); //失敗,主動手動釋放內存 } } } else //讀read操作 { // Do a read attReadReq_t req; req.handle = centralCharHdl; //屬性0xFFE1的handle值 if(GATT_ReadCharValue(centralConnHandle, &req, centralTaskId) == SUCCESS) //讀數據,並判斷返回值,0成功,非0失敗 { centralProcedureInProgress = TRUE; centralDoWrite = !centralDoWrite; //成功翻轉自定義標志,下一次進行寫write演示 } } } return (events ^ START_READ_OR_WRITE_EVT); }
if(events & START_WRITE_CCCD_EVT) //0xFFE4通道Notify通知 { if(centralProcedureInProgress == FALSE) { // Do a write attWriteReq_t req; req.cmd = FALSE; req.sig = FALSE; req.handle = centralCCCDHdl; //屬性0xFFE4通道的Notify handle值 req.len = 2; req.pValue = GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0); //內存申請 if(req.pValue != NULL) { req.pValue[0] = 1; req.pValue[1] = 0; if(GATT_WriteCharValue(centralConnHandle, &req, centralTaskId) == SUCCESS) //發送 { centralProcedureInProgress = TRUE; } else { GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ); //釋放內存 } } } return (events ^ START_WRITE_CCCD_EVT); }

其中最關鍵的是handle值,handle值獲取的方法如下
case GAP_LINK_ESTABLISHED_EVENT: //連接建立以后 { tmos_stop_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT); if(pEvent->gap.hdr.status == SUCCESS) { centralState = BLE_STATE_CONNECTED; centralConnHandle = pEvent->linkCmpl.connectionHandle; centralProcedureInProgress = TRUE; // Initiate service discovery tmos_start_task(centralTaskId, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY); //執行 START_SVC_DISCOVERY_EVT 任務 // See if initiate connect parameter update if(centralParamUpdate) { tmos_start_task(centralTaskId, START_PARAM_UPDATE_EVT, DEFAULT_PARAM_UPDATE_DELAY); } // See if start RSSI polling if(centralRssi) { tmos_start_task(centralTaskId, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD); } PRINT("Connected...\n"); }
if(events & START_SVC_DISCOVERY_EVT) { // start service discovery centralStartDiscovery(); //執行handle值解析 return (events ^ START_SVC_DISCOVERY_EVT); }
static void centralStartDiscovery(void) { uint8_t uuid[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)}; //設置服務的UUID // Initialize cached handles centralSvcStartHdl = centralSvcEndHdl = centralCharHdl = 0;//handle值全局變量,初始化0 centralDiscState = BLE_DISC_STATE_SVC; //設置狀態 // Discovery simple BLE service 啟動發現服務函數 GATT_DiscPrimaryServiceByUUID(centralConnHandle, uuid, ATT_BT_UUID_SIZE, centralTaskId); }
static void centralGATTDiscoveryEvent(gattMsgEvent_t *pMsg) { attReadByTypeReq_t req; if(centralDiscState == BLE_DISC_STATE_SVC) //上面這個函數剛剛置這個標志 { // Service found, store handles if(pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP && 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); //服務handle范圍 } // If procedure complete if((pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP && pMsg->hdr.status == bleProcedureComplete) || (pMsg->method == ATT_ERROR_RSP)) { if(centralSvcStartHdl != 0) { // Discover characteristic centralDiscState = BLE_DISC_STATE_CHAR; req.startHandle = centralSvcStartHdl; req.endHandle = centralSvcEndHdl; req.type.len = ATT_BT_UUID_SIZE; req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID); req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID); //准備獲取0xFFE1的handle值 GATT_ReadUsingCharUUID(centralConnHandle, &req, centralTaskId); } } } else if(centralDiscState == BLE_DISC_STATE_CHAR) { // Characteristic found, store handle if(pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0) { centralCharHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0], pMsg->msg.readByTypeRsp.pDataList[1]); // Start do read or write tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY); // Display Characteristic 1 handle PRINT("Found Characteristic 1 handle : %x \n", centralCharHdl); //0xFFE1的handle值 } if((pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->hdr.status == bleProcedureComplete) || (pMsg->method == ATT_ERROR_RSP)) { // Discover characteristic centralDiscState = BLE_DISC_STATE_CCCD; req.startHandle = centralSvcStartHdl; req.endHandle = centralSvcEndHdl; req.type.len = ATT_BT_UUID_SIZE; req.type.uuid[0] = LO_UINT16(GATT_CLIENT_CHAR_CFG_UUID); req.type.uuid[1] = HI_UINT16(GATT_CLIENT_CHAR_CFG_UUID); GATT_ReadUsingCharUUID(centralConnHandle, &req, centralTaskId); } } else if(centralDiscState == BLE_DISC_STATE_CCCD) { // Characteristic found, store handle if(pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0) { centralCCCDHdl = BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[0], pMsg->msg.readByTypeRsp.pDataList[1]); centralProcedureInProgress = FALSE; // Start do write CCCD tmos_start_task(centralTaskId, START_WRITE_CCCD_EVT, DEFAULT_WRITE_CCCD_DELAY); // Display Characteristic 1 handle PRINT("Found client characteristic configuration handle : %x \n", centralCCCDHdl); //獲取notify 0xFFE4通道的handle值 } centralDiscState = BLE_DISC_STATE_IDLE; } }

