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

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) 關注後,查看往期博客內容,會有更多技術文章

========******=========******========******=========******==========

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章