在資源受限的無線終端設(shè)備中,如何實(shí)現(xiàn)高效、穩(wěn)定的BLE通信是開發(fā)關(guān)鍵。LuatOS憑借其低內(nèi)存占用、高可擴(kuò)展性與腳本化開發(fā)優(yōu)勢,成為眾多開發(fā)者構(gòu)建BLE應(yīng)用的首選平臺(tái)。本文面向初學(xué)者與中級(jí)開發(fā)者,全面介紹LuatOS中BLE模塊的基礎(chǔ)知識(shí),涵蓋角色定義(主機(jī)/從機(jī))、服務(wù)配置、特征值操作與事件回調(diào)機(jī)制,并通過一個(gè)完整的溫濕度數(shù)據(jù)上報(bào)案例,逐步演示應(yīng)用開發(fā)全過程。
一、BLE總體介紹
1.1 什么是BLE(Bluetooth Low Energe)?
藍(lán)牙低功耗,通??s寫為 BLE,是藍(lán)牙技術(shù)聯(lián)盟設(shè)計(jì)的一種個(gè)人區(qū)域網(wǎng)絡(luò)技術(shù),旨在提供顯著降低的功耗、成本和復(fù)雜性,同時(shí)保持可比的通信范圍。
與傳統(tǒng)經(jīng)典藍(lán)牙相比,BLE并非專注于傳輸高數(shù)據(jù)量的內(nèi)容(如音頻流、大文件),而是為間歇性、小數(shù)據(jù)量的傳輸應(yīng)用而優(yōu)化。這使得它非常適合那些需要長時(shí)間運(yùn)行在紐扣電池或小型電池上的設(shè)備。
應(yīng)用場景舉例:
經(jīng)典藍(lán)牙:
1、藍(lán)牙耳機(jī)/音箱
場景:你用無線耳機(jī)聽音樂、看視頻、打電話。
為什么是經(jīng)典藍(lán)牙:因?yàn)橐纛l流需要持續(xù)、高速、低延遲的傳輸,才能保證聲音連貫不卡頓。
2、車載藍(lán)牙系統(tǒng)
場景:你一上車,手機(jī)就自動(dòng)連接到汽車,可以播放手機(jī)里的音樂,或者進(jìn)行免提通話。
為什么是經(jīng)典藍(lán)牙:和耳機(jī)一樣,傳輸?shù)氖菍?shí)時(shí)的音頻流,對(duì)穩(wěn)定性和速度要求高。
3、藍(lán)牙文件傳輸
場景:兩個(gè)人之間不用網(wǎng)絡(luò),直接通過手機(jī)“藍(lán)牙”功能分享照片、視頻或文檔。
為什么是經(jīng)典藍(lán)牙:傳輸?shù)奈募赡鼙容^大,需要較高的傳輸速率。
4、無線鍵盤、鼠標(biāo)和手柄
場景:連接電腦的無線鍵盤鼠標(biāo),或者連接手機(jī)/游戲機(jī)的藍(lán)牙游戲手柄。
為什么是經(jīng)典藍(lán)牙:雖然數(shù)據(jù)量不大,但它們需要保持持續(xù)連接和極低的延遲,以確保你每次按鍵、移動(dòng)鼠標(biāo)或操作手柄的指令都能被即時(shí)響應(yīng)。
低功耗藍(lán)牙BLE:
1、共享單車開鎖
場景:你用手機(jī)App掃碼后,單車鎖“滴”一聲就打開了。
為什么是BLE:開鎖過程只需要手機(jī)向車鎖發(fā)送一個(gè)極小的加密指令包,傳輸瞬間完成,車鎖的電池需要支撐數(shù)月。
2、智能手環(huán)/手表
場景:你的小米手環(huán)或Apple Watch記錄了你一天的步數(shù)、心率和睡眠數(shù)據(jù)。
為什么是BLE:設(shè)備本身通過小型電池供電,需要續(xù)航數(shù)周。它持續(xù)采集你的健康數(shù)據(jù)(小數(shù)據(jù)包),只在當(dāng)你打開手機(jī)App同步時(shí),才通過BLE將積攢的數(shù)據(jù)批量發(fā)送到手機(jī)上。
3、藍(lán)牙防丟器
場景:你把一個(gè)Tile或AirTag掛在鑰匙上,當(dāng)鑰匙找不到時(shí),用手機(jī)讓防丟器發(fā)出聲音。
為什么是BLE:防丟器絕大部分時(shí)間處于待機(jī)狀態(tài)。當(dāng)你“尋找”它時(shí),手機(jī)通過BLE發(fā)送一個(gè)指令喚醒它,它再回應(yīng)一個(gè)信號(hào)。這種間歇性工作模式讓它的紐扣電池能用一年多。
場景:家里的溫濕度計(jì)、門窗傳感器、智能燈泡。
為什么是BLE:溫度傳感器每隔幾分鐘才上報(bào)一次數(shù)據(jù)(幾個(gè)字節(jié));門窗傳感器只有在開/關(guān)狀態(tài)變化時(shí)才發(fā)送信號(hào)。它們都由電池供電,需要BLE的低功耗特性來保證較長的續(xù)航。
1.2 BLE的發(fā)展歷史
BLE的發(fā)展與藍(lán)牙技術(shù)的整體演進(jìn)緊密相連。其歷史可以看作是為了滿足物聯(lián)網(wǎng)需求而專門開辟和不斷優(yōu)化的一條技術(shù)路徑。
1、1998-2010:前BLE時(shí)代(經(jīng)典藍(lán)牙主導(dǎo))
說明:經(jīng)典藍(lán)牙(Bluetooth Classic)專注于連續(xù)數(shù)據(jù)流應(yīng)用,如音頻和文件傳輸。功耗較高,不適合物聯(lián)網(wǎng)傳感器。
2、2010:革命性的起點(diǎn) - 藍(lán)牙4.0
說明:藍(lán)牙4.0核心規(guī)范發(fā)布,首次引入了“藍(lán)牙低功耗”技術(shù)。這是一個(gè)里程碑,它創(chuàng)建了兩種并行的技術(shù):經(jīng)典藍(lán)牙和藍(lán)牙低功耗。藍(lán)牙4.0芯片分為三種類型:
單模:僅支持BLE。
雙模:同時(shí)支持經(jīng)典藍(lán)牙和BLE。
經(jīng)典:僅支持經(jīng)典藍(lán)牙。
影響:催生了第一批真正的低功耗物聯(lián)網(wǎng)設(shè)備,如心率帶、智能標(biāo)簽等。
3、2013:同互聯(lián)網(wǎng)融合 - 藍(lán)牙4.1
說明:藍(lán)牙與互聯(lián)網(wǎng)無縫銜接,推動(dòng)智能家居發(fā)展。
支持IPv6直接聯(lián)網(wǎng)
設(shè)備可同時(shí)作為主/從機(jī)
單包容量23字節(jié)(廣播包仍31字節(jié))
4、2014:速度與連接的提升 - 藍(lán)牙4.2
說明:此版本帶來了關(guān)鍵改進(jìn):
數(shù)據(jù)傳輸速度提升:將發(fā)送數(shù)據(jù)包長度擴(kuò)展,單包容量255字節(jié),提升數(shù)據(jù)傳輸速度。
隱私與安全增強(qiáng):提供了更強(qiáng)大的加密和隱私保護(hù)。
5、2016:物聯(lián)網(wǎng)的基石 - 藍(lán)牙5.0

說明:這是針對(duì)物聯(lián)網(wǎng)的一次巨大飛躍,主要特性包括:
BLE速度翻倍至2 Mbps,是BLE 4.2的兩倍
理論距離240米(室外)
Mesh網(wǎng)絡(luò)支持
6、2019-2020:專注定向與高精度 - 藍(lán)牙5.1 & 5.2
說明:
藍(lán)牙5.1:引入了尋向功能,通過測量信號(hào)相位,可以實(shí)現(xiàn)厘米級(jí)精度的室內(nèi)定位,解決了“在哪里”的問題。
藍(lán)牙5.2:引入了LE Audio的核心——低功耗同步信道,為下一代藍(lán)牙音頻奠定了基礎(chǔ),同時(shí)提升了多設(shè)備連接效率和功耗控制。
7、2021-2023:音頻革命與未來 - 藍(lán)牙5.3 & 5.4
說明:
持續(xù)優(yōu)化:藍(lán)牙5.3/5.4進(jìn)一步優(yōu)化了連接穩(wěn)定性、延遲和安全性。
LE Audio:基于藍(lán)牙5.2及更高版本,它使用全新的LC3編碼器,在更低功耗下提供更高質(zhì)量的音頻,并支持廣播音頻(如助聽器、多人共享音頻)等創(chuàng)新應(yīng)用。
Mesh網(wǎng)絡(luò):雖然規(guī)范更早推出,但正隨著BLE的普及而廣泛應(yīng)用,允許成千上萬個(gè)設(shè)備組成一個(gè)龐大的網(wǎng)絡(luò),用于智能樓宇、工業(yè)控制等場景。
8、2024: 藍(lán)牙6.0
說明:
引入Bluetooth Channel Sounding,通過RTT(round-trip time) 和 PBR(phase-based ranging)技術(shù)(類似蘋果的UWB),能夠準(zhǔn)確測量藍(lán)牙設(shè)備間的物理距離。
二、BLE協(xié)議棧介紹
在開始講LuatOS的BLE之前,先大概了解下BLE的協(xié)議棧。
2.1 BLE低功耗協(xié)議棧介紹

BLE協(xié)議棧主要用來對(duì)你的應(yīng)用數(shù)據(jù)進(jìn)行層層封包,以生成一個(gè)滿足BLE協(xié)議的空中數(shù)據(jù)包。也就是說,把應(yīng)用數(shù)據(jù)包裹在一系列的幀頭(header)和幀尾(tail)中。
藍(lán)牙協(xié)議規(guī)定了兩個(gè)層次的協(xié)議,分別是:
(1)藍(lán)牙核心協(xié)議(Bluetooth Core)
這是藍(lán)牙技術(shù)的基礎(chǔ),規(guī)定了從無線電波收發(fā)到數(shù)據(jù)鏈路管理的所有底層技術(shù)細(xì)節(jié)。它確保了不同廠商設(shè)備之間的基本互聯(lián)互通。核心協(xié)議層通常又分為控制器(Controller) 和主機(jī)(Host) 兩個(gè)子部分。
(2)藍(lán)牙應(yīng)用層協(xié)議(Bluetooth Application)
建立在核心協(xié)議之上,定義了如何利用核心協(xié)議來實(shí)現(xiàn)具體的功能和服務(wù)。例如,心率監(jiān)測、血壓計(jì)、鍵盤鼠標(biāo)等具體應(yīng)用場景的規(guī)范。
2.2 BLE低功耗藍(lán)牙核心協(xié)議層詳解(Bluetooth Core)
2.2.1 物理層(PHY)
PHY層用來指定BLE所用的無線頻段,調(diào)制解調(diào)方式和方法等。
藍(lán)牙工作在2.4GHz的頻段,具體的頻段范圍是2400MHz到2483.5MHz,頻段寬度為83.5MHz。BLE將這83.5MHz的寬度分成了0到39共40個(gè)通道,每一個(gè)通道寬度為2MHz。
下面我們看下藍(lán)牙的波形圖:

其中廣播通道為37/38/39,對(duì)應(yīng)的中心頻率分別為2402MHz,2426MHz,2480MHz。BLE在廣播的時(shí)候會(huì)輪流使用這3個(gè)廣播通道進(jìn)行廣播。
數(shù)據(jù)通道為0-36,專門用于在設(shè)備連接建立之后,傳輸用戶數(shù)據(jù)和命令。
從圖中可以看到BLE的3個(gè)廣播通道并不是連續(xù)的,這三個(gè)信道和藍(lán)牙廣播關(guān)系密切,用于設(shè)備被發(fā)現(xiàn)。
為什么不是連續(xù)的?
這就需要看下wifi的信道劃分了,wifi同樣也是工作在2.4GHz頻段下,如果BLE處理不當(dāng),自然會(huì)被wifi影響。
下面我們來詳細(xì)分析Wi-Fi如何影響B(tài)LE,以及BLE的應(yīng)對(duì)策略。

Wi-Fi 對(duì)BLE的影響機(jī)制
根本原因在于頻段重疊:
BLE: 工作在 2.400 - 2.4835 GHz,使用 40 個(gè) 2MHz 寬的信道。
Wi-Fi(2.4GHz): 同樣工作在 2.412 - 2.472 GHz(通常),使用 20MHz 或 40MHz 寬的信道。
可以想象一下,Wi-Fi的一個(gè)信道就像一條寬闊的八車道高速公路,而BLE的一個(gè)信道就像是其中的一條自行車道。當(dāng)Wi-Fi這條高速公路車流繁忙時(shí),自然會(huì)影響到在旁邊自行車道上行駛的BLE。
具體來說:
1、物理信道重疊:
Wi-Fi的1, 6, 11這三個(gè)最常用的非重疊信道,會(huì)覆蓋一大片BLE的信道。
例如,Wi-Fi信道1(中心頻率2.412 GHz)會(huì)干擾BLE的數(shù)據(jù)信道0到10。
Wi-Fi信道6(中心頻率2.437 GHz)會(huì)干擾BLE中間部分的數(shù)據(jù)信道。
Wi-Fi信道11(中心頻率2.462 GHz)會(huì)干擾BLE的數(shù)據(jù)信道22到36。
2、影響類型:
數(shù)據(jù)包丟失: BLE數(shù)據(jù)包在傳輸過程中被Wi-Fi信號(hào)淹沒,導(dǎo)致接收端無法正確解碼。
連接中斷: 如果數(shù)據(jù)包持續(xù)丟失,可能導(dǎo)致連接超時(shí)而斷開。
廣播受阻: 設(shè)備更難被發(fā)現(xiàn)或連接,因?yàn)閺V播信道(特別是38)可能被干擾。
功耗增加: 為了補(bǔ)償丟失的數(shù)據(jù)包,設(shè)備需要更頻繁地重傳數(shù)據(jù),從而增加了功耗。
BLE的應(yīng)對(duì)策略(為什么影響通常不大)
1、自適應(yīng)跳頻【藍(lán)牙跳頻(Frequency Hopping)技術(shù))】
藍(lán)牙技術(shù)使用跳頻擴(kuò)頻(FHSS)來避免干擾和多徑衰減。跳頻是指藍(lán)牙設(shè)備在通信過程中,按照一定的序列在不同的信道之間快速切換。這樣,即使某個(gè)信道受到干擾,也可以在其他信道上繼續(xù)通信,從而保證整體的通信質(zhì)量。
這是BLE對(duì)抗Wi-Fi干擾的方式。在連接狀態(tài)下,BLE主從設(shè)備會(huì)在37個(gè)數(shù)據(jù)信道上快速切換。
它們會(huì)持續(xù)監(jiān)測每個(gè)信道的通信質(zhì)量。如果一個(gè)信道(比如被Wi-Fi信道6占據(jù)的區(qū)域)頻繁出錯(cuò),系統(tǒng)會(huì)將其標(biāo)記為“壞信道”,并在未來的跳頻序列中自動(dòng)避開。
這樣,即使有40%的信道被Wi-Fi干擾,通信依然可以通過剩下60%的干凈信道可靠進(jìn)行。
2、廣播信道的巧妙設(shè)計(jì)
BLE的3個(gè)廣播信道(37, 38, 39)被特意安排在2.4GHz頻段的兩端和正中間。
這個(gè)設(shè)計(jì)就是為了最大化地避開Wi-Fi最常用的1、6、11信道。 - 信道37(2402MHz): 在Wi-Fi信道1的左側(cè),基本安全。 - 信道39(2480MHz): 在Wi-Fi信道11的右側(cè),基本安全。 - 信道38(2426MHz): 位于Wi-Fi信道1和6之間,是最容易受到干擾的廣播信道。
廣播時(shí),設(shè)備會(huì)在三個(gè)信道上都發(fā)送數(shù)據(jù),只要有一個(gè)被手機(jī)接收到,連接就能建立。這大大提高了在干擾環(huán)境下的發(fā)現(xiàn)概率。
2.2.2 鏈路層(LL)
LL 位于物理層(PHY)之上,主機(jī)控制器接口(HCI)之下,是 BLE 協(xié)議棧中負(fù)責(zé)報(bào)文組裝/拆解、時(shí)序控制、信道管理、狀態(tài)機(jī)切換、安全加密等的核心模塊。
鏈路層定義了兩個(gè)設(shè)備如何利用無線電傳輸信息。它包含了報(bào)文、廣播、數(shù)據(jù)信道的詳細(xì)定義,也規(guī)定了發(fā)現(xiàn)其他設(shè)備的流程、廣播的數(shù)據(jù)、連接的建立、連接的管理以及連接中的數(shù)據(jù)傳輸。
LL層只負(fù)責(zé)把數(shù)據(jù)發(fā)出去或者收回來,對(duì)數(shù)據(jù)進(jìn)行怎樣的解析則交給上面的GAP或者ATT。
LL層收到的數(shù)據(jù),主要交給 ATT 進(jìn)行解析,以服務(wù)于 GATT 定義的應(yīng)用邏輯。而 GAP 主要處理LL層上報(bào)的連接和廣播狀態(tài)事件,而非解析具體的數(shù)據(jù)內(nèi)容。
主要功能:
廣播與掃描:支撐無連接的廣播通信。
建立與維護(hù)連接:完成從掃描→發(fā)起→連接確認(rèn)的流程,并維護(hù)連接事件。
數(shù)據(jù)交換:基于信道跳頻機(jī)制可靠傳輸 ACL 數(shù)據(jù)包。
安全管理:執(zhí)行加密、鑒權(quán)與隱私地址解析。
控制流程:實(shí)現(xiàn)連接參數(shù)更新、信道映射更新、數(shù)據(jù)長度擴(kuò)展等 LL Control PDUs。
LL層主要有5種狀態(tài):
待機(jī)狀態(tài)(Standby State)
廣播狀態(tài)(Advertising State)
掃描狀態(tài)(Scanning State)
發(fā)起狀態(tài)(Initiating State)
連接狀態(tài)(Connection State)

下面我們?cè)敿?xì)解釋每個(gè)狀態(tài):
1、待機(jī)狀態(tài)(Standby State)
這是鏈路層的默認(rèn)狀態(tài),設(shè)備既不發(fā)送也不接收數(shù)據(jù)。
功耗最低,設(shè)備可以在此狀態(tài)下初始化或等待其他操作。
2、廣播狀態(tài)(Advertising State)
設(shè)備通過發(fā)送廣播報(bào)文來宣告自己的存在。
廣播報(bào)文可以包含設(shè)備地址、名稱、服務(wù)等信息。
設(shè)備可以配置為不同的廣播類型(如可連接廣播、非可連接廣播、可掃描廣播等)。
3、掃描狀態(tài)(Scanning State)
設(shè)備監(jiān)聽廣播報(bào)文,分為主動(dòng)掃描和被動(dòng)掃描。
被動(dòng)掃描:僅接收廣播報(bào)文,不發(fā)送掃描請(qǐng)求。
主動(dòng)掃描:在收到可掃描的廣播報(bào)文后,發(fā)送掃描請(qǐng)求以獲取更多信息(掃描響應(yīng))。
4、發(fā)起狀態(tài)(Initiating State)
設(shè)備監(jiān)聽特定設(shè)備的廣播報(bào)文,并在收到后發(fā)起連接請(qǐng)求。
只有設(shè)備配置為發(fā)起模式時(shí)才會(huì)進(jìn)入此狀態(tài)。
5、連接狀態(tài)(Connection State)
當(dāng)發(fā)起設(shè)備發(fā)送連接請(qǐng)求并被廣播設(shè)備接受后,雙方進(jìn)入連接狀態(tài)。
在連接狀態(tài)下,設(shè)備分為主設(shè)備和從設(shè)備。
中心設(shè)備(Central):發(fā)起連接的設(shè)備。
外圍設(shè)備(Peripheral):接受連接的設(shè)備。
在連接狀態(tài)下,鏈路層會(huì)維護(hù)一個(gè)連接事件(Connection Events),在每個(gè)連接事件中,主設(shè)備和從設(shè)備可以進(jìn)行數(shù)據(jù)包的交換。連接事件按照連接間隔(Connection Interval)周期性地發(fā)生。
2.2.3 主機(jī)控制接口層(HCI)
HCI 是 Host-Controller Interface 的縮寫,即 “主機(jī)-控制器接口”。
它本質(zhì)上是一套軟件層面的規(guī)范和協(xié)議,定義了藍(lán)牙協(xié)議棧中兩個(gè)主要部分——主機(jī)(Host) 和控制器(Controller)——之間應(yīng)該如何通信。
Host 和 Controller 是什么?
要理解HCI,首先必須明白藍(lán)牙協(xié)議棧是如何分層的:
Controller:負(fù)責(zé)處理所有底層、實(shí)時(shí)性要求高的無線射頻任務(wù)。 - 包含協(xié)議層:物理層、鏈路層。 - 職責(zé):管理無線電信號(hào)、調(diào)制解調(diào)、跳頻、數(shù)據(jù)包時(shí)序、廣播、掃描等。它直接與硬件打交道。
Host:負(fù)責(zé)處理所有高層、應(yīng)用邏輯相關(guān)的任務(wù)。 - 包含協(xié)議層:L2CAP、ATT、GATT、SM以及最終的應(yīng)用程序。 - 職責(zé):管理連接、定義服務(wù)與特征、處理加密安全、為應(yīng)用程序提供API
2.2.4 邏輯鏈路控制及自適應(yīng)協(xié)議層(L2CAP)
L2CAP對(duì)LL進(jìn)行了一次簡單封裝。LL層只關(guān)心傳輸?shù)臄?shù)據(jù)本身,L2CAP就要區(qū)分加密通道還是普通通道,同時(shí)還要對(duì)連接間隔進(jìn)行管理。
L2CAP是藍(lán)牙協(xié)議棧的“交通調(diào)度中心”和“數(shù)據(jù)包裝工”。 它位于基礎(chǔ)射頻協(xié)議之上,但低于應(yīng)用層協(xié)議(如ATT/GATT),充當(dāng)一個(gè)承上啟下的多路復(fù)用和數(shù)據(jù)適配層。
2.2.5 屬性協(xié)議層(ATT)
ATT全稱是Attribute protocol(數(shù)據(jù)交互協(xié)議),這一層的關(guān)鍵詞是Attribute(屬性)。一個(gè)屬性其實(shí)就是一條數(shù)據(jù),屬性是BLE數(shù)據(jù)提供單元,也是藍(lán)牙空中傳播數(shù)據(jù)的最上層。
ATT層定義了各種屬性,屬性的操作方法。通過ATT層可以讀寫對(duì)端設(shè)備的屬性,但是屬性之間有什么聯(lián)系、各個(gè)屬性怎么組合起來提供服務(wù),由上層GATT負(fù)責(zé)。
屬性,是ATT層的關(guān)鍵字。
2.2.6 通用訪問配置文件層(GAP)
Generic Access Profile(通用訪問配置規(guī)范),主要用來進(jìn)行廣播、掃描和發(fā)起連接等。
GAP層將設(shè)備分為四種角色,分別是外圍設(shè)備,中心設(shè)備,廣播設(shè)備和觀察設(shè)備。
這些設(shè)備圍繞著廣播和連接的差異性而區(qū)分,外圍設(shè)備和廣播設(shè)備對(duì)外發(fā)出廣播數(shù)據(jù),中心設(shè)備和觀察設(shè)備掃描外部廣播數(shù)據(jù),廣播設(shè)備和觀察設(shè)備通常不建立連接,而外圍設(shè)備和中心設(shè)備可以建立連接。
圍繞著廣播和連接,GAP層定義了許多不同的"模式(mode)",比如廣播模式和連接模式,在不同模式下的操作稱為“規(guī)程(procedure)”。
例如:當(dāng)一個(gè)設(shè)備正在進(jìn)行廣播時(shí),稱其為"廣播模式"。廣播往往會(huì)持續(xù)較長時(shí)間,也許是該設(shè)備唯一用途。而當(dāng)一個(gè)設(shè)備正在尋找廣播者時(shí),稱其為"觀察規(guī)程"。觀察往往持續(xù)一段較短時(shí)間,用以構(gòu)建用戶界面或者尋找需要的指定信息。
2.2.7 通用屬性配置文件層(GATT)
GATT(Generic Attribute Profile, 通用屬性規(guī)范),自己本身不提供數(shù)據(jù),而是將ATT層提供的屬性組合起來構(gòu)成的服務(wù)。GATT是建立連接后通信規(guī)范, 而藍(lán)牙是通過GAP建立通信的。
在BLE里,通過ATT層可以讀寫對(duì)端設(shè)備的屬性,但是屬性之間有什么聯(lián)系、各個(gè)屬性怎么組合起來提供服務(wù),由上層GATT負(fù)責(zé)。
服務(wù),是GATT層的關(guān)鍵字。
注意:
GATT 連接,必須先經(jīng)過GAP協(xié)議。
一旦兩個(gè)設(shè)備建立起了連接,GATT 就開始起作用了。
中心設(shè)備和外設(shè)需要雙向通信的話,唯一的方式就是建立GATT 連接。
GATT 定義兩個(gè)BLE設(shè)備通過服務(wù)(Service)和特征(Characteristic)進(jìn)行通信。
1、GATT(通用屬性配置文件)
定義 BLE 設(shè)備如何組織和傳輸數(shù)據(jù),以 “服務(wù)(Service)” 和 “特征(Characteristic)” 為單位。
示例:心率監(jiān)測設(shè)備的 GATT 服務(wù)包含 “心率特征”,手機(jī)通過讀取該特征獲取心率數(shù)據(jù)。
2、服務(wù)和特征
服務(wù)是特征的容器,通過邏輯分組簡化復(fù)雜功能的管理;
特征是數(shù)據(jù)交互的最小單元,通過屬性定義實(shí)現(xiàn)靈活的讀寫與推送機(jī)制;
兩者結(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ù)的操作方式,常見屬性包括:
1)可讀(Read):允許客戶端讀取特征值(如讀取電池電量)。
2)可寫(Write):允許客戶端寫入特征值(如設(shè)置設(shè)備參數(shù))。
3)通知(Notification):服務(wù)端主動(dòng)發(fā)送特征值更新(如心率變化時(shí)推送給手機(jī))。
4、UUID
UUID 是藍(lán)牙 GATT 協(xié)議的 “數(shù)字身份證”,通過標(biāo)準(zhǔn)化的唯一標(biāo)識(shí)機(jī)制,實(shí)現(xiàn)了跨廠商設(shè)備的功能互認(rèn)(標(biāo)準(zhǔn) UUID)與廠商個(gè)性化功能的擴(kuò)展(自定義 UUID)
三、LuatOS BLE 的四種工作模式解析
在前面的章節(jié)中,我們介紹了 BLE 的背景以及基礎(chǔ)理論知識(shí)。若要深入了解其協(xié)議細(xì)節(jié),讀者可參考其他專業(yè)的資料。
從本部分開始,我們將聚焦于 LuatOS 的實(shí)際開發(fā),重點(diǎn)講解其支持的 四種核心 BLE 工作模式,并通過實(shí)例展示如何應(yīng)用。
3.1 模式解釋
外圍設(shè)備模式(peripheral):設(shè)備會(huì)被掃描到, 并且可以被連接;
中心設(shè)備模式(central):設(shè)備會(huì)掃描其他設(shè)備, 并且可以連接其他設(shè)備;
廣播者模式(ibeacon):設(shè)備會(huì)周期性的廣播beacon信息, 可以被掃描到, 但一般不會(huì)被連接;
觀察者模式(scan):設(shè)備會(huì)掃描其他設(shè)備, 但不會(huì)連接其他設(shè)備。
3.2 四種模式的基本流程
3.2.1外圍設(shè)備模式(peripheral)的基本流程(概要描述)
1、初始化藍(lán)牙框架
? bluetooth_device = bluetooth.init()
2、創(chuàng)建BLE對(duì)象
? local ble_device = bluetooth_device:ble(ble_callback)
3、創(chuàng)建GATT描述
? local att_db = {xxx}
4、創(chuàng)建廣播信息
? ble_device:adv_create(adv_data)
5、開始廣播
? ble_device:adv_start()
6、等待連接
7、在回調(diào)函數(shù)中處理連接事件, 如接收數(shù)據(jù), 發(fā)送數(shù)據(jù)等
3.2.2中心設(shè)備模式(central)的基本流程(概要描述)
1、初始化藍(lán)牙框架
bluetooth_device = bluetooth.init()
2、創(chuàng)建BLE對(duì)象
? local ble_device = bluetooth_device:ble(ble_callback)
3、掃描目標(biāo)BLE設(shè)備
? ble_device:scan_start()
4、建立與目標(biāo)設(shè)備的連接
? ble_device:connect(mac, add_type)
5、處理各類BLE事件(連接、斷開連接、掃描報(bào)告、GATT操作完成等)
3.2.3廣播者模式(ibeacon)的基本流程(概要描述)
1、初始化藍(lán)牙底層框架
? bluetooth_device = bluetooth.init()
2、創(chuàng)建BLE對(duì)象
? local ble_device = bluetooth_device:ble(ble_callback)
3、配置ibeacon廣播數(shù)據(jù)包
? 包含廠商特定數(shù)據(jù)格式,ibeacon類型標(biāo)識(shí)符
? 設(shè)置UUID、Major、Minor等關(guān)鍵參數(shù)
4、啟動(dòng)BLE廣播功能
? ble_device:adv_start()
3.2.4觀察者模式(scan)的基本流程(概要描述)
1、初始化藍(lán)牙框架
? bluetooth_device = bluetooth.init()
2、創(chuàng)建BLE對(duì)象
? local ble_device = bluetooth_device:ble(ble_callback)
3、開始掃描
? ble_device:scan_start()
4、在回調(diào)函數(shù)中處理掃描事件, 如接收設(shè)備信息等
5、按需停止掃描
? ble_device:scan_stop()
3.3 應(yīng)用場景
3.3.1 外圍設(shè)備+中心設(shè)備(連接模式)
設(shè)計(jì)框圖:

3.3.2 廣播者+觀察者(無連接模式)
設(shè)計(jì)框圖:

四、LuatOS上的BLE核心庫
4.1 常量詳解
4.1.1地址模式常量
ble.PUBLIC

4.1.2 特征屬性常量
ble.READ

ble.WRITE

ble.NOTIFY

ble.IND

ble.WRITE_CMD

4.1.3 事件類型常量
ble.EVENT_CONN

ble.EVENT_DISCONN

ble.EVENT_WRITE

ble.EVENT_READ_VALUE

ble.EVENT_SCAN_REPORT

ble.EVENT_GATT_ITEM

ble.EVENT_GATT_DONE

ble.EVENT_SCAN_STOP

4.1.4 廣播相關(guān)常量
ble.COMPLETE_LOCAL_NAME

ble.CHNLS_ALL

ble.CHNL_37

ble.CHNL_38

ble.CHNL_39

ble.FLAGS

ble.FLAGS 說明
在BLE中,標(biāo)志(flags)通常出現(xiàn)在廣播數(shù)據(jù)中,這些標(biāo)志用于指示設(shè)備的能力和可發(fā)現(xiàn)性等。
根據(jù)藍(lán)牙核心規(guī)范(Bluetooth Core Specification),廣播數(shù)據(jù)中的Flags字段是一個(gè)8位的位圖(bitmask),每個(gè)位代表特定的含義,以下是各個(gè)位的定義(從LSB到MSB):
Bit 0: LE Limited Discoverable Mode(有限可發(fā)現(xiàn)模式)
Bit 1: LE General Discoverable Mode(通用可發(fā)現(xiàn)模式,設(shè)備持續(xù)可被發(fā)現(xiàn))
Bit 2: BR/EDR Not Supported(不支持經(jīng)典藍(lán)牙)
Bit 3: Simultaneous LE and BR/EDR to Same Device Capable(同一設(shè)備同時(shí)支持BLE和經(jīng)典藍(lán)牙)
Bit 4: Simultaneous LE and BR/EDR to Different Devices Capable(支持同時(shí)連接不同設(shè)備的BLE和經(jīng)典藍(lán)牙)
Bit 5-7: 保留(Reserved)
注意:Bit 0和Bit 1不能同時(shí)被設(shè)置。如果同時(shí)設(shè)置,則視為無效。
Bit1和Bit2被設(shè)置時(shí),F(xiàn)lags字段的值為0x06(二進(jìn)制0000 0110),
Bit2被設(shè)置時(shí),F(xiàn)lags字段的值為0x04(二進(jìn)制0000 0100)。
ble.SERVICE_DATA

ble.MANUFACTURER_SPECIFIC_DATA

4.2 函數(shù)詳解
bluetooth.init()
功能
初始化藍(lán)牙框架
注意事項(xiàng)
必須在使用藍(lán)牙功能之前調(diào)用;
僅需要調(diào)用一次,若創(chuàng)建失敗, 會(huì)返回nil, 請(qǐng)檢查內(nèi)存是否足夠。
參數(shù)
無
返回值
local bluetooth_device = bluetooth.init()
bluetooth_device

示例

bluetooth_device:ble(ble_callback)
功能
創(chuàng)建一個(gè)BLE對(duì)象, 用于操作BLE設(shè)備
注意事項(xiàng)
必須在bluetooth.init()初始化成功后調(diào)用;
對(duì)象生命周期管理 :BLE對(duì)象需要在整個(gè)操作周期內(nèi)保持有效,從初始化到最終釋放;
全局/模塊級(jí)變量推薦 :為了確保對(duì)象在需要時(shí)始終可用,通常建議將BLE對(duì)象定義在合適的作用域中:
模塊級(jí)變量:適用于單個(gè)模塊內(nèi)部使用
全局變量:適用于跨模塊訪問
作為參數(shù)傳遞
參數(shù)
ble_callback

返回值
local ble_device = bluetooth_device:ble(ble_callback)
ble_device

示例

ble_device:scan_create(addr_mode,scan_interval,scan_window)
功能
創(chuàng)建一個(gè)BLE掃描
注意事項(xiàng)
無
參數(shù)
addr_mode

scan_interval

scan_window

返回值
local result = ble_device:scan_create(addr_mode,scan_interval,scan_window)
result

示例

ble_device:scan_start()
功能
開始BLE掃描
注意事項(xiàng)
掃描會(huì)一直進(jìn)行, 直到調(diào)用ble.scan_stop()停止掃描;
掃描到結(jié)果會(huì)觸發(fā)ble.EVENT_SCAN_REPORT事件,執(zhí)行通過bluetooth_device:ble(ble_callback)創(chuàng)建BLE對(duì)象時(shí)注冊(cè)的回調(diào)函數(shù);
掃描到同一個(gè)設(shè)備不會(huì)去重, 掃描到數(shù)據(jù)就會(huì)執(zhí)行回調(diào)。
參數(shù)
無
返回值
local result = ble_device:scan_start()
result

示例

ble_device:scan_stop()
功能
停止BLE掃描
注意事項(xiàng)
掃描會(huì)一直進(jìn)行, 直到調(diào)用ble.scan_stop()停止掃描。
參數(shù)
無
返回值
local result = ble_device:scan_stop()
result

示例

ble_device:connect(mac, addr_type)
功能
發(fā)起B(yǎng)LE連接請(qǐng)求
注意事項(xiàng)
無
參數(shù)
mac

addr_type

返回值
local result = ble_device:connect(mac, addr_type)
result

示例

ble_device:disconnect()
功能
發(fā)起B(yǎng)LE斷開連接請(qǐng)求
注意事項(xiàng)
無
參數(shù)
無
返回值
local result = ble_device:disconnect()
result

示例

ble_device:gatt_create(opts)
功能
創(chuàng)建一個(gè)BLE GATT服務(wù)
注意事項(xiàng)
確保UUID格式正確,且特征屬性使用正確的權(quán)限常量;
特征屬性必須是 ble.NOTIFY | ble.READ | ble.WRITE | ble.IND 的一種或多種組合;
參數(shù)
opts

返回值
local result = ble_device:gatt_create(opts)
result

示例

ble_device:adv_create(opts)
功能
創(chuàng)建一個(gè)BLE廣播
注意事項(xiàng)
無
參數(shù)
opts

返回值
local result = ble:adv_create(opts)
result

示例

ble_device:adv_start()
功能
開始廣播
注意事項(xiàng)
對(duì)于外圍設(shè)備模式, 如果被斷開了連接, 則需要重新開始廣播, 才能被重新搜索到
參數(shù)
無
返回值
local result = ble_device:adv_start()
result

示例

ble_device:adv_stop()
功能
主動(dòng)停止廣播
注意事項(xiàng)
無
參數(shù)
無
返回值
local result = ble_device:adv_stop()
result

示例

ble_device:write_notify(opts,value)
功能
寫入帶通知的特征值
注意事項(xiàng)
外圍設(shè)備使用,主動(dòng)向中心設(shè)備發(fā)送通知數(shù)據(jù)
參數(shù)
opts

value

返回值
local result = ble_device:write_notify(opts,value)
result

示例

ble_device:write_indicate(opts,value)
功能
寫入帶指示的特征值
注意事項(xiàng)
外圍設(shè)備使用,主動(dòng)向中心設(shè)備發(fā)送指示數(shù)據(jù)
參數(shù)
opts

value

返回值
local result = ble:write_indicate(opts,value)
result

示例

ble_device:write_value(opts,value)
功能
寫入特征值
注意事項(xiàng)
無
參數(shù)
opts

value

返回值
local result = ble_device:write_value(opts,value)
result

示例

ble_device:read_value(opts)
功能
讀取特征值
注意事項(xiàng)
無
參數(shù)
opts

返回值
local result = ble_device:read_value(opts)
result

示例

ble_device:notify_enable(opts,enable)
功能
開關(guān)通知監(jiān)聽
注意事項(xiàng)
中心設(shè)備使用,配置是否接收外圍設(shè)備發(fā)送的通知消息
參數(shù)
opts

enable

返回值
local result = ble_devie:notify_enable(opts,enable)
result

示例

ble_device:indicate_enable(opts,enable)
功能
開關(guān)指示監(jiān)聽
注意事項(xiàng)
中心設(shè)備使用,配置是否接收外圍設(shè)備發(fā)送的指示消息
參數(shù)
opts

enable

返回值
local result = ble_device:indicate_enable(opts,enable)
result

示例

ble_device:adv_decode(data)
功能
解碼廣播數(shù)據(jù)
注意事項(xiàng)
廣播數(shù)據(jù)通常來自于ble.EVENT_SCAN_REPORT 事件的ble_param.data
參數(shù)
data

返回值
local adv_data = ble_device:adv_decode(data)
adv_data

示例

ble.mac()
功能
獲取藍(lán)牙MAC
注意事項(xiàng)
無
參數(shù)
無
返回值
local mac = ble.mac
mac

示例

五、LuatOS上的BLE 應(yīng)用開發(fā)流程
本部分將深入一項(xiàng)具體實(shí)踐:在「外圍設(shè)備模式」下進(jìn)行 BLE 應(yīng)用開發(fā)。
5.1 總體設(shè)計(jì)框圖

5.2 分析項(xiàng)目代碼
這個(gè)ble peripheral demo中的readme文件,以及代碼中的注釋都比較詳細(xì),接下來我用vscode直接打開這份demo項(xiàng)目代碼,和大家一起分析下項(xiàng)目代碼;
程序結(jié)構(gòu):

文件說明:
main.lua:主程序入口文件。
ble_peripheral_main.lua:ble 外圍設(shè)備主程序,進(jìn)行 ble 初始化,設(shè)置廣播內(nèi)容,處理各類 ble 事件(連接、斷開連接、寫入請(qǐng)求等)。
ble_peripheral_receiver.lua:BLE 外圍設(shè)備接收數(shù)據(jù)處理。
ble_peripheral_sender.lua:BLE 外圍設(shè)備發(fā)送數(shù)據(jù)處理。
ble_timer_app.lua:ble 外圍設(shè)備定時(shí)器處理邏輯,啟動(dòng)兩個(gè)循環(huán)定時(shí)器,一個(gè)是以 notify 方式主動(dòng)向中心設(shè)備推送數(shù)據(jù)(需中心設(shè)備先開啟 notify 訂閱),另一個(gè)是使用 write 方式,更新特征值數(shù)據(jù),中心設(shè)備需要主動(dòng)讀取特征值獲取最新數(shù)據(jù)。
ble_uart_app.lua:ble 外圍設(shè)備接 uart 處理邏輯,將收到的中心設(shè)備的寫入數(shù)據(jù),通過 uart 發(fā)送到 pc 端串口工具。
check_wifi.lua:Air8000 的藍(lán)牙功能依賴 WiFi 協(xié)處理器,需確保 WiFi 固件為最新版本。本腳本文件檢查當(dāng)前 Air8000 模組的 WiFi 固件是否為最新版本,若不是則自動(dòng)啟動(dòng)升級(jí)(需插入可聯(lián)網(wǎng)的 SIM 卡)
5.3 Air8000開發(fā)板上運(yùn)行演示這個(gè)項(xiàng)目
準(zhǔn)備硬件環(huán)境:
1、Air8000開發(fā)板一塊+2.4gwifi天線一根:
天線裝到開發(fā)板上
2、TYPE-C USB數(shù)據(jù)線一根 + USB轉(zhuǎn)串口數(shù)據(jù)線一根,Air8000開發(fā)板和數(shù)據(jù)線的硬件接線方式為:
Air8000開發(fā)板通過TYPE-C USB口供電;(外部供電/USB供電 撥動(dòng)開關(guān) 撥到 USB供電一端)
TYPE-C USB數(shù)據(jù)線直接插到核心板的TYPE-C USB座子,另外一端連接電腦USB口;
六、BLE外圍設(shè)備模式常見問題分析
6.1 燒錄示例demo后,無法搜到藍(lán)牙
Air8000
1、首先檢查demo,固件是否是最新的,若不是則需更新的最新的版本測試,若已經(jīng)是最新的,看第2步
2、luatools日志全局搜 AIRLINK_READY,查看WIFI固件版本打印(因?yàn)锳ir8000的藍(lán)牙功能依賴WiFi協(xié)處理器)

version后面的數(shù)字代表的是wifi固件的版本,目前最新發(fā)布的是14。
如果不是最新的14,此時(shí)需要升級(jí)wifi固件,目前有兩種wifi的升級(jí)方式,可自由選擇:
(1)4g遠(yuǎn)程升級(jí)wifi
在示例demo中的main.lua中,會(huì)有下面這句話,打開require "check_wifi"即可通過4g升級(jí)wifi,不過注意要插上能夠正常上網(wǎng)的sim卡。

(2)本地線刷升級(jí)wifi
參考下面這篇文檔,進(jìn)行線刷升級(jí)wifi固件
https://docs.openluat.com/air8000/luatos/app/updatwifi/update/
若升級(jí)好后,測試依舊有問題,請(qǐng)向技術(shù)人員反饋。
Air8101
首先檢查demo,固件是否 都是最新的,若不是則需更新demo以及固件版本測試;若檢查已經(jīng)是最新的還是測試有問題,請(qǐng)向我們技術(shù)人員反饋。
6.2 使用Air8000/Air8101 作為外圍設(shè)備,向已經(jīng)建立連接的手機(jī)藍(lán)牙調(diào)試軟件發(fā)送數(shù)據(jù),發(fā)現(xiàn)手機(jī)調(diào)試軟件接收到的數(shù)據(jù)不全。
原因:
MTU設(shè)置的問題,Air8000/Air8101支持的MTU默認(rèn)是256字節(jié),如果手機(jī)上的藍(lán)牙調(diào)試軟件的MTU較小,會(huì)以小的為準(zhǔn)。
解決方案:
1、可以通過Air8000讀到對(duì)端藍(lán)牙設(shè)備的MTU大小,根據(jù)讀到的MTU的大小做分包處理即可。(讀取對(duì)端設(shè)備MTU的功能還在開發(fā)中)
2、調(diào)大對(duì)端藍(lán)牙設(shè)備的MTU。
七、LuatOS 上的中心設(shè)備模式應(yīng)用開發(fā)流程
7.1 前置知識(shí)了解
7.1.1 UUID
7.1.1.1 UUID 是什么?
UUID 是藍(lán)牙 GATT 協(xié)議的 “數(shù)字身份證”,通過標(biāo)準(zhǔn)化的唯一標(biāo)識(shí)機(jī)制,實(shí)現(xiàn)了跨廠商設(shè)備的功能互認(rèn)(標(biāo)準(zhǔn) UUID)與廠商個(gè)性化功能的擴(kuò)展(自定義 UUID)
藍(lán)牙協(xié)議通過 UUID 實(shí)現(xiàn)設(shè)備間的標(biāo)準(zhǔn)化通信,使用藍(lán)牙對(duì)外提供服務(wù)的設(shè)備,需要有對(duì)應(yīng)的服務(wù)功能,服務(wù)是藍(lán)牙設(shè)備中功能劃分的單元,每個(gè)服務(wù)都對(duì)應(yīng)著一種特定的功能或數(shù)據(jù)傳輸需求。
例如,當(dāng)一個(gè)藍(lán)牙設(shè)備(如智能手環(huán))向外界廣播服務(wù)時(shí),會(huì)攜帶對(duì)應(yīng)的 UUID,其他設(shè)備(如手機(jī))通過識(shí)別這些 UUID,就能知道該設(shè)備提供哪些功能(如心率監(jiān)測、數(shù)據(jù)傳輸?shù)龋⒔⑨槍?duì)性的連接。
一個(gè)藍(lán)牙設(shè)備可以包含多個(gè)服務(wù)(Service),每個(gè)服務(wù)通過一個(gè) UUID(服務(wù) UUID) 進(jìn)行標(biāo)識(shí)。
每個(gè)服務(wù)下包含多個(gè)特征(Characteristic),每個(gè)特征都擁有一個(gè)獨(dú)立的 UUID(特征 UUID)作為其唯一標(biāo)識(shí)。
特征是最小的數(shù)據(jù)單元,我們通過讀寫特征來與設(shè)備交互。
1、服務(wù)(Service)
是什么:服務(wù)是藍(lán)牙設(shè)備功能的邏輯分組,類似于一個(gè)"功能模塊"。
例如:心率監(jiān)測服務(wù)、電池電量服務(wù)等。
作用:定義設(shè)備能做什么(如測量心率、監(jiān)控電量)。通過 UUID 唯一標(biāo)識(shí)。
示例:

2、特征(Characteristic)
是什么:特征是服務(wù)的子元素,是服務(wù)中的具體數(shù)據(jù)點(diǎn),用于實(shí)際的數(shù)據(jù)讀寫操作。
例如:心率值、電池電量百分比。
作用:存儲(chǔ)具體數(shù)據(jù)(如 71 bpm)。通過 UUID 和 屬性(Properties) 定義操作權(quán)限(讀/寫/通知等)。
示例:

3、描述符(Descriptor)
是什么:描述符是特征的子元素,是特征的附加信息,用于細(xì)化特征的行為或配置。
例如:啟用數(shù)據(jù)通知、設(shè)置數(shù)據(jù)格式。
作用:配置特征的行為(如開啟實(shí)時(shí)通知)。補(bǔ)充描述特征(如單位、數(shù)據(jù)范圍)。
最常見描述符:。
Client Characteristic Configuration Descriptor (CCCD)
用于啟用/禁用特征的 NOTIFY 或 INDICATE 功能。
三者的層級(jí)關(guān)系:

實(shí)際示例(手環(huán)):

7.1.1.2 UUID 的格式:
藍(lán)牙 UUID 的標(biāo)準(zhǔn)格式為 128 位,通常表示為 32 個(gè)十六進(jìn)制字符,以 8-4-4-4-12 的格式分組,共 36 個(gè)字符(包括 4 個(gè)連字符):
格式:8-4-4-4-12
示例:0000180D-0000-1000-8000-00805F9B34FB
標(biāo)準(zhǔn) UUID:
由藍(lán)牙技術(shù)聯(lián)盟(Bluetooth SIG)定義,用于常見服務(wù)。
標(biāo)準(zhǔn)的 UUID 為:0000xxxx-0000-1000-8000-00805F9B34FB。
為了節(jié)省帶寬,標(biāo)準(zhǔn) UUID 通常使用 16 位或 32 位短格式,實(shí)際通信時(shí)自動(dòng)擴(kuò)展為 128 位。每一個(gè)藍(lán)牙技術(shù)聯(lián)盟定義的屬性有一個(gè)唯一的 16 位 UUID,以代替上面的基本 UUID 的‘x’部分。
若 16 bit UUID 為 xxxx,那么 128 bit UUID 為 0000xxxx-0000-1000-8000-00805F9B34FB。
若 32 bit UUID 為 xxxxxxxx,那么 128 bit UUID 為 xxxxxxxx-0000-1000-8000-00805F9B34FB。
自定義 UUID:
用于私有服務(wù)或廠商特定功能,需開發(fā)者自行生成,通常使用 UUID 隨機(jī)生成器生成 128 位 UUID,確保全球唯一性
7.1.1.3 UUID 的分類
藍(lán)牙規(guī)定好的 uuid 如下:
0x180x 開頭 → 只能當(dāng) Service UUID
0x2Axx 開頭 → 只能當(dāng) Characteristic UUID
0x29xx 開頭 → 只能當(dāng) Descriptor UUID
0x180x 開頭 UUID(Service UUID)
0x180x 區(qū)間只能當(dāng) Service UUID。

0x2Axx 開頭 UUID(Characteristic UUID)
0x2Axx (0x2A00 – 0x2AFF) 區(qū)間只能當(dāng) Characteristic UUID。

0x29xx 開頭 UUID(Descriptor UUID)
0x29xx 開頭只能當(dāng) Descriptor UUID,即描述符 UUID。
這里僅介紹一個(gè)使用最頻繁的 UUID:0x2902
0x2902 - Client Characteristic Configuration(CCC,客戶端特征配置描述符)
這是一個(gè)可寫的描述符,允許客戶端設(shè)備(如手機(jī)、電腦)配置如何從服務(wù)器設(shè)備(BLE 外設(shè))接收數(shù)據(jù)更新。主要用于啟用或禁用通知(Notifications) 和指示(Indications) 功能。
BLE 實(shí)時(shí)數(shù)據(jù)推送(如傳感器數(shù)據(jù)、狀態(tài)更新)都需要通過正確配置 0x2902 描述符來實(shí)現(xiàn)。
UUID 格式:
完整 UUID:00002902-0000-1000-8000-00805f9b34fb
縮寫:0x2902
類型:Descriptor(描述符)
有效值:
0xFFxx 開頭 UUID(Vendor Specific)
0xFF00 ~ 0xFFFF 區(qū)間為 SIG 的公共預(yù)留池(Vendor-Specific 區(qū)間) 任何廠商都可以臨時(shí)借用。
這個(gè)區(qū)間 SIG 作為公共預(yù)留區(qū)間,一般用作示例測試參考,屬于臨時(shí)方案,想要作為產(chǎn)品,要么去 SIG 申請(qǐng)正式分配,要么直接用 128-bit 自建 UUID。
注意事項(xiàng):
1、整個(gè) 16-bit 空間都由 Bluetooth SIG 的官方文檔 《Assigned Numbers》統(tǒng)一管理
2、商用不要使用已存在的 UUID,可以用 128-bit 自定義 UUID,或者在 SIG 申請(qǐng)正式分配。
3、同一設(shè)備,不同特征 UUID 任何時(shí)候都不能一樣。
4、自定義的 128-bit UUID,服務(wù) UUID 可以和 特征 UUID 一樣,SIG 規(guī)定的 16-bit 的服務(wù)和特征值的 UUID 不能一樣。

7.1.2 Properties
特征的關(guān)鍵屬性(Properties)
特征通過 “屬性” 定義數(shù)據(jù)的操作方式,常見屬性包括:

7.2 demo 項(xiàng)目總體設(shè)計(jì)框圖
demo 項(xiàng)目的總體設(shè)計(jì)框圖如下:

7.3 源碼分析
7.3.1 文件說明

1、main.lua:主程序入口文件。
2、ble_client_main.lua:BLE 中心設(shè)備主程序,進(jìn)行 BLE 初始化,處理各類 BLE 事件(連接、斷開連接、掃描報(bào)告、GATT 操作完成等)。
3、ble_client_receiver.lua:BLE 中心設(shè)備接收數(shù)據(jù)處理。
4、ble_client_sender.lua:BLE 中心設(shè)備發(fā)送數(shù)據(jù)處理。
5、ble_timer_app.lua:BLE 中心設(shè)備定時(shí)器處理邏輯,啟動(dòng)兩個(gè)循環(huán)定時(shí)器,一個(gè)用于定時(shí)讀取外圍設(shè)備特征值 UUID 數(shù)據(jù),一個(gè)用于定時(shí)向外圍設(shè)備特征值 UUID 發(fā)送數(shù)據(jù)。
6、ble_uart_app.lua:BLE 中心設(shè)備接 uart 處理邏輯,將收到的 notify 數(shù)據(jù),通過 uart 發(fā)送到 pc 端串口工具。
7、check_wifi.lua:Air8000 的藍(lán)牙功能依賴 WiFi 協(xié)處理器,需確保 WiFi 固件為最新版本。本腳本文件檢查當(dāng)前 Air8000 模組的 WiFi 固件是否為最新版本,若不是則自動(dòng)啟動(dòng)升級(jí)(需插入可聯(lián)網(wǎng)的 SIM 卡)
7.3.2 ble_client_main.lua
本文件為 ble client 主應(yīng)用功能模塊,整個(gè)應(yīng)用通過 sysplus.taskInitEx 啟動(dòng)主任務(wù),實(shí)現(xiàn)了完整的 BLE 中心設(shè)備功能,包括設(shè)備發(fā)現(xiàn)、連接管理、數(shù)據(jù)收發(fā)和異?;謴?fù)機(jī)制。核心業(yè)務(wù)邏輯為:
7.3.2.1 初始化與配置
加載依賴模塊( ble_client_receiver 用于數(shù)據(jù)接收處理, ble_client_sender 用于數(shù)據(jù)發(fā)送處理)。
定義配置參數(shù)(目標(biāo)設(shè)備名稱、服務(wù) UUID、特征值 UUID、超時(shí)時(shí)間等)。
調(diào)用 ble_init(),初始化藍(lán)牙功能。
7.3.2.2 設(shè)備掃描與連接
創(chuàng)建并啟動(dòng) BLE 掃描(默認(rèn)參數(shù):公共地址模式、掃描間隔 100ms、掃描窗口 100ms)。
通過 is_target_device 函數(shù)過濾掃描到的設(shè)備(匹配設(shè)備名稱)。
發(fā)現(xiàn)目標(biāo)設(shè)備后停止掃描并發(fā)起連接。
連接超時(shí)處理和重連機(jī)制。
7.3.2.3 事件處理
通過 ble_event_cb 回調(diào)函數(shù)處理各類 BLE 事件:
連接成功(EVENT_CONN)
斷開連接(EVENT_DISCONN)
掃描報(bào)告(EVENT_SCAN_REPORT)
GATT 操作完成(EVENT_GATT_DONE)
讀取特征值完成(EVENT_READ_VALUE)
7.3.2.4 業(yè)務(wù)功能
GATT 服務(wù)發(fā)現(xiàn)完成后,自動(dòng)啟用目標(biāo)特征值的通知監(jiān)聽。
接收并處理來自其他模塊的讀取請(qǐng)求(READ_REQ)。
通過消息隊(duì)列與其他模塊通信。
7.3.2.5 異常處理
掃描超時(shí)或連接失敗時(shí)觸發(fā)異常處理。
斷開連接后自動(dòng)清理消息隊(duì)列并嘗試重連。
異常情況下 5 秒后重新開始掃描連接。
7.3.3 ble_client_receiver.lua
7.3.3.1 主要功能
數(shù)據(jù)分類處理 :接收兩類數(shù)據(jù)(外圍設(shè)備通知數(shù)據(jù)和主動(dòng)讀取到的數(shù)據(jù))。
數(shù)據(jù)分發(fā) :根據(jù)數(shù)據(jù)類型(通過特征值 UUID 區(qū)分)發(fā)布到不同的消息隊(duì)列,供其他模塊處理。
7.3.3.2 核心實(shí)現(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ù)類型。
對(duì)于外圍設(shè)備的通知數(shù)據(jù),通過sys.publish("RECV_BLE_NOTIFY_DATA", ...)發(fā)布。
對(duì)于主動(dòng)讀取到的數(shù)據(jù),通過sys.publish("RECV_BLE_READ_DATA", ...)發(fā)布。
7.3.3.3 數(shù)據(jù)流轉(zhuǎn)
當(dāng)ble_client_main模塊接收到EVENT_READ_VALUE事件時(shí),會(huì)調(diào)用此模塊的 proc 函數(shù)。
本模塊將數(shù)據(jù)分類后發(fā)布到對(duì)應(yīng)的消息主題。
其他訂閱了這些消息主題的模塊可以接收并處理數(shù)據(jù)。
7.3.4 ble_client_sender.lua
其他模塊只需發(fā)布"SEND_DATA_REQ"消息即可請(qǐng)求中心設(shè)備向外圍設(shè)備發(fā)送數(shù)據(jù)。
7.3.4.1 主要功能
消息訂閱:訂閱"SEND_DATA_REQ"消息,接收其他模塊的發(fā)送請(qǐng)求。
隊(duì)列管理:維護(hù)發(fā)送隊(duì)列 send_queue,存儲(chǔ)待發(fā)送的數(shù)據(jù)項(xiàng)(包含服務(wù) UUID、特征值 UUID、數(shù)據(jù)、回調(diào)信息)。
任務(wù)調(diào)度:通過任務(wù)處理函數(shù) ble_client_sender_task_func 處理各類 BLE 事件。
數(shù)據(jù)發(fā)送:按順序發(fā)送隊(duì)列中的數(shù)據(jù),并通過回調(diào)通知發(fā)送結(jié)果。
7.3.4.2 核心實(shí)現(xiàn)
其他模塊通過sys.publish("SEND_DATA_REQ", ...)發(fā)布 發(fā)送請(qǐng)求。
send_data_req_proc_func函數(shù)將請(qǐng)求數(shù)據(jù)加入發(fā)送隊(duì)列,并通知任務(wù)。
任務(wù)處理函數(shù)根據(jù) BLE 事件狀態(tài)(連接成功、斷開連接等)處理隊(duì)列數(shù)據(jù)。
send_item_func函數(shù)負(fù)責(zé)實(shí)際發(fā)送數(shù)據(jù)。
send_item_cbfunc函數(shù)處理發(fā)送結(jié)果,調(diào)用用戶回調(diào)。
7.3.4.3 事件處理
CONNECT_OK:BLE 連接成功,開始發(fā)送隊(duì)列數(shù)據(jù)。
SEND_REQ:有新數(shù)據(jù)需要發(fā)送,繼續(xù)處理隊(duì)列。
DISCONNECTED:連接斷開,清空隊(duì)列并通知所有發(fā)送請(qǐng)求失敗。
7.3.5 ble_uart_app.lua
UART 初始化:打開 UART1 接口,配置波特率 115200、數(shù)據(jù)位 8、停止位 1、無奇偶校驗(yàn)。
數(shù)據(jù)接收:訂閱 "RECV_BLE_NOTIFY_DATA" 消息,接收來自 BLE 外圍設(shè)備的通知數(shù)據(jù)。
數(shù)據(jù)轉(zhuǎn)發(fā):將接收到的 BLE 數(shù)據(jù)(包含服務(wù) UUID、特征值 UUID 和實(shí)際數(shù)據(jù))格式化后通過 UART1 發(fā)送到 PC 端。
7.3.6 ble_timer_app
7.3.6.1 主要功能
創(chuàng)建兩個(gè)獨(dú)立的 5 秒循環(huán)定時(shí)器
一個(gè)用于定時(shí) 發(fā)送 數(shù)據(jù)到外圍設(shè)備特定特征值 UUID。
一個(gè)用于定時(shí) 讀取 外圍設(shè)備特定特征值 UUID 的數(shù)據(jù)。
7.3.6.2 核心實(shí)現(xiàn)
定義了目標(biāo)服務(wù) UUID( FA00 )和特征值 UUID(寫: EA02 ,讀: EA03 )。
實(shí)現(xiàn)數(shù)據(jù)發(fā)送結(jié)果回調(diào)函數(shù) send_data_cbfunc ,用于處理發(fā)送成功/失敗的通知。
實(shí)現(xiàn)兩個(gè)定時(shí)器回調(diào)函數(shù):send_data_req_timer_cbfunc:發(fā)布SEND_DATA_REQ消息到 ble_client_sender 模塊。read_data_req_timer_cbfunc:發(fā)送READ_REQ請(qǐng)求到 ble_client_main 模塊。
啟動(dòng)兩個(gè) 5 秒循環(huán)定時(shí)器,分別綁定上述兩個(gè)回調(diào)函數(shù)。
7.3.6.3 數(shù)據(jù)流轉(zhuǎn)
發(fā)送流程:定時(shí)器觸發(fā) → 發(fā)布SEND_DATA_REQ消息 →ble_client_sender處理 → 回調(diào)通知結(jié)果。
讀取流程:定時(shí)器觸發(fā) → 發(fā)送READ_REQ請(qǐng)求 →ble_client_main處理 → 結(jié)果通過事件返回。
7.4 日志分析
接下來用兩個(gè) Air8000 核心板,一個(gè)燒錄外圍設(shè)備的 demo,另一個(gè)燒錄中心設(shè)備的 demo,來演示中心設(shè)備如何讀,寫操作。
1、中心設(shè)備訂閱外圍設(shè)備特征通知(Notify)

2、中心設(shè)備寫入特征值(Write)

3、中心設(shè)備主動(dòng)讀取特征值數(shù)據(jù)(Read)

八、LuatOS 上的廣播模式應(yīng)用開發(fā)流程
8.1 前置知識(shí)了解
8.1.1 ibeacon 介紹
1、ibeacon 技術(shù)是 Apple 公司在 2013 年 9 月發(fā)布的一種基于 BLE 藍(lán)牙的通信協(xié)議,主要用于短距離傳送少量數(shù)據(jù)。
它通過周期性廣播包含唯一標(biāo)識(shí)符(UUID、Major、Minor)的數(shù)據(jù)包,使智能設(shè)備在接收信號(hào)后,結(jié)合信號(hào)強(qiáng)度(RSSI)估算距離,實(shí)現(xiàn)室內(nèi)定位、場景觸發(fā)等功能。
2、ibeacon 規(guī)定了一個(gè) 30 個(gè)字節(jié)的廣播包。其中需要重點(diǎn)解析的是后21 個(gè)字節(jié)(即從 UUID 開始),此前字節(jié)重在標(biāo)識(shí)是否為 ibeacon 協(xié)議。
ibeacon 廣播數(shù)據(jù)包的完整格式如下:

一個(gè) 30 字節(jié)的完整的 iBeacon 可做如下拆解:
AD Structure1(Advertising Data Structure)
長度字段(1 字節(jié)):此處一般為 0x02(即十進(jìn)制 2),表示該 AD Structure 后續(xù)數(shù)據(jù)的總字節(jié)數(shù)
類型字段(1 字節(jié)):0x01(Flags,廣播標(biāo)志位)
數(shù)據(jù)(1 字節(jié)):0x06(Flags 的值,表示可被發(fā)現(xiàn)且支持 BLE 通用模式,F(xiàn)lags 見 7.2 章節(jié))
AD Structure2
長度字段(1 字節(jié)):此處一般為 0x1A(即十進(jìn)制 26)表示后續(xù)數(shù)據(jù)的總字節(jié)數(shù)
類型字段(1 字節(jié)):固定為 0xFF,表示廠商特定數(shù)據(jù)。
數(shù)據(jù)(此處為公司標(biāo)識(shí)符)(2 字節(jié)):蘋果的公司 ID 為 0x004C(小端存儲(chǔ)為 0x4C 0x00)。
iBeacon 有效載荷(仍屬于 AD Structure2)
iBeacon 類型標(biāo)識(shí)符(1 字節(jié)):固定為 0x02,表示子類型為 iBeacon
iBeacon 數(shù)據(jù)長度(1 字節(jié)):固定為 0x15,表示 ibeacon 后續(xù)數(shù)據(jù)長度為 21 字節(jié)后續(xù)數(shù)據(jù)長度為需要重點(diǎn)解析的 21 字節(jié)
Proximity UUID(16 字節(jié)):設(shè)備的唯一標(biāo)識(shí)符(如 UUID)。
Major(2 字節(jié)):用于區(qū)分區(qū)域(如建筑樓層)。
Minor(2 字節(jié)):用于更細(xì)粒度的定位(如具體房間)。
Tx Power(1 字節(jié)):校準(zhǔn)信號(hào)強(qiáng)度的參考值(RSSI at 1m)。
AD Structures 是什么?
在 BLE 協(xié)議中,設(shè)備通過廣播包(Advertising Packet)向外發(fā)送數(shù)據(jù)。
一個(gè)廣播包可能包含多個(gè) AD Structure(Advertising Data Structure),每個(gè) AD Structure 用于描述不同的信息(例如設(shè)備名稱、服務(wù) UUID、廠商數(shù)據(jù)等)。
每個(gè) AD Structure 的格式固定為:
[長度(1字節(jié))] + [類型(1字節(jié))] + [數(shù)據(jù)(N字節(jié))]
長度字段(1 字節(jié)):表示類型 + 數(shù)據(jù)的總字節(jié)數(shù)(即類型1字節(jié) + 數(shù)據(jù)N字節(jié))。
類型字段(1 字節(jié)):定義數(shù)據(jù)的用途(例如0xFF表示廠商數(shù)據(jù),0x09表示設(shè)備名稱)。
數(shù)據(jù)字段(N 字節(jié)):具體內(nèi)容,長度由長度字段-1決定(因?yàn)轭愋驼?1 字節(jié))。
AD Structure 的解析規(guī)則:
順序無關(guān):AD Structure 的順序不固定。
長度限制:總長度不超過 31 字節(jié)(若為擴(kuò)展廣播,可更長,但 iBeacon 不支持)。
類型唯一性:同一類型可能重復(fù)出現(xiàn)(例如多個(gè)廠商數(shù)據(jù)塊)。
在解析時(shí),可以通過以下步驟遍歷所有 AD Structure:
從廣播包首字節(jié)開始。
讀取長度字段(1 字節(jié)),確定當(dāng)前 AD Structure 的總長度(包括類型和數(shù)據(jù))。
讀取類型字段(1 字節(jié)),判斷數(shù)據(jù)類型。
根據(jù)類型,處理后續(xù)數(shù)據(jù)。
常見 AD Structure 類型對(duì)照表:
其中標(biāo)志位,長度,類型我們不需要處理,我們只需要關(guān)注 ibeacon 的有效載荷部分,接下來詳細(xì)介紹下這部分字段內(nèi)容:
廠商標(biāo)識(shí)符(2 字節(jié)):是藍(lán)牙技術(shù)中用于唯一標(biāo)識(shí)設(shè)備制造商或品牌方的 2 字節(jié)(16 位)編碼,范圍是0x0000~0xFFFF(即 0~65535),它的核心作用是區(qū)分不同廠商的藍(lán)牙設(shè)備,確保數(shù)據(jù)解析和兼容性。
ibeacon 類型標(biāo)識(shí)符(1 字節(jié)):固定為 0x02, 表示子類型為 ibeacon。
ibeacon 數(shù)據(jù)長度(1 字節(jié)):固定為 0x15,表示 ibeacon 數(shù)據(jù)長度 21 字節(jié)。
Proximity UUID(16 字節(jié)):通用唯一標(biāo)識(shí)符。
這是一個(gè) 128 位(16 字節(jié))的唯一標(biāo)識(shí)符,用于區(qū)分你所在的 iBeacon 網(wǎng)絡(luò)。 例如,一個(gè)商店的所有 iBeacon 可以使用同一個(gè) UUID,這樣你的應(yīng)用就可以知道用戶進(jìn)入了該商店區(qū)域。 通常,一個(gè)組織或一個(gè)應(yīng)用使用同一個(gè) UUID,然后通過 Major 和 Minor 來進(jìn)一步細(xì)分區(qū)域和設(shè)備。
Major(2 字節(jié)):主標(biāo)識(shí),用于區(qū)分同一組織(UUID 相同)下的不同區(qū)域或組別。
Major 是一個(gè) 16 位的無符號(hào)整數(shù),用于將一組相關(guān)的設(shè)備進(jìn)行分組。 例如,一個(gè)連鎖商店的每個(gè)分店可以使用相同的 Major 值,這樣應(yīng)用就知道用戶進(jìn)入了哪個(gè)分店。
Minor(2 字節(jié)):次標(biāo)識(shí),用于在同一個(gè) Major 組內(nèi)進(jìn)行更細(xì)粒度的區(qū)分。
Minor 也是一個(gè) 16 位的無符號(hào)整數(shù),用于標(biāo)識(shí)特定的 iBeacon。 例如,在一個(gè)分店內(nèi),每個(gè)貨架或區(qū)域可以有一個(gè)唯一的 Minor 值。這樣,應(yīng)用就可以知道用戶接近哪個(gè)具體的貨架。
Signal Power(1 字節(jié)):校準(zhǔn)信號(hào)強(qiáng)度的參考值,單位 dBm。(該位為 8 位有符號(hào)數(shù)據(jù),范圍為-128 到 127,最高位是符號(hào)位)
這個(gè)字段是 8 位有符號(hào)整數(shù),表示在距離 iBeacon 設(shè)備 1 米處測量到的信號(hào)強(qiáng)度(RSSI)。這個(gè)值用于校準(zhǔn),幫助估算與設(shè)備之間的實(shí)際距離。設(shè)備接收到信標(biāo)的信號(hào)強(qiáng)度(RSSI)后,與這個(gè)校準(zhǔn)值進(jìn)行比較,通過信號(hào)衰減模型來估算距離。 例如:0xC0 對(duì)應(yīng)-64dBm
十六進(jìn)制 0xC0 的二進(jìn)制表示為 11000000
作為有符號(hào)整數(shù),最高位 1 表示負(fù)數(shù)
取反加 1 計(jì)算補(bǔ)碼值:01000000 = 64
因此,0xC0 對(duì)應(yīng)十進(jìn)制-64
注:
1、如何獲取廠商標(biāo)識(shí)符?
(1)向藍(lán)牙技術(shù)聯(lián)盟(SIG)直接申請(qǐng)。
(2)使用已授權(quán)廠商的 ID,申請(qǐng)得到其授權(quán)。
2、Signal Power 是 8 位有符號(hào)整數(shù),例如:0xC0 的二進(jìn)制表示是 1100 0000,最高位 1 代表負(fù)數(shù),對(duì)應(yīng)十進(jìn)制是-64。
3、廠商標(biāo)識(shí)符是按照小端序存儲(chǔ)的,例如:Apple 的公司 ID 是0x004C(大端序),但在藍(lán)牙數(shù)據(jù)包中按規(guī)范存儲(chǔ)為4C 00(小端序)。
注意:Apple 的 ID 是 0x004C,但是 demo 中需按照 0x4C,0x00 的方式寫入存儲(chǔ)。
原因:在 BLE 協(xié)議中,公司 ID 按照小端序存儲(chǔ)。
大端序:高位字節(jié)存儲(chǔ)在低地址,低位字節(jié)存儲(chǔ)在高地址,0x004C在大端序中存儲(chǔ)為00 4C

小端序:高位字節(jié)存儲(chǔ)在高地址,低位字節(jié)存儲(chǔ)在低地址,0x004C 在小端序中存儲(chǔ)為4C 00

8.1.2 ibeacon 如何利用 Signal Power 和 RSSI 進(jìn)行距離估算?
ibeacon 通過 Signal Power(出廠校準(zhǔn)信號(hào)強(qiáng)度) 和 RSSI(接收信號(hào)強(qiáng)度) 估算設(shè)備與 ibeacon 之間的距離,其核心原理基于藍(lán)牙信號(hào)衰減模型。簡單來講就是設(shè)備出廠前先根據(jù)實(shí)際情況,測算在 1 米距離時(shí)的信號(hào)強(qiáng)度是多少,作為基準(zhǔn)值,然后基于藍(lán)牙信號(hào)衰減模型,根據(jù)實(shí)際信號(hào)值 RSSI 推算出實(shí)際距離。以下是具體方法和實(shí)現(xiàn)步驟:
注意:不同的藍(lán)牙設(shè)備或相同設(shè)備不同的工況甚至不同的場地環(huán)境,都會(huì)影響 Signal Power 值,因此這個(gè)值雖然可以測量,但一定程度上是個(gè)經(jīng)驗(yàn)值,很難測準(zhǔn)。故 ibeacon 的距離估算功能只是估算大概范圍,并不能用于精準(zhǔn)定位。
1、關(guān)鍵概念
2、距離估算公式
iBeacon 使用 對(duì)數(shù)路徑損耗模型(Log-distance Path Loss Model)計(jì)算距離:

d:估算距離(米)。
n:環(huán)境衰減因子(通常 2~4,空曠環(huán)境=2,普通室內(nèi)=2.5-3,復(fù)雜環(huán)境多障礙物=3.5-4),環(huán)境越復(fù)雜信號(hào)衰減越快。
Tx Power:Beacon 的校準(zhǔn)信號(hào)強(qiáng)度(通過實(shí)際環(huán)境測量擬合,需預(yù)先標(biāo)定)。
RSSI:手機(jī)實(shí)際測得的信號(hào)強(qiáng)度。
3、示例計(jì)算
Tx Power = -60 dBm
RSSI = -80 dBm
n = 2.5(室內(nèi)環(huán)境)

8.2 源碼分析
8.2.1 文件說明
1、main.lua:主程序入口文件。
2、ble_ibeacon.lua:iBeacon 功能的具體實(shí)現(xiàn),負(fù)責(zé)藍(lán)牙初始化、廣播配置和異常處理。
3、check_wifi.lua:Air8000 的藍(lán)牙功能依賴 WiFi 協(xié)處理器,需確保 WiFi 固件為最新版本。本腳本文件檢查當(dāng)前 Air8000 模組的 WiFi 固件是否為最新版本,若不是則自動(dòng)啟動(dòng)升級(jí)(需插入可聯(lián)網(wǎng)的 SIM 卡)
8.2.2 ble_ibeacon.lua
8.2.2.1 全局變量定義
device_name :廣播設(shè)備名稱,
adv_state :廣播狀態(tài)標(biāo)志,用于跟蹤 iBeacon 廣播的開啟/關(guān)閉狀態(tài),
ibeacon_data :iBeacon 廣播數(shù)據(jù)包,包含以下結(jié)構(gòu):
廠商標(biāo)識(shí)符(2 字節(jié)):0x004C,本例演示的是 ibeacon,所以采用 Apple 的 ID:0x004C(iBeacon 是 Apple 的專有技術(shù),采用 Apple 的 ID 才能顯示成 ibeacon)
ibeacon 類型標(biāo)識(shí)符(2 字節(jié)):固定為 0x02,0x15, 表示子類型為 ibeacon。
Proximity UUID(16 字節(jié)):0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
Major(2 字節(jié)):0x00,0x01
Minor(2 字節(jié)):0x00,0x02
Signal Power(1 字節(jié)):0xC0

8.2.2.2 事件回調(diào)函數(shù) (ble_callback)
處理 BLE 設(shè)備的各種事件:
ble.EVENT_ADV_START :廣播成功啟動(dòng)時(shí)設(shè)置 adv_state 為 true
ble.EVENT_ADV_STOP :廣播停止時(shí)設(shè)置 adv_state 為 false

8.2.2.3 核心任務(wù)函數(shù) (ble_ibeacon_task_func)
這是模塊的主要功能實(shí)現(xiàn),采用無限循環(huán)結(jié)構(gòu)確保廣播穩(wěn)定運(yùn)行:
初始化藍(lán)牙核心 :創(chuàng)建 bluetooth_device 實(shí)例
初始化 BLE 功能 :創(chuàng)建 ble_device 實(shí)例并注冊(cè)回調(diào)
配置廣播參數(shù) :通過 adv_create 方法設(shè)置:
廣播地址模式 (ble.PUBLIC)
廣播通道 (ble.CHNLS_ALL)
廣播間隔 (intv_min/max = 120)
廣播數(shù)據(jù) (包含標(biāo)志位、iBeacon 數(shù)據(jù)和設(shè)備名稱)
啟動(dòng)廣播 :調(diào)用 adv_start()方法
狀態(tài)監(jiān)控 :通過 while adv_state 循環(huán)監(jiān)控廣播狀態(tài)
異常處理 :使用 goto EXCEPTION_PROC 標(biāo)簽統(tǒng)一處理各種初始化失敗情況
資源清理與重試 :在異常情況下停止廣播并重新初始化,間隔 5 秒后重試

8.3 日志分析
luatools 日志比較簡單,只有開啟廣播的 log 打印

重點(diǎn)看 nrf connect 掃描出來的 ibeacon 信息:

九、LuatOS 上的掃描模式應(yīng)用開發(fā)流程
9.1 前置知識(shí)了解
9.1.1 掃描窗口和掃描間隔
掃描窗口(scan_window):
是指 BLE 設(shè)備在掃描過程中,打開接收器去監(jiān)聽廣播設(shè)備的時(shí)間段。這個(gè)時(shí)間段是設(shè)備實(shí)際進(jìn)行掃描操作的時(shí)間,也稱為掃描事件的持續(xù)時(shí)間。掃描窗口的單位通常是 0.625ms,并且它的值必須小于或等于掃描間隔。
掃描間隔(scan_interval):
表示兩次掃描事件之間的間隔時(shí)間。掃描間隔的單位與掃描窗口相同,單位也是 0.625ms。
注:
1、如果掃描窗口與掃描間隔一樣長,表明主機(jī)一直在掃描。
2、掃描窗口和掃描間隔是在 ble_device:scan_create 創(chuàng)建掃描需要填寫的參數(shù)。
默認(rèn)參數(shù), addr_mode=0, scan_interval=100, scan_window=100

9.1.2 掃描到的廣播數(shù)據(jù)如何解碼?
ble.EVENT_SCAN_REPORT 事件的 ble.param 包含如下內(nèi)容:
addr_type :整數(shù)類型,表示藍(lán)牙設(shè)備的地址類型
adv_addr :設(shè)備的廣播地址,可以通過 :toHex() 方法轉(zhuǎn)換為十六進(jìn)制字符串形式的 MAC 地址
rssi :整數(shù)類型,表示接收信號(hào)強(qiáng)度,單位為 dBm
data :二進(jìn)制數(shù)據(jù)類型,表示接收到的原始廣播數(shù)據(jù),可以通過 :toHex() 方法轉(zhuǎn)換為十六進(jìn)制字符串
其中的廣播數(shù)據(jù) data 可以通過 ble_device:adv_decode(data) 來解碼。
ble_device:adv_decode(data)
功能
解碼廣播數(shù)據(jù)
注意事項(xiàng)
廣播數(shù)據(jù)通常來自于 ble.EVENT_SCAN_REPORT 事件的ble_param.data
參數(shù)
data

返回值
local adv_data = ble_device:adv_decode(data)
adv_data

示例

9.2 源碼分析
9.2.1 文件說明
1、main.lua:主程序入口文件。
2、ble_scan.lua:ble_scan.lua 是 Air8000 的藍(lán)牙掃描功能實(shí)現(xiàn)模塊,主要負(fù)責(zé)初始化藍(lán)牙框架、配置并執(zhí)行設(shè)備的掃描操作,并通過回調(diào)函數(shù)處理掃描到的設(shè)備信息。
3、check_wifi.lua:Air8000 的藍(lán)牙功能依賴 WiFi 協(xié)處理器,需確保 WiFi 固件為最新版本。本腳本文件檢查當(dāng)前 Air8000 模組的 WiFi 固件是否為最新版本,若不是則自動(dòng)啟動(dòng)升級(jí)(需插入可聯(lián)網(wǎng)的 SIM 卡)
9.2.2 ble_scan.lua
9.2.2.1 全局變量定義
scan_state :掃描狀態(tài)標(biāo)志,用于跟蹤 BLE 掃描的開啟/關(guān)閉狀態(tài),初始值為 false 表示未掃描

9.2.2.2 處理掃描報(bào)告事件 (handle_scan_report)
功能:當(dāng)掃描到 BLE 設(shè)備時(shí),處理掃描報(bào)告事件。
處理內(nèi)容:記錄并輸出發(fā)現(xiàn)設(shè)備的信息,包括 RSSI 值、設(shè)備地址和廣播數(shù)據(jù)等,可以根據(jù)需求篩選數(shù)據(jù)。
示例演示了如何篩選 ibeacon 廣播數(shù)據(jù)。

9.2.2.3 事件回調(diào)函數(shù) (ble_callback)
處理 BLE 設(shè)備的各種掃描事件:
ble.EVENT_SCAN_INIT :掃描初始化成功時(shí),記錄日志并設(shè)置 scan_state 為 true
ble.EVENT_SCAN_REPORT :接收到掃描報(bào)告時(shí),調(diào)用 handle_scan_report 函數(shù)處理掃描數(shù)據(jù)
ble.EVENT_SCAN_STOP :掃描停止時(shí),記錄日志并設(shè)置 scan_state 為 false

9.2.2.4 核心任務(wù)函數(shù) (ble_scan_task_func)
這是模塊的主要功能實(shí)現(xiàn),采用無限循環(huán)結(jié)構(gòu)確保掃描穩(wěn)定運(yùn)行:
初始化藍(lán)牙核心 :創(chuàng)建 bluetooth_device 實(shí)例
初始化 BLE 功能 :創(chuàng)建 ble_device 實(shí)例并注冊(cè)回調(diào)
配置掃描參數(shù) :通過 scan_create()方法設(shè)置掃描參數(shù)(地址模式、掃描間隔、掃描窗口等)
啟動(dòng)掃描 :調(diào)用 scan_start()方法開始掃描周圍 BLE 設(shè)備
狀態(tài)監(jiān)控 :通過 while scan_state 循環(huán)監(jiān)控掃描狀態(tài)
異常處理 :使用 goto EXCEPTION_PROC 標(biāo)簽統(tǒng)一處理各種初始化失敗情況
資源清理與重試 :在異常情況下停止掃描并重新初始化,間隔 5 秒后重試

9.3 日志分析
luatools 日志,可以查看掃描到的 ibeacon 的廣播包數(shù)據(jù)信息

最后再結(jié)合 ibeacon 應(yīng)用,進(jìn)行簡單的距離估算:
代碼:

十、常見問題
10.1 ibeacon 應(yīng)用,為什么無法顯示名稱?
答:

一個(gè)完整的 BLE 廣播數(shù)據(jù)包最長可以有 37 個(gè)字節(jié),其中前 6 個(gè)字節(jié)固定用于設(shè)備 MAC 地址,剩下的 31 個(gè)字節(jié)才是我們可以自由配置的廣播數(shù)據(jù)區(qū)域。這 31 個(gè)字節(jié)會(huì)被劃分為若干個(gè)廣播數(shù)據(jù)結(jié)構(gòu)體(AD Structure)。
也就是 BLE 廣播包 廣播數(shù)據(jù)區(qū)域不超過 31 字節(jié),那么 iBeacon 包含的數(shù)據(jù)和包含 flag 的 AD Structure 已經(jīng)占了 30 個(gè)字節(jié),如果要設(shè)置設(shè)備命名,會(huì)超出 31 字節(jié)。
可能有人會(huì)問,不是還有 1 個(gè)字節(jié)的空間嗎,設(shè)備名稱用一個(gè)字節(jié)不可以嗎?
答:
名稱:"1"(1 字符)。
AD Structure 長度:1(數(shù)據(jù)) + 1(類型) + 1(長度) = 3 字節(jié)。
總長度:27(iBeacon) + 3(Flags) + 3(名稱) =33 字節(jié)→ 仍超出。
10.2 什么是 Flags?
ble.FLAGS 說明
在 BLE 中,標(biāo)志(flags)通常出現(xiàn)在廣播數(shù)據(jù)中,這些標(biāo)志用于指示設(shè)備的能力和可發(fā)現(xiàn)性等。
根據(jù)藍(lán)牙核心規(guī)范(Bluetooth Core Specification),廣播數(shù)據(jù)中的 Flags 字段是一個(gè) 8 位的位圖(bitmask),每個(gè)位代表特定的含義,以下是各個(gè)位的定義(從 LSB 到 MSB):
Bit 0: LE Limited Discoverable Mode(有限可發(fā)現(xiàn)模式)
Bit 1: LE General Discoverable Mode(通用可發(fā)現(xiàn)模式,設(shè)備持續(xù)可被發(fā)現(xiàn))
Bit 2: BR/EDR Not Supported(不支持經(jīng)典藍(lán)牙)
Bit 3: Simultaneous LE and BR/EDR to Same Device Capable(同一設(shè)備同時(shí)支持 BLE 和經(jīng)典藍(lán)牙)
Bit 4: Simultaneous LE and BR/EDR to Different Devices Capable(支持同時(shí)連接不同設(shè)備的 BLE 和經(jīng)典藍(lán)牙)
Bit 5-7: 保留(Reserved)
注意:Bit 0 和 Bit 1 不能同時(shí)被設(shè)置。如果同時(shí)設(shè)置,則視為無效。
Bit1 和 Bit2 被設(shè)置時(shí),F(xiàn)lags 字段的值為 0x06(二進(jìn)制 0000 0110),
Bit2 被設(shè)置時(shí),F(xiàn)lags 字段的值為 0x04(二進(jìn)制 0000 0100)。
10.3 常見的 BLE 斷開連接 reason

示例:
1、中心設(shè)備和外圍設(shè)備在數(shù)據(jù)傳輸過程中,把外圍設(shè)備斷電
中心設(shè)備會(huì)提示 8 的錯(cuò)誤碼,即數(shù)據(jù)傳輸過程中超時(shí)斷開連接。

2、中心設(shè)備和外圍設(shè)備連接時(shí),中心設(shè)備主動(dòng)發(fā)起 disconnect
中心設(shè)備會(huì)提示 22 的錯(cuò)誤碼,即本地主機(jī)終止連接。

外圍設(shè)備會(huì)提示 19 的錯(cuò)誤碼,即遠(yuǎn)程用戶終止連接。

今天的內(nèi)容就分享到這里了~
審核編輯 黃宇
-
藍(lán)牙
+關(guān)注
關(guān)注
119文章
6333瀏覽量
178905 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2947文章
47904瀏覽量
416025 -
BLE
+關(guān)注
關(guān)注
13文章
783瀏覽量
66406 -
LuatOS
+關(guān)注
關(guān)注
0文章
157瀏覽量
2720
發(fā)布評(píng)論請(qǐng)先 登錄
由淺入深,藍(lán)牙4.0/BLE協(xié)議棧開發(fā)攻略大全(3)
FPGA與VHDL快速工程實(shí)踐從入門到提高
【TI CC2541申請(qǐng)】在linux平臺(tái)下開發(fā)BLE套件
初級(jí)小白實(shí)戰(zhàn)資料,零基礎(chǔ)入門rk3399平臺(tái)下linux4.4+android8.1開發(fā)
LuatOS是什么?
從開發(fā)工具包到定制硬件的軟件遷移是否有任何最佳實(shí)踐?
圖靈程序設(shè)計(jì)叢書《Python編程:從入門到實(shí)踐》
LuatOS的故事——從通信模塊到系統(tǒng)級(jí)主控
從入門到精通:基于開源代碼的BLE四種模式開發(fā)詳解
LuatOS平臺(tái)下BLE藍(lán)牙開發(fā)從入門到實(shí)踐
評(píng)論