- value = GATTServApp_ReadCharCfg( connHandle, simpleProfileChar6Config );//讀出CCC的值
- if ( value & GATT_CLIENT_CFG_NOTIFY ) //判斷是否打開通知開關,打開了則發送數據
- {
- noti.handle = simpleProfileAttrTbl[ATTRTBL_CHAR6_IDX].handle;
- noti.len = len;
- osal_memcpy( noti.value, pValue, len); //數據
- GATT_Notification( connHandle, ¬i, FALSE );
- }
CCC是指Client Characteristic Configuration 的這個descriptor.
下面是個例子:
attWriteReq_t writeReq;
writeReq.handle = 0x002f;
writeReq.len = 2;
writeReq.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); // 0x01 【1:開啓Notification 0:關閉Notify】
writeReq.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY); // 0x00 【1:開啓Indification 0:關閉Indi】
writeReq.sig = 0;
writeReq.cmd = 0;
GATT_WriteCharValue( simpleBLEConnHandle, &writeReq, simpleBLETaskId );
static void simpleBLECentralProcessGATTMsg( gattMsgEvent_t *pMsg )所有通過藍牙發送的數據都會讓GATT這個函數來處理.因此,發送的數據就到這裏了。gattMsgEvent_t是個很大的聯合體代碼中都有註釋,只要找到相應的結構體就行了。
typedef union
{
// Request messages
attExchangeMTUReq_t exchangeMTUReq; //!<
ATT Exchange MTU Request
attFindInfoReq_t findInfoReq; //!<
ATT Find Information Request
attFindByTypeValueReq_t findByTypeValueReq; //!<
ATT Find By Type Vaue Request
attReadByTypeReq_t readByTypeReq; //!<
ATT Read By Type Request
attReadReq_t readReq; //!<
ATT Read Request
attReadBlobReq_t readBlobReq; //!<
ATT Read Blob Request
attReadMultiReq_t readMultiReq; //!<
ATT Read Multiple Request
attReadByGrpTypeReq_t readByGrpTypeReq; //!<
ATT Read By Group Type Request
attWriteReq_t writeReq; //!<
ATT Write Request
attPrepareWriteReq_t prepareWriteReq; //!<
ATT Prepare Write Request
attExecuteWriteReq_t executeWriteReq; //!<
ATT Execute Write Request
gattReadByTypeReq_t gattReadByTypeReq; //!<
GATT Read By Type Request
gattWriteLongReq_t gattWriteLongReq; //!<
GATT Long Write Request
gattReliableWritesReq_t gattReliableWritesReq; //!< GATT Reliable Writes Request
// Response messages
attErrorRsp_t errorRsp; //!<
ATT Error Response
attExchangeMTURsp_t exchangeMTURsp; //!<
ATT Exchange MTU Response