CC2540的主機程序爲我們提供了事件回調函數,即static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent ),所謂的回調函數是在GAP狀態發生改變時調用,用來對GAP初始化、設備發現、設備連接、斷開連接等事件進行處理。該函數是在設備初始化階段註冊的。
我們跟蹤simpleBLERoleCB進行查看:
也就是在這個事件處理的過程中一共註冊了兩個回調函數,分別是RSSI回調和事件回調。我們主要看事件回調函數。
回調函數採用switch語句實現,現在我們對他的各個情況進行分析。
1、GAP_DEVICE_INIT_DONE_EVENT
初始化完成事件,它是在GAPCentralRole_StartDevice初始化完成後執行的:
2、GAP_DEVICE_INFO_EVENT:
第一個if語句開啓UUID過濾器。第二個if語句在接收到的pEvtData中查找SIMPLEPROFILE_SERV_UUID,如果查找到就保留地址和類型。需要提醒的一點是在這個函數後面我們也可以提取pEvtData中的其他數據。比如可以把一些數據放到廣播中發出來,然後再這個地方進行接收。這就免去了連接的麻煩。
3、GAP_DEVICE_DISCOVERY_EVENT:
在第一個if語句中,如果沒有開啓UUID的過濾器,就把底層接收到到的消息傳到列表中。消息中包含着從機的地址、類型、數據信息等。下面的代碼是在LCD中顯示。
4、GAP_LINK_ESTABLISHED_EVENT:
如果設備連接成功,那麼就把參數改成設備連接成功的參數並且如果句柄值沒有讀到過,則進行發現服務事件。如果連接失敗,就把連接參數改爲空閒的狀態。
5、GAP_LINK_TERMINATED_EVENT
連接參數全部設爲空閒時的值。
6、GAP_LINK_PARAM_UPDATE_EVENT
進行參數更新,在GAPCentralRole_UpdateLink函數執行後調用。