0.前言
隨着醫療健康、可穿戴設備的發展,華爲、小米、vivo等大廠都在做智能手環、手錶等可穿戴設備。未來,藍牙設備的開發也會越來越多。
關於藍牙BLE起源發展,各種類型藍牙芯片介紹,以及藍牙手環的硬件開發等在之前的文章已經有過詳細介紹。
本文主要介紹藍牙手環開發中,如何構建一個最小的BLE系統框架,以及使用的模塊。
總結一句話:能讓芯片的藍牙協議棧跑起來,手機能連接上藍牙手環設備。
要讓藍牙功能跑起來,需要將注意力放在BLE開發的程序框架和模塊的整體功能上,之後再深入學習各個模塊。
1.BLE程序框架
智能手環的核心除了各種傳感器算法,最重要的就是藍牙了。一個BLE程序通常至少包含4個必要部分:系統初始化、啓動、空閒管理和事件處理。如下圖所示。
(1)系統初始化
這個系統初始化看起來很簡單,小學生貌似都能懂,不就是初始化系統嗎?
的確是初始化系統,那需要初始化什麼呢?
a.日誌打印初始化:說白了就是爲了方便我這種開發狗看上電啓動的Log信息以及後續輸出調試信息。不是必須的,但很重要。
b.APP定時器初始化:初始化APP定時器,用於實現各種定時任務。很重要。
c.硬件初始化:如指示燈初始化、OLED屏幕初始化、電源管理初始化等。
d.BLE相關初始化:包含藍牙協議棧初始化、廣播、首選連接參數、GAP層、服務等初始化配置。這部分初始化完成後,整個BLE部分的程序就會按照我們自己設置的參數運行。
(2)啓動
對於外圍設備來說,如手環,啓動的是廣播,啓動之後系統開始按照配置的廣播間隔開始發送廣播,等待中心設備連接,也就是等待手機連接。
對於中心設備(手機)而言,啓動的是掃描,掃描周圍的藍牙設備。
(3)空閒管理
空閒管理說白了就是爲了省電,實現低功耗。你戴個手環,總不希望天天充電吧。空閒管理就是在你不看手環時候讓手環進入到低功耗模式。若有事件喚醒,如擡手腕亮屏等,就會恢復工作模式。
若程序中啓用了日誌打印功能,空閒管理還處理掛起的日誌信息。
(4)事件處理
應用程序通過註冊“事件監聽”來監視BLE協議棧事件。開發過Android就比較容易理解,如Button就需要監聽,看看Button是否按下等。
藍牙中如外圍設備和中心設備連接後,SoftDevice會提交 “連接事件”,應用程序會在事件處理函數中接收該事件並執行操作。
對於一開始接觸藍牙開發的人而言,看完這些感到一絲絲懵逼也是很正常的。開發過藍牙的話,這些就很容易理解了。
沒關係,下面開始實戰。
本次開發選用 Nordic nRF52832藍牙芯片,相關開發板某寶也有很多賣。關於Nordic芯片之前的文章有過介紹,翻閱歷史文章。
2.先看Main函數
Main函數中主要調用各個模塊的初始化函數,如硬件初始化、IIC屏幕初始化等,這些模塊初始化本文暫不深入,主要是講藍牙架構。其中最重要的是藍牙初始化。
弄懂了藍牙初始化,藍牙就能跑起來。
int main(void)
{
//Log 初始化
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("log init ok.");
NRF_LOG_FLUSH();
//硬件初始化,APP timer,led,power Manager等
my_ble_init_harder();
//twi初始化,iic設備掃描,iic_sacn.c
iic_scan_address();
nrf_delay_ms(2000);
//藍牙初始化
my_ble_init();
}
//藍牙初始化函數
void my_ble_init(void)
{
NRF_LOG_INFO("Hello world BLE developer\n");
NRF_LOG_INFO("BLE Template example:Log use uart as output terminal");
//初始化協議棧
ble_stack_init();
NRF_LOG_INFO("ble_stack_init()...OK");
//配置GAP參數
gap_params_init();
NRF_LOG_INFO("gap_params_init()...OK");
//初始化GATT
gatt_init();
NRF_LOG_INFO("gatt_init()...OK");
//初始化廣播
advertising_init();
NRF_LOG_INFO("advertising_init()...OK");
//初始化服務
services_init();
NRF_LOG_INFO("services_init()...OK");
//連接參數協商初始化
conn_params_init();
NRF_LOG_INFO("conn_params_init()...OK");
//ble_address_change_test();
//啓動app time定時器
NRF_LOG_INFO("BLE HRS example started.");
application_timers_start();
//啓動廣播
NRF_LOG_INFO("advertising_starting...");
advertising_start();
//主循環
while(true)
{
//OLED 顯示
my_oled_iic();
//處理掛起的LOG和運行電源管理
idle_state_handle();
}
}
3.藍牙初始化
如上面代碼,藍牙初始化,包括初始化藍牙協議棧,配置GAP參數,初始化GATT,初始化廣播,初始化服務,連接參數初始化,啓動廣播,主循環。完成這些,手環藍牙芯片就能夠發廣播了,打開手機藍牙就能夠搜索到。
當然,這些初始化函數也是有很多內容的,也是非常關鍵的。實際藍牙手環的代碼複雜的多,需要花時間和精力去探索。
4.總結
至於每個初始化函數的代碼怎麼寫,還有廣播參數等等,後面文章會逐一介紹。
畢竟一下子寫的太長,也沒人有耐心看下去。本文主要介紹藍牙程序框架,以及跑起整個藍牙時候大致的流程。
欲窮千里目,更上一層樓。瞭解整個架構,後續開發會輕鬆許多。
白浪介紹:
(1)關於射頻、微波、天線、無線通信、智能硬件、軟件編程、滲透安全、人工智能、區塊鏈,Java、Android、C/C++、python等綜合能力的培養提升。
(2)各種學習資料、學習軟件分享。
(3) 關注後,查看往期博客內容,會有更多技術文章
========******=========******========******=========******==========