nrf51822-主从通信分析1
建議看該教程前,先看一下? 簡單掃描器實現? 教程
講解基于sdk目錄下central中的兩個例子。
?
關于主機的程序框架其實和從機都是一樣的,都是基于事件驅動的框架。 Main函數中完成初始化, 從機的話就啟動廣播,主機就啟動掃描。 之后都是基于事件驅動的方式將ble相關事件返回給上層app,并且再通過ble_evt_dispatch函數將事件分發給各個處理函數。如下圖所示:
藍牙的使用無非就是 進行數據的通信,從機通常都是作為服務端(一次數據交互中數據的提供者),而主機通常都是作為客戶端(一次數據交互中數據的使用者)。(并不是固定的,從機也可以作為客戶端,主機也可以作為服務端。 從機和主機的概念是針對鏈路層來說的,而客戶端和服務端是針對GATT層來說的。)
之前的教程中 從機例子中 都是作為服務端的,所以我們發送數據給手機時都是使用notify方式或者indication方式并通過sd_ble_gatts_hvx函數發送。
?
而這里主機例子ble_app_multilink_central,是作為客戶端的,客戶端不僅可以發數據給服務端,也可以從服務端讀取數據。 所以 有 讀寫函數,如下圖
?
先說明sdk中主從demo的現象,分別燒錄其中的主從例子在兩個開發板中,打開主機和從機便會自動連接,連接上后 按從機的button0,主機上就會根據連接時的順序翻轉對應燈的狀態。
比如你有三個開發板,一個主機兩個從機,當你全部打開時,假設A設備先連接上,B設備后連接上。那么你按A的button0按鍵時,主機的第一個燈就會狀態反轉,你按B的button0時,主機就會反轉第二個燈的狀態。
?
Sdk中的demo主機時可以連接8個從機的,不過因為板子的led有限你只能看到四個從機連接后 按鍵時 主機的燈會對應亮。
PS:demo中的例子是針對PCA10028板子的,如果你的板子的按鍵,LED燈不兼容這個板子的話對應你的板子改下就行了。
?
?
?
下面來分析sdk中的主從通信demo是如何建立連接并通信的。解決一下幾個問題:
1:主機怎么判斷哪個從機是我要連接的那個設備?
2:如何實現連接多個設備?
3:因為連接上后 從機上按鍵時會通過notify發送數據給主機,所以主機需要先 使能從機上的notify功能,具體就是寫從機上的 CCCD(客戶端特性配置描述?????? 符) 描述符。該功能如何實現?
4:連接上后如何通信?
?
下面首先解決第一個問題:主機怎么判斷哪個從機是我要連接的那個設備。
?
在從機工程ble_app_multilink_peripheral中,看以看到其設置了自己的設備名為Multilink。
?
在主機工程ble_app_multilink_central 當初始化完成后就會調用 scan_start() 開始監聽BLE廣播,每當監聽到BLE廣播時協議棧就會給上層一個 廣播事件, 該事件由ble_evt_dispatch派發函數遞交給on_ble_evt函數。
?
在on_ble_evt中會對提取廣播數據中的設備名字,并且判斷設備是不是Multilink,如果是就啟動停止掃描,并且連接改設備,如下圖所示
?
所以 主機判斷廣播設備是不是自己想要連接的就是通過 名字來判斷的。
?
第二個問題:如何實現可以連接多個設備
?
第一個問題中找到了如何識別廣播設備是不是自己想連的方式,當找到了名字為Multilink設備后就關閉掃描偵聽而發起連接,也就是這個時候主機已經不能再監聽別的ble設備的廣播了,自然也就不能再和別的設備發起連接了(因為沒收到廣播不知道對方設備地址),
?
因為demo中主機可以連接8個從機,那么如果能夠繼續 啟動掃描偵聽,并且周圍還有別的廣播設備,并且其名字也是Multilink,那么收到該廣播時,就能夠在廣播事件處理函數再次對這第二個設備發起連接。
所以主機例子中雖然在找到了一個設備名為Multilink的設備后會關閉掃描并且發起連接,但是當這個連接完成后在收到連接事件時 會做當前連接的設備是否已經大于最大可連接數,不過沒有超過那么就會再次開啟廣播。 這樣就可以再次鏈接其他設備名為Multilink的設備了。如下圖所示。
?
?
PS:這里的 device_manager_event_handler函數并不是由派發函數ble_evt_dispatch調用的,而是派發函數ble_evt_dispatch先調用了dm_ble_evt_handler(p_ble_evt),而該函數內部會調用device_manager_event_handler
函數關系鏈如下:main中首先調用了device_manager_init()初始化函數,該初始化函數會將device_manager_event_handler函數設置為回調函數。
當連接完成后ble_evt_dispatch函數將 連接事件 派發給dm_ble_evt_handler 函數,改函數中判斷如果當前收到的事件是 連接事件就內部 設定了一個DM_EVT_CONNECTION事件然后調用之前注冊的device_manager_event_handler這個回調函數,來最終處理關于連接事件的后續工作,也就是上面提到的,判斷是否要繼續開啟廣播。?
總結
以上是生活随笔為你收集整理的nrf51822-主从通信分析1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE-NRF51822-实现简单扫描器
- 下一篇: nrf51822-主从通信分析2