智能手環開發之 實現藍牙(BLE)基本功能

0.前言

隨著醫療健康、可穿戴設備的發展,華為、小米、vivo等大廠都在做智能手環、手錶等可穿戴設備。未來,藍牙設備的開發也會越來越多。

關於藍牙BLE起源發展,各種類型藍牙芯片介紹,以及藍牙手環的硬件開發等在之前的文章已經有過詳細介紹。

本文主要介紹藍牙手環開發中,如何構建一個最小的BLE系統框架,以及使用的模塊。


總結一句話:能讓芯片的藍牙協議棧跑起來,手機能連接上藍牙手環設備。


智能手環開發之 實現藍牙(BLE)基本功能

要讓藍牙功能跑起來,需要將注意力放在BLE開發的程序框架和模塊的整體功能上,之後再深入學習各個模塊。


1.BLE程序框架

智能手環的核心除了各種傳感器算法,最重要的就是藍牙了。一個BLE程序通常至少包含4個必要部分:系統初始化、啟動、空閒管理和事件處理。如下圖所示。

智能手環開發之 實現藍牙(BLE)基本功能


(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屏幕初始化等,這些模塊初始化本文暫不深入,主要是講藍牙架構。其中最重要的是藍牙初始化。

弄懂了藍牙初始化,藍牙就能跑起來。

<code>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();
    }
 }   /<code>

3.藍牙初始化

如上面代碼,藍牙初始化,包括初始化藍牙協議棧,配置GAP參數,初始化GATT,初始化廣播,初始化服務,連接參數初始化,啟動廣播,主循環。完成這些,手環藍牙芯片就能夠發廣播了,打開手機藍牙就能夠搜索到。


當然,這些初始化函數也是有很多內容的,也是非常關鍵的。實際藍牙手環的代碼複雜的多,需要花時間和精力去探索。

智能手環開發之 實現藍牙(BLE)基本功能


4.總結

至於每個初始化函數的代碼怎麼寫,還有廣播參數等等,後面文章會逐一介紹。

畢竟一下子寫的太長,也沒人有耐心看下去。本文主要介紹藍牙程序框架,以及跑起整個藍牙時候大致的流程。

欲窮千里目,更上一層樓。瞭解整個架構,後續開發會輕鬆許多。


分享到:


相關文章: