以兩個 Air8000 核心板為平臺,本文演示如何搭建 BLE 中心設(shè)備系統(tǒng),實現(xiàn)多設(shè)備連接與管理,為智能家居、工業(yè)物聯(lián)網(wǎng)等場景提供藍(lán)牙中心模式的解決方案。
一、BLE 概述
BLE(Bluetooth Low Energy),也稱為 Bluetooth Smart,是藍(lán)牙 4.0 及更高版本引入的低功耗無線通信技術(shù),專為低帶寬、間歇性數(shù)據(jù)傳輸?shù)奈锫?lián)網(wǎng)(IoT)和穿戴設(shè)備設(shè)計。
Air8000 支持最新的 BLE 5.4 版本,BLE 5.4 在上一代基礎(chǔ)上繼續(xù)優(yōu)化了功耗和性能,為用戶提供了更高效、更穩(wěn)定的藍(lán)牙連接體驗。具體的 BLE 版本區(qū)別若有興趣請自行上網(wǎng)查詢,本處不再贅述。
BLE 支持的四種模式
Air8000 的 BLE 支持 4 種模式,分別是中心設(shè)備模式(central),外圍設(shè)備模式(peripheral),廣播者模式(ibeacon),以及觀察者模式(scan)。
1、中心設(shè)備模式(central):
中心設(shè)備模式是能夠搜索別人并主動建立連接的一方,從掃描狀態(tài)轉(zhuǎn)化而來的。其可以和一個或多個從設(shè)備進行連接通信,它會定期的掃描周圍的廣播狀態(tài)設(shè)備發(fā)送的廣播信息,可以對周圍設(shè)備進行搜索并選擇所需要連接的從設(shè)備進行配對連接,建立通信鏈路成功后,主從雙方就可以發(fā)送接收數(shù)據(jù)。
2、外圍設(shè)備模式(peripheral):
外圍設(shè)備模式是從廣播者模式轉(zhuǎn)化而來的,未被連接的外圍設(shè)備首先進入廣播狀態(tài),等待被中心設(shè)備搜索,當(dāng)中心設(shè)備掃描到外圍設(shè)備建立連接后,就可以和中心設(shè)備進行數(shù)據(jù)的收發(fā),其不能主動的建立連接,只能等別人來連接自己。和廣播模式有區(qū)別的地方在于,外圍設(shè)備模式的設(shè)備是可以被連接的,定期的和中心設(shè)備進行連接和數(shù)據(jù)傳輸,在數(shù)據(jù)傳輸過程中作外圍設(shè)備。
3、廣播者模式(ibeacon)
處于廣播模式的設(shè)備,會周期性的廣播 beacon 信息, 可以被掃描, 但一般不會被連接,典型應(yīng)用 ibeacon。
4、觀察者模式(scan)
觀察者模式,該模式下模塊為非連接,相對廣播者模式的一對多發(fā)送廣播,觀察者可以一對多接收數(shù)據(jù)。在該模式中,設(shè)備可以僅監(jiān)聽和讀取空中的廣播數(shù)據(jù)。和中心設(shè)備唯一的區(qū)別是不能發(fā)起連接,只能持續(xù)掃描外圍設(shè)備。
藍(lán)牙中的重要概念
1、GATT(通用屬性配置文件)
定義 BLE 設(shè)備如何組織和傳輸數(shù)據(jù),以 “服務(wù)(Service)” 和 “特征(Characteristic)” 為單位。
示例:心率監(jiān)測設(shè)備的 GATT 服務(wù)包含 “心率特征”,手機通過讀取該特征獲取心率數(shù)據(jù)。
2、服務(wù)和特征
服務(wù)是特征的容器,通過邏輯分組簡化復(fù)雜功能的管理;
特征是數(shù)據(jù)交互的最小單元,通過屬性定義實現(xiàn)靈活的讀寫與推送機制;
兩者結(jié)合構(gòu)成 GATT 協(xié)議的核心框架,支撐藍(lán)牙設(shè)備間的標(biāo)準(zhǔn)化數(shù)據(jù)交互(如智能穿戴、醫(yī)療設(shè)備、物聯(lián)網(wǎng)傳感器)。
3、特征的關(guān)鍵屬性(Properties)
特征通過 “屬性” 定義數(shù)據(jù)的操作方式,常見屬性包括:

4、UUID
UUID 是藍(lán)牙 GATT 協(xié)議的 “數(shù)字身份證”,通過標(biāo)準(zhǔn)化的唯一標(biāo)識機制,實現(xiàn)了跨廠商設(shè)備的功能互認(rèn)(標(biāo)準(zhǔn) UUID)與廠商個性化功能的擴展(自定義 UUID)
Air8000 的所有操作,都通過 UUID 來索引和管理
二、演示功能概述
本示例使用兩個 Air8000 核心板來演示 BLE 中心設(shè)備模式:一個核心板做中心設(shè)備(燒錄 central demo),另一個核心板做外圍設(shè)備(燒錄 peripheral demo)。
演示功能概述如下:
1、ble 中心設(shè)備掃描并連接外圍設(shè)備;
2、ble 中心設(shè)備連接成功后,開始定時讀取外圍設(shè)備特征值 UUID 數(shù)據(jù), 同時也定時發(fā)送數(shù)據(jù)給外圍設(shè)備;
3、ble 中心設(shè)備收到外圍設(shè)備特征值 UUID 的 notify 數(shù)據(jù)后,通過 uart 發(fā)送到 pc 端串口工具;
4、pc 端串口工具收到數(shù)據(jù)后,打印到串口工具窗口。
三、準(zhǔn)備硬件環(huán)境
3.1 Air8000 核心板
使用 Air8000 核心板,如下圖所示:

3.2 PC 電腦
WIN10 以及以上版本的 WINDOWS 系統(tǒng)。
3.3 數(shù)據(jù)通信線
USB 數(shù)據(jù)線(其一端為 Type-C 接口,用于連接 Air8000 開發(fā)板)。
四、準(zhǔn)備軟件環(huán)境
4.1 軟件環(huán)境
1、 燒錄工具:https://docs.openluat.com/air780epm/common/Luatools/
2、內(nèi)核固件:https://docs.openluat.com/air8000/luatos/firmware/(理論上,2025 年 7 月 26 日之后發(fā)布的固件都可以)
3、腳本文件:
中心設(shè)備:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/ble/central
外圍設(shè)備:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/ble/peripheral
4、PC 端串口工具:例如 SSCOM、LLCOM 等都可以
5、LuatOS 運行所需要的 lib 文件:使用 Luatools 燒錄時,勾選 添加默認(rèn) lib 選項,使用默認(rèn) lib 腳本文件。
準(zhǔn)備好軟件環(huán)境之后,接下來查看如何燒錄項目文件到 Air8000 核心板中,將本篇文章中演示使用的項目文件燒錄到 Air8000 開發(fā)板中。(https://docs.openluat.com/air8000/luatos/common/download/)
4.2 API 介紹
ble 庫:https://docs.openluat.com/osapi/core/ble/
五、程序結(jié)構(gòu)

5.1 文件說明
main.lua:主程序入口文件。
ble_client_main.lua:BLE 中心設(shè)備主程序,進行 BLE 初始化,處理各類 BLE 事件(連接、斷開連接、掃描報告、GATT 操作完成等)。
ble_client_receiver.lua:BLE 中心設(shè)備接收數(shù)據(jù)處理。
ble_client_sender.lua:BLE 中心設(shè)備發(fā)送數(shù)據(jù)處理。
ble_timer_app.lua:BLE 中心設(shè)備定時器處理邏輯,啟動兩個循環(huán)定時器,一個用于定時讀取外圍設(shè)備特征值 UUID 數(shù)據(jù),一個用于定時向外圍設(shè)備特征值 UUID 發(fā)送數(shù)據(jù)。
ble_uart_app.lua:BLE 中心設(shè)備接 uart 處理邏輯,將收到的 notify 數(shù)據(jù),通過 uart 發(fā)送到 pc 端串口工具。
check_wifi.lua:Air8000 的藍(lán)牙功能依賴 WiFi 協(xié)處理器,需確保 WiFi 固件為最新版本。本腳本文件檢查當(dāng)前 Air8000 模組的 WiFi 固件是否為最新版本,若不是則自動啟動升級(需插入可聯(lián)網(wǎng)的 SIM 卡)
六、核心模塊詳解
6.1 主程序 (main.lua)
主程序文件?main.lua?是整個項目的入口點。它負(fù)責(zé)初始化系統(tǒng)環(huán)境。
6.1.1 初始化流程
1、項目和版本定義:
定義?PROJECT?和?VERSION?變量。
2、日志記錄:
使用?log.info("main", PROJECT, VERSION)?在日志中打印項目名和版本號。
3、看門狗初始化(如果支持):
配置并啟動硬件看門狗,防止程序死循環(huán)卡死。
4、加載功能模塊:
加載 BLE Central(中心設(shè)備)主控制模塊(ble_client_main)。
加載 wifi 升級模塊(check_wifi)。
加載串口應(yīng)用功能模塊(ble_uart_app)。
加載定時器應(yīng)用功能模塊(ble_timer_app)。
5、啟動任務(wù)調(diào)度器:
調(diào)用?sys.run()?啟動 LuatOS 的任務(wù)調(diào)度器,開始執(zhí)行各個任務(wù)。
6.2 ble_client_main
本文件為 ble client 主應(yīng)用功能模塊,整個應(yīng)用通過 sysplus.taskInitEx 啟動主任務(wù),實現(xiàn)了完整的 BLE 中心設(shè)備功能,包括設(shè)備發(fā)現(xiàn)、連接管理、數(shù)據(jù)收發(fā)和異?;謴?fù)機制。核心業(yè)務(wù)邏輯為:
6.2.1 初始化與配置
加載依賴模塊( ble_client_receiver 用于數(shù)據(jù)接收處理, ble_client_sender 用于數(shù)據(jù)發(fā)送處理)。
定義配置參數(shù)(目標(biāo)設(shè)備名稱、服務(wù) UUID、特征值 UUID、超時時間等)。
調(diào)用 ble_init(),初始化藍(lán)牙功能。
6.2.2 設(shè)備掃描與連接
創(chuàng)建并啟動 BLE 掃描(默認(rèn)參數(shù):公共地址模式、掃描間隔 100ms、掃描窗口 100ms)。
通過 is_target_device 函數(shù)過濾掃描到的設(shè)備(匹配設(shè)備名稱)。
發(fā)現(xiàn)目標(biāo)設(shè)備后停止掃描并發(fā)起連接。
連接超時處理和重連機制。
6.2.3 事件處理
通過 ble_event_cb 回調(diào)函數(shù)處理各類 BLE 事件:
連接成功(EVENT_CONN)
斷開連接(EVENT_DISCONN)
掃描報告(EVENT_SCAN_REPORT)
GATT 操作完成(EVENT_GATT_DONE)
讀取特征值完成(EVENT_READ_VALUE)
6.2.4 業(yè)務(wù)功能
GATT 服務(wù)發(fā)現(xiàn)完成后,自動啟用目標(biāo)特征值的通知監(jiān)聽。
接收并處理來自其他模塊的讀取請求(?READ_REQ?)。
通過消息隊列與其他模塊通信。
6.2.5 異常處理
掃描超時或連接失敗時觸發(fā)異常處理。
斷開連接后自動清理消息隊列并嘗試重連。
異常情況下 5 秒后重新開始掃描連接。
6.3 ble_client_receiver
6.3.1 主要功能
數(shù)據(jù)分類處理 :接收兩類數(shù)據(jù)(外圍設(shè)備通知數(shù)據(jù)和主動讀取到的數(shù)據(jù))。
數(shù)據(jù)分發(fā) :根據(jù)數(shù)據(jù)類型(通過特征值 UUID 區(qū)分)發(fā)布到不同的消息隊列,供其他模塊處理。
6.3.2 核心實現(xiàn)
提供?proc(service_uuid, char_uuid, data)?接口函數(shù),接收服務(wù) UUID、特征值 UUID 和數(shù)據(jù)。
通過判斷特征值 UUID 是否匹配配置中的?target_notify_char?或?target_read_char?來區(qū)分?jǐn)?shù)據(jù)類型。
對于外圍設(shè)備的通知數(shù)據(jù),通過?sys.publish("RECV_BLE_NOTIFY_DATA", ...)?發(fā)布。
對于主動讀取到的數(shù)據(jù),通過?sys.publish("RECV_BLE_READ_DATA", ...)?發(fā)布。
6.3.3 數(shù)據(jù)流轉(zhuǎn)
當(dāng)?ble_client_main?模塊接收到?EVENT_READ_VALUE?事件時,會調(diào)用此模塊的 proc 函數(shù)。
本模塊將數(shù)據(jù)分類后發(fā)布到對應(yīng)的消息主題。
其他訂閱了這些消息主題的模塊可以接收并處理數(shù)據(jù)。
6.4 ble_client_sender
其他模塊只需發(fā)布?"SEND_DATA_REQ"?消息即可請求中心設(shè)備向外圍設(shè)備發(fā)送數(shù)據(jù)。
6.4.1 主要功能
消息訂閱:訂閱?"SEND_DATA_REQ"?消息,接收其他模塊的發(fā)送請求。
隊列管理:維護發(fā)送隊列 send_queue,存儲待發(fā)送的數(shù)據(jù)項(包含服務(wù) UUID、特征值 UUID、數(shù)據(jù)、回調(diào)信息)。
任務(wù)調(diào)度:通過任務(wù)處理函數(shù) ble_client_sender_task_func 處理各類 BLE 事件。
數(shù)據(jù)發(fā)送:按順序發(fā)送隊列中的數(shù)據(jù),并通過回調(diào)通知發(fā)送結(jié)果。
6.4.2 核心實現(xiàn)
其他模塊通過?sys.publish("SEND_DATA_REQ", ...)?發(fā)布 發(fā)送請求。
send_data_req_proc_func?函數(shù)將請求數(shù)據(jù)加入發(fā)送隊列,并通知任務(wù)。
任務(wù)處理函數(shù)根據(jù) BLE 事件狀態(tài)(連接成功、斷開連接等)處理隊列數(shù)據(jù)。
send_item_func?函數(shù)負(fù)責(zé)實際發(fā)送數(shù)據(jù)。
send_item_cbfunc?函數(shù)處理發(fā)送結(jié)果,調(diào)用用戶回調(diào)。
6.4.3 事件處理
CONNECT_OK?:BLE 連接成功,開始發(fā)送隊列數(shù)據(jù)。
SEND_REQ?:有新數(shù)據(jù)需要發(fā)送,繼續(xù)處理隊列。
DISCONNECTED?:連接斷開,清空隊列并通知所有發(fā)送請求失敗。
6.5 ble_uart_app
6.5.1 主要功能
UART 初始化:打開 UART1 接口,配置波特率 115200、數(shù)據(jù)位 8、停止位 1、無奇偶校驗。
數(shù)據(jù)接收:訂閱 "RECV_BLE_NOTIFY_DATA" 消息,接收來自 BLE 外圍設(shè)備的通知數(shù)據(jù)。
數(shù)據(jù)轉(zhuǎn)發(fā):將接收到的 BLE 數(shù)據(jù)(包含服務(wù) UUID、特征值 UUID 和實際數(shù)據(jù))格式化后通過 UART1 發(fā)送到 PC 端。
6.6 ble_timer_app
6.6.1 主要功能
創(chuàng)建兩個獨立的 5 秒循環(huán)定時器
一個用于定時 發(fā)送 數(shù)據(jù)到外圍設(shè)備特定特征值 UUID。
一個用于定時 讀取 外圍設(shè)備特定特征值 UUID 的數(shù)據(jù)。
6.6.2 核心實現(xiàn)
定義了目標(biāo)服務(wù) UUID( FA00 )和特征值 UUID(寫: EA02 ,讀: EA03 )。
實現(xiàn)數(shù)據(jù)發(fā)送結(jié)果回調(diào)函數(shù) send_data_cbfunc ,用于處理發(fā)送成功/失敗的通知。
實現(xiàn)兩個定時器回調(diào)函數(shù):
send_data_req_timer_cbfunc?:發(fā)布?SEND_DATA_REQ?消息到 ble_client_sender 模塊。
read_data_req_timer_cbfunc?:發(fā)送?READ_REQ?請求到 ble_client_main 模塊。
啟動兩個 5 秒循環(huán)定時器,分別綁定上述兩個回調(diào)函數(shù)。
6.6.3 數(shù)據(jù)流轉(zhuǎn)
發(fā)送流程:定時器觸發(fā) → 發(fā)布?SEND_DATA_REQ?消息 →?ble_client_sender?處理 → 回調(diào)通知結(jié)果。
讀取流程:定時器觸發(fā) → 發(fā)送?READ_REQ?請求 →?ble_client_main?處理 → 結(jié)果通過事件返回。
七、結(jié)果展示
7.1 中心設(shè)備訂閱外圍設(shè)備特征通知(Notify)
1、中心設(shè)備端實現(xiàn)
在 ble_client_main.lua 文件中,在?ble.EVENT_GATT_DONE?事件觸發(fā)后,開啟 notify 監(jiān)聽,監(jiān)聽外圍設(shè)備指定服務(wù)和特征值的通知,中心設(shè)備收到 notify 數(shù)據(jù)后,將數(shù)據(jù)通過 uart1 發(fā)送到 PC 端。開啟監(jiān)聽的主要 demo 如下:

2、外圍設(shè)備端要求
服務(wù) UUID 和特征 UUID 需要和上面中心設(shè)備端實現(xiàn)的一致,同時特征 UUID 的屬性需包含 NOTIFY,才能正常通信。
服務(wù) UUID:FA00,特征 UUID:EA01。

3、結(jié)果展示

7.2 中心設(shè)備寫入特征值(Write)
1、中心設(shè)備端實現(xiàn)
ble_timer_app.lua 中,啟動 5 秒的循環(huán)定時器,發(fā)布?SEND_DATA_REQ?消息到 ble_client_sender 模塊,ble_client_sender 模塊訂閱到消息后,開始調(diào)用 write_value 向外圍設(shè)備特征值寫入數(shù)據(jù),關(guān)鍵發(fā)送部分 demo 如下所示:

2、外圍設(shè)備端要求
服務(wù) UUID 和特征 UUID 需要和上面中心設(shè)備端實現(xiàn)的一致,同時特征 UUID 的屬性需包含 WRITE。
服務(wù) UUID:FA00,特征 UUID:EA02。
觸發(fā) ble.EVENT_WRITE 事件,接收到寫請求并通過 luatools 打印出來。
3、結(jié)果展示

7.3 中心設(shè)備讀取特征值(Read)
1、中心設(shè)備端實現(xiàn)
ble_timer_app.lua 中,啟動 5 秒的循環(huán)定時器,發(fā)送?READ_REQ?請求,ble_client_main 模塊收到請求后通過 read_value 開始讀取外圍設(shè)備特征值數(shù)據(jù),讀取成功后將數(shù)據(jù)轉(zhuǎn)給 ble_client_receiver 模塊處理,關(guān)鍵 demo 如下所示:

2、外圍設(shè)備端要求
服務(wù) UUID 和特征 UUID 需要和上面中心設(shè)備端實現(xiàn)的一致,同時特征 UUID 的屬性需包含 READ。
服務(wù) UUID:FA00,特征 UUID:EA03。

3、結(jié)果展示

八、總結(jié)
本篇文檔介紹了 Air8000 的 BLE central 模式,通過兩個 Air8000 核心板:一個作中心設(shè)備,一個作外圍設(shè)備,演示了 BLE 中心設(shè)備三大核心操作:
1)訂閱通知(Notify):自動獲取外圍設(shè)備推送的數(shù)據(jù),
2)寫入特征值(Write):用于發(fā)送控制指令,要求外圍設(shè)備特征支持 WRITE 屬性;
3)讀取特征值(Read):主動獲取外圍設(shè)備狀態(tài),需外圍設(shè)備開放 READ 權(quán)限。
三種操作均需中心設(shè)備和外圍設(shè)備的服務(wù)/特征 UUID 嚴(yán)格匹配。
今天的內(nèi)容就分享到這里了~