AliOS Things蓝牙协议栈及应用开发框架介绍
摘要: AliOS Things從1.2.0版本開始支持藍牙協議棧(BLE),及基于藍牙協議棧的應用層開發框架。本文分為三部分對藍牙組件進行介紹:藍牙組件,藍牙協議棧介紹及接口說明,和應用開發框架介紹及示例說明。AliOS Things v1.2.0支持藍牙4.2,提供完整的host端低功耗藍牙協議棧支持。
點擊查看原文
AliOS Things從1.2.0版本開始支持藍牙協議棧(BLE),及基于藍牙協議棧的應用層開發框架。本文分為三部分對藍牙組件進行介紹:
藍牙組件
藍牙協議棧介紹及接口說明
應用開發框架介紹及示例說明
藍牙組件
AliOS Things v1.2.0支持藍牙4.2,提供完整的host端低功耗藍牙協議棧支持。主要包括三部分內容:協議層API,藍牙協議棧,HCI (Host Controller Interface)驅動接口。當開發者拿到一個全新平臺的時候,需要完成HCI接口與AliOS Things提供的藍牙協議棧的對接。目前,AliOS Things已經完成在樂鑫ESP32上面藍牙協議棧部分的對接,開發者可以直接基于協議層API進行上層應用開發。
從應用開發者的角度,BLE應用開發過程中,經常會遇到的煩惱是藍牙協議棧概念及細節的理解。為了解決應用業務開發者的煩惱,AliOS-Things設計與開發了BLE應用開發框架。期望開發者在使用了我們的應用開發框架后,能夠極簡的進行業務邏輯開發,再也不用糾纏于BLE協議棧概念及細節。
綜上,AliOS Things藍牙組件總體結構如下圖所示。
藍牙協議棧及接口
AliOS Things v1.2.0支持低功耗藍牙主要包括以下功能:
Generic Access Profile (GAP)
Generic Attribute Profile (GATT)
清晰的HCI驅動層抽象
主要提供以下接口:
GAP
GATT
Logical Link Control and Adaptation Protocol (L2CAP)
HCI驅動
藍牙協議棧在快速迭代中,后續會開發更多功能及接口。
應用開發框架及接口
AliOS Things BLE應用開發框架主要針對GATT Server,即peripheral,主要完成以下功能:
維護開發者添加的屬性和特性
GATT (Generic Attribute Profile)相關讀,寫,通知,指示和連接
通過實現上述兩項功能,為開發者提供清晰簡單的應用開發接口,接口主要包括以下功能:
創建外設應用開發框架對象
創建和添加屬性到BLE協議棧,即GATT
廣播Attribute
回復和更新Central設備的請求和訂閱信息
我們已經在慶科mk3239上支持了創建外設應用框架對象接口,發布添加屬性接口,廣播接口。開發者可以在創建了外設應用開發框架對象后,借助于接口輕松添加屬性,完成服務的廣播,連接的建立和信息的更新。我們正在豐富上述接口功能并提供全部功能,并將已經在mk3239上支持的應用開發能力做到與平臺無關,讓使用其他藍牙芯片的開發者也能夠享受到極簡開發的快樂。
AliOS Things應用層規范接口的定義,可以在framework/bluetooth/ble_app_framework/ble_app_framework.h文件中找到。下面對應用層接口作一些說明:
ble_peripheral_init
接口定義:
peripheral_hdl_t ble_peripheral_init(peripheral_init_t *p,ble_peripheral_conn_cb_t c,ble_peripheral_disconn_cb_t disc,const uint8_t *gatt_db,int db_len);接口說明:
該函數用于初始化peripheral設備服務,包括協議棧初始化、設備初始化、GATT屬性數據庫初始化。設備初始化相關的參數由參數p指定,GATT屬性數據庫由參數gatt_db和db_len指定。參數c和disc分別指定有客戶端設備連接時和斷開連接時的回調函數。該函數返回值是對應peripheral設備的handle,handle可以用于標識peripheral設備及其屬性。
ble_peripheral_deinit
接口定義:
void ble_peripheral_deinit(peripheral_hdl_t hdl);
接口說明:
該接口是接口ble_peripheral_init的反向操作,用于注銷peripheral設備初始化和協議棧初始化等操作。
ble_adv_start
接口定義:
void ble_adv_start(ble_adv_complete_cb_t adv_handler,const char *manufacture,peripheral_hdl_t hdl);接口說明:
該接口用于啟動廣播。參數adv_handler指定廣播結束時的回調函數,參數manufacture指定設備的廠商名信息。廣播的信息(服務、屬性等)在初始化函數的GATT數據庫中設定。
ble_adv_stop
接口定義:
void ble_adv_stop();接口說明:
該接口停止廣播。
ble_attr_add
接口定義:
ble_gatt_attr_t *ble_attr_add(uint16_t hdl,uint16_t val_len,const uint8_t *val);接口說明:
該接口用于添加peripheral設備屬性值。參數hdl指定屬性句柄,val指定屬性值,val_len指定屬性值的長度(以字節為單位)。該函數返回值為一個ble_gatt_attr_t類型的結構體,用于后續對該屬性的操作。
ble_attr_indicate
接口定義:
void ble_attr_indicate(ble_gatt_attr_t *attr,peripheral_hdl_t hdl,uint16_t len,const uint8_t *data);接口說明:
該接口用于向客戶端設備發送指示(indication)。參數attr表明指示對應的屬性,hdl表明peripheral設備對應的handle,data指定需要指示的數據,len指定數據長度。
ble_attr_notify
接口定義:
void ble_attr_notify(ble_gatt_attr_t *attr,peripheral_hdl_t hdl,uint16_t len,const uint8_t *data);接口說明:
該函數功能與ble_attr_indicate類似,區別在于發送通知(notification)。
基于BLE應用框架的示例說明
AliOS Things目前提供了2個BLE示例sample,位于目錄example/bluetooth/目錄中。這2個sample均基于BLE應用框架和接口。下面對這2個sample作一些說明。
ble_advertisements
該示例sample展示了如何開發基于BLE應用框架和接口的應用。
第一步,初始化peripheral設備。
peripheral_init_t p = {BLE_DEVICE_NAME, 0, 1}; hdl = ble_peripheral_init(&p, connection_handler, disconnection_handler,adv_gatt_db, sizeof(adv_gatt_db));peripheral_init_t中指定了設備名、最大連接數等信息。GATT數據庫在adv_gatt_db中指定,包含了GATT服務、GAP服務、設備信息服務及他們的屬性。
第二步,發布廣播。廣播的內容包括廠商名、第一步中指定的設備信息服務等。
ble_adv_start(adv_complete_cb, MANUFACURE_NAME, hdl);ble_show_system_time
該示例程序是另外一個簡單的基于BLE應用框架和接口的sample。該示例在上一個示例的基礎上,增加了一個用戶自定義服務(TIME Service),并為該服務添加了一個屬性值,用于顯示系統啟動時長。
下面的代碼展示了該示例程序的主要流程:
static void indicate_handler(void *arg) {struct indicate_arg_s *ind = (struct indicate_arg_s *)arg;long long time = aos_now_ms();ble_attr_indicate(ind->attr, ind->hdl, sizeof(time), (uint8_t *)&time);aos_post_delayed_action(1000, indicate_handler, arg); }int application_start( void ) {peripheral_hdl_t hdl;ble_gatt_attr_t *attr;struct indicate_arg_s ind_arg;peripheral_init_t p = {BLE_DEVICE_NAME, 0, 1};hdl = ble_peripheral_init(&p, connection_handler, disconnection_handler,adv_gatt_db, sizeof(adv_gatt_db));ble_adv_start(adv_complete_cb, MANUFACURE_NAME, hdl);attr = ble_attr_add(HDLC_TIME_OUT_VALUE, 0, NULL);ind_arg.hdl = hdl;ind_arg.attr = attr;aos_post_delayed_action(1000, indicate_handler, &ind_arg);aos_loop_run();return 0; }第一步,初始化peripheral設備。
第二步,啟動廣播。
第三步,添加時間屬性的值。
第四步,每隔1s發送一次指示,該指示包含系統啟動時長信息。
小結
目前,AliOS Things藍牙組件提供了一些最基礎的功能模塊,開發者可以基于現有功能直接基于AliOS Things進行藍牙開發。后續,我們會隨著AliOS Things快速迭代,持續更新,主要包括:
升級到藍牙5.0
支持更加豐富的應用開發示例和接口
支持SIG BLE mesh
AliOS Things uMesh支持藍牙
支持更多的平臺運行AliOS Things藍牙協議棧
總結
以上是生活随笔為你收集整理的AliOS Things蓝牙协议栈及应用开发框架介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能的时代来了,新的商业机会在哪里?
- 下一篇: 助力APP尽情“撒币”!阿里云正式上线移