本篇博客根據韋東山的視頻,整理所得。
本篇博客講解BTStack的框架,首先來看一下硬件的結構:
藍牙模塊接在電腦上,或是接在開發板上。不論接在哪,我們都需要編寫程序來控制這個藍牙模塊。
1. 我們需要發送數據給藍牙模塊
需要發送命令給藍牙模塊,比如讓它發出無線信號去掃描、識別、連接、讀寫附近的藍牙設備
2. 需要從藍牙模塊獲得數據
3. 需要處理獲得的數據
上述3步驟可以簡化為一個循環:
1.讀取數據:可以讀取用戶輸入的指示,也可以讀取藍牙模塊的數據
2.處理數據:根據用戶的指示發送數據給藍牙模塊,或處理從藍牙模塊讀到的數據
要點是:硬件操作、循環、處理
這個循環就是程序的核心,BTStack最重要的東西就在那個循環里面。
BTStack支持多種操作系統,比如說它支持widows,linux。它支持多種接口的藍牙模塊,比如說usb口、比如說串口。
無論怎樣,在程序中應該有一個循環,在windows系統中,它利用的是btstack_run_loop_windows.c來實現了一個循環,在循環內部它去等待讀取硬件數據,得到數據后再進行處理。
對於linux操作系統,它在btstack_run_loop_posix.c中是實現了一個循環,在循環內部它去等待讀取硬件數據,得到數據后再進行處理。
BTStack支持多OS,多接口硬件
1)操作硬件
2)循環
a. 接收(涉及硬件操作。因為它支持多接口的硬件,顯然在循環之前必須要打開硬件)
b. 處理
在循環建立之前,有個main.c,main.c中有個main函數。這個main函數處於不同的文件里面(不同的硬件接口以及操作系統,main.c所處的文件都是不同的。可以從上面的幾幅圖可以看出來)。不同文件中的main.c中的main函數回去操作不同的硬件。然后再去創建一個循環。
操作硬件以及創建循環所涉及的源文件如下:
在循環中最重要的一步就是處理,處理才是關鍵,那么如何處理呢?
要發送數據時,通過HCI這一層把數據發送給藍牙模塊,接收數據時也是通過HCI這一層從藍牙模塊里面獲取數據。接收到數據之后要進行處理,在HCI這一層可以進行處理。在L2CAP層可以處理自己感興趣的數據。同樣,上面的各個層都可以處理自己感興趣的數據,因此都可以提供處理數據的函數。最上面的APP也可以提供處理函數。
在循環里面,從藍牙模塊里面獲取數據,然后依次調用各個層次提供的處理函數,在這些處理函數里面它會分辨那些數據,如果對數據感興趣就去處理,不感興趣就不管。
總結:
最重要的就是對數據的處理,這分為2部分:
1. 藍牙協議棧各層處數據的處理
比如說向藍牙模塊發送什么命令,它返回什么數據,這是由藍牙協議規定的。
2. APP對數據的處理
藍牙協議棧各層、APP,提供自己的處理函數,在循環體里獲得數據后,將依次調用這些處理函數。各個處理函數自行解析數據,如果感興趣就處理,不感興趣就直接返回。
在不同的操作系統、不同接口的藍牙模塊見上面的圖,所涉及的源文件:
① 操作系統相關的代碼
② 不同接口相關的代碼
③ 藍牙協議棧相關的代碼
④ APP相關的代碼
對於不同的操作系統、不同的硬件接口,main函數來自不同的文件:
1.main函數會調用操作系統相關的代碼(下圖中的①)、硬件接口相關的代碼(下圖中的②),進行初始化。
2.然后調用btstack_main函數:不同的APP提供自己的btstack_main函數。