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