TI BLE CC2541 關於Notification的設置及應用

注:本文的主要目的是爲了記錄自己的學習過程,也方便與大家做交流。轉載請註明來自:

http://blog.csdn.net/ab198604



一、修改從機端代碼(Server端):
A 對Profile的修改
如果要使用Notification或Indification方法,必須在Profile中添加configuration,如下:

其中, clientCharCfgUUID值如下,它是uint16類型的值,具體表示爲GATT_CLIENT_CHAR_CFG_UUID宏的值

#define GATT_CLIENT_CHAR_CFG_UUID 0x2902 

說白了,上面在profile中添加的configuration的UUID爲GATT_CLIENT_CHAR_CFG_UUID (0x2902),主機若一搜到就知道它指的是什麼了(當然是notification)
需要主機的client端對它進行打開通知操作後,從機才能notification通知到主機client.

B 初始化這個client配置特徵表

當然是調用這個了。不過在例程中並不是直接調用,而是在回調函數中被執行調用。

上面這個函數是個回調函數,它是在下面函數中註冊的。

linkDB_Register()函數中,simpleProfile_HandleConnStatusCB作爲參數進行註冊。
下面看看linkDB_Register接口的含義:

也就是說當底層的鏈路連接狀態發生變化時回調函數就會被執行,也就是說,如果未來主從建立連接,斷開連接等狀態,此回調函數就會被觸發,而在回調中繼續執行client配置表的初始化操作。
雖然過程比較曲折,不過最終目標是執行了初始化。


C Client端需要打開Server端的Notification通知功能
這裏當然不是講在client如何打開這個通知。而是Server端在接收到這個打開通知請求後的處理流程。需要弄明白以下幾個問題:
(1)client什麼時候打開這個通知? ---anytime.... 一般連接建立後,根據具體的業務,找到它的Handle後直接打開
(2)client通過什麼方式打開?  ----當然是要發數據包了,當然是發write命令
(3)client對什麼write? ----- 還記得上面提到的GATT_CLIENT_CHAR_CFG_UUID(0x2902)嗎?通過這個UUID找到它的HANDLE,然後對這個Handle進行寫操作。

上面幾個問題弄幾白了,後面思路就清楚了,既然是對Server進行write,那麼Server的Write回調將會被執行。

TI CC2541軟件開發指南中有如下英文描述,上面執行的代碼就是打開通知。GATT_CLIENT_CFG_NOTIY宏爲0x0001


一旦操作成功後,如果Server要想主動的給Client發數據,只需要調用SimpleProfile_SetParameter方法即可。


D Server端主動通知Client
下面來看看這個方法的實現:

如果是操作CHAR4,則會調用GATTServApp_ProcessCharCfg()方法,這是一個間接的notification方式。

注:上面代碼中最好加入是否添加NOTIFICATION開關通知的判斷,如果client沒有打開,則不允許主動通知
  1. value  = GATTServApp_ReadCharCfg( connHandle, simpleProfileChar6Config );//讀出CCC的值  
  2.   
  3.   if ( value & GATT_CLIENT_CFG_NOTIFY ) //判斷是否打開通知開關,打開了則發送數據  
  4.   {  
  5.     noti.handle = simpleProfileAttrTbl[ATTRTBL_CHAR6_IDX].handle;  
  6.     noti.len = len;  
  7.     osal_memcpy( noti.value, pValue, len);       //數據  
  8.     GATT_Notification( connHandle, &noti, FALSE );  
  9.   }  


E Server端實例演示,代碼如下:





二、修改主機端代碼(Client)
A 通過Server端Client Config的UUID獲取其Handle
使用接口GATT_DiscCharsByUUID()來獲取相應的Handle

B 開啓Notification功能
使用接口GATT_WriteCharValue
前期先通過A操作獲取到對應的Handle,這個handle一般是characteristic value的handle+1,句柄的順序是characteristic declaration, characteristic  value, 然後是 CCC.
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 );



C 接收來自Server的Notification消息
當Client端接收到來自對方的消息,系統會產生一個事件GATT_MSG_EVENT告之,
方法如下:

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

發佈了84 篇原創文章 · 獲贊 63 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章