簡(jiǎn)介
本文將按照如下層次分析
- PHY(物理層)
- LL(鏈路控制層)
- HCI(主機(jī)和控制接口)
- L2CAP層(邏輯鏈路控制和適配層)
- GATT(通用屬性規(guī)范)
- ATT(屬性傳輸協(xié)議)
- SMP(安全管理)
PHY(物理層)
頻段
BLE使用2.4GHz工業(yè)、科學(xué)及醫(yī)療(ISM)頻段。
這個(gè)頻段有兩個(gè)特別之處:
- 它是一個(gè)無需授權(quán)的頻段
- 它是唯一一個(gè)在任何國(guó)家都通用的頻段,即對(duì)于2.4GHz的頻段,從2400MHz~2483.5MHz約83.5MHz的頻譜資源在任何地方都可以使用。
調(diào)制
BLE采用的GFSK調(diào)制方式(髙斯頻移鍵控),物理層的比特率為1Mbit/s(1Mbps)。
射頻信道
LL(鏈路控制層)
描述
鏈路層定義了兩個(gè)設(shè)備如何利用無線電傳輸信息,包含了報(bào)文、廣播、數(shù)據(jù)通道的詳細(xì)定義,也規(guī)定了發(fā)現(xiàn)其他設(shè)備的流程、廣播的數(shù)據(jù)、連接建立、連接管理以及連接中的數(shù)據(jù)傳輸。
鏈路層狀態(tài)機(jī)
- 就緒態(tài)(Standby)
- 廣播態(tài)(Advertising)
- 掃描態(tài)(Scanning)
- 發(fā)起態(tài)(Initiating)
- 連接態(tài)(Connection)
空中數(shù)據(jù)包結(jié)構(gòu)
- 前導(dǎo)碼:1字節(jié)
- 訪問地址:4字節(jié)
- 數(shù)據(jù)包單元:29字節(jié)
-
CRC校驗(yàn):3字節(jié)
基本概念
- Bit流
在4.0協(xié)議中規(guī)定數(shù)據(jù)都是以小端模式存放
在內(nèi)存中,并且發(fā)送到空中的數(shù)據(jù)都是以低字節(jié)的最低bit位進(jìn)行發(fā)送。當(dāng)然也有例外,CRC是先發(fā)送的高字節(jié)的最低bit位。例
- 數(shù)據(jù)白化
三種“地址”區(qū)分
前導(dǎo)碼Preamble:1字節(jié)
前導(dǎo)碼的作用是:頻率同步和增益控制。只有兩個(gè)值: 0xAA和0x55接入地址Access Address:4字節(jié)
廣播包固定---- 0x8e89bed6
數(shù)據(jù)包變化----每一次連接都不同-
芯片物理地址:6字節(jié)
它分為:公共地址和隨機(jī)地址。隨機(jī)地址分為:靜態(tài)地址和私有地址。私有地址分為:不可解析和可解析地址。
報(bào)文結(jié)構(gòu)詳細(xì)組成
廣播通道PDU結(jié)構(gòu)
同一廣播事件中3個(gè)信道之間的時(shí)間間隔----以ADV-IND為例
連接請(qǐng)求CONNECT_REQ包
Sniffer采集到的連接請(qǐng)求包
數(shù)據(jù)通道PDU結(jié)構(gòu)
連接事件
和廣播事件一樣,每隔一定的時(shí)間連接事件由主機(jī)從數(shù)據(jù)信道發(fā)送一個(gè)數(shù)據(jù)包,從機(jī)接到數(shù)據(jù)如果有數(shù)據(jù)發(fā)送需要在150±2 μs做成應(yīng)答。也就是說每一個(gè)連接事件中至少包含主機(jī)發(fā)送的一個(gè)包,從機(jī)可以不發(fā)送包。
- 連接事件的時(shí)間由兩個(gè)參數(shù)決定:connection event interval (connInterval), and slave latency (connSlaveLatency).即連接間隔和從機(jī)潛伏期。
- lanchor point
連接事件開始的點(diǎn)叫做錨點(diǎn)(The start of aconnection event is called an anchor point)。主機(jī)在錨點(diǎn)開始連接事件,從機(jī)需要在錨點(diǎn)前進(jìn)入偵聽狀態(tài)。 - connEventCounter
主機(jī)和從機(jī)都有一個(gè)16位的連接事件計(jì)數(shù)器,這個(gè)值是為了這兩個(gè)設(shè)備之間的同步。這個(gè)值只要是連接事件參數(shù)就會(huì)加1,當(dāng)然第一個(gè)連接事件時(shí)這個(gè)值為0而不是1。無論從機(jī)潛伏期的值是多少,只有從機(jī)接收到主機(jī)的連接事件這個(gè)值在從機(jī)里面就要加1。當(dāng)這個(gè)值到了0xFFFF時(shí),會(huì)翻轉(zhuǎn)到0x0000,重新開始計(jì)算。
連接事件傳輸窗口
在上面講到了CONNECT_REQ包,這個(gè)包中包含了傳輸窗口,并且窗口偏移(WinOffset)只有是從廣播態(tài)進(jìn)入連接態(tài)時(shí)使用,或者在參數(shù)更新時(shí)使用,而WinSize時(shí)間是每個(gè)連接事件都必須使用的。?連接間隔時(shí)間的起點(diǎn)有兩個(gè)位置:?當(dāng)從機(jī)接收?qǐng)?bào)文成功,連接間隔時(shí)間起點(diǎn),就是接收到報(bào)文的那個(gè)時(shí)刻,當(dāng)然對(duì)于nrf51822來說,就是Radio的END事件產(chǎn)生的時(shí)候了。
-
當(dāng)從機(jī)接收?qǐng)?bào)文失敗,連接間隔時(shí)間起點(diǎn),就是掃描窗口的開始時(shí)刻。
從機(jī)在傳輸窗口中沒有接收到第一個(gè)連接事件
這種情況,從機(jī)不得不等待連接間隔時(shí)間后再次進(jìn)入傳輸窗口,等待接收下一個(gè)報(bào)文。雖然接收失敗,但是還是有幾點(diǎn)要注意的:
- 連接事件計(jì)數(shù)值connEventCount這個(gè)值還是得加1的。
- 數(shù)據(jù)通道的頻率還得接著跳到下一個(gè)頻率。
HCI(主機(jī)和控制接口)
HCI Commands and Events
L2CAP層(邏輯鏈路控制和適配層)
L2CAP邏輯鏈路控制和適配層
這個(gè)層的目的是將上層的數(shù)據(jù)進(jìn)行簡(jiǎn)單包裝,使得對(duì)于LL層來說,非常方便地進(jìn)行再次包裝后進(jìn)行發(fā)送。L2CAP包結(jié)構(gòu)以及信道標(biāo)識(shí)

屬性
什么是屬性
屬性是一條公開的帶有標(biāo)簽的,可以被尋址的數(shù)據(jù)。屬性構(gòu)成就是規(guī)定數(shù)據(jù)怎么組成。在L2CAP中可以知道,HOST通往下層的數(shù)據(jù)只有3條路,并且如果是應(yīng)用的話,只有一條CID=0x0004的通道,看來對(duì)于BLE所有應(yīng)用數(shù)據(jù)都是通過ATT進(jìn)行傳輸?shù)摹D敲吹缴匙永锩嫣越鹱?,為什么可以認(rèn)出沙子里面的金子呢?因?yàn)榻鹱影l(fā)光,黃色的,這兩個(gè)就是金子的基本屬性。對(duì)于ATT跑到GATT哪里去找數(shù)據(jù),肯定得規(guī)定數(shù)據(jù)怎么放,也就是人為規(guī)定數(shù)據(jù)屬性,這樣才好找吧!在4.0協(xié)議規(guī)范中規(guī)定的這個(gè)格式就是屬性,也就是數(shù)據(jù)按照一定規(guī)則存放的規(guī)定,這個(gè)存放的規(guī)定就是組成服務(wù)的最小單元。
屬性組成最小單元
屬性句柄(Attribute Handle)
兩個(gè)作用
- 為了方便尋找屬性的一種方式
- 通過屬性句柄操作多個(gè)同樣屬性類型
屬性類型(Attribute Type)
屬性類型其實(shí)就是對(duì)某個(gè)東西取一個(gè)別名,讓機(jī)器可以理解,對(duì)于機(jī)器理解東西就是數(shù)字了,所以屬性類型采用了2bytes或者是16bytes的長(zhǎng)度的數(shù)字表示某個(gè)東西。例如心率計(jì),我們?nèi)寺牭叫穆视?jì)都知道是什么,但是機(jī)器并不知道,同樣對(duì)于一個(gè)不懂中文的人對(duì)他說“心率計(jì)”,他也不知道是什么。所以為了全球統(tǒng)一,心率計(jì)有一個(gè)數(shù)字代號(hào):0x180D,這是唯一的識(shí)別碼叫做通用唯一識(shí)別碼(Universally Unique IDentifier (UUID))。在服務(wù)器的數(shù)據(jù)庫中只要找到服務(wù)是 0x180D的值,所有設(shè)備都知道這是一個(gè)含有心率計(jì)服務(wù)的藍(lán)牙設(shè)備。
書名號(hào)
對(duì)于機(jī)器讀到0x180D就知道是心率計(jì)服務(wù),但是對(duì)于人來說還是喜歡形象的東西,所以又有一種方法,對(duì)于2bytes的UUID,通常不直接用它的值,而是用一個(gè)名稱并加上書名號(hào),例如心率計(jì)通常用?Heart Rate service ?表示數(shù)值為0x180D的UUID
屬性值(Attribute Value)
屬性值是一個(gè)0~512字節(jié)的數(shù)據(jù),對(duì)于屬性本身來說,屬性值是沒有用的,屬性值是給應(yīng)用用的。那么值可以有哪些呢?
- 服務(wù)通用唯一識(shí)別碼(UUID)
- 單位
- 屬性類型
- 特性描述符
- 特性類型
屬性許可(Attribute Permissions)
- 可讀
- 可寫
- 可讀且可寫
- 需要認(rèn)證
- 不需要認(rèn)證
- 無授權(quán)
- 授權(quán)
GATT 服務(wù)組成
服務(wù)是指一系列由數(shù)據(jù)和相關(guān)行為組成的集合,為了去完成某個(gè)特定的功能或者特性。而一個(gè)服務(wù)可以包含引用服務(wù)即《Include》、強(qiáng)制性和可選的特征即 《Characteristic》。
心率計(jì)服務(wù)
服務(wù)聲明
服務(wù)聲明是干什么用的?簡(jiǎn)單地講,就是告訴其他藍(lán)牙設(shè)備,我可以為你提供什么服務(wù),對(duì)于心率計(jì),就是告訴對(duì)方我可以提供心率的服務(wù)。
特性?Characteristic?聲明
- 屬性值—特性性質(zhì)(CharacteristicProperties)
- 屬性值—特性的屬性句柄(Characteristic ValueAttribute Handle)
- 屬性值—特性的屬性類型(Characteristic UUID)
- 屬性值—特性性質(zhì)(CharacteristicProperties)

屬性許可(Attribute Permissions)和特性性質(zhì)(Characteristic Properties)區(qū)別
- Permissions:對(duì)設(shè)備本身的權(quán)限,相當(dāng)于家里臥室中也需要門鎖,防止爸媽偷看日記
- Properties:對(duì)于對(duì)方設(shè)備而言的權(quán)限,相當(dāng)于大門的門鎖是防止外人非法進(jìn)入的。
特性值聲明
特性值的聲明是在特性聲明后的第一個(gè)屬性,所有的特性定義中一定包含有一個(gè)特性值聲明。
特性描述符聲明
特性描述是用來包含一些關(guān)于特性值的關(guān)聯(lián)信息,特性描述有多種類型,一個(gè)特性的定義可以有任意多個(gè)的描述符,而所有描述符都是用來為特性值服務(wù)的
- 特性擴(kuò)展性質(zhì) ?Characteristic Extended Properties?:0x2900
- 特性用戶描述 ?Characteristic User Description? :0x2901
- 客戶端特性配置?Client Characteristic Configuration? :0x2902
- 服務(wù)器特性配置?Server Characteristic Configuration?:0x2903
- 特性表示格式 ?Characteristic Presentation Format?:0x2904
- 特性聚合格式 ?Characteristic Aggregate Format? :0x2905
心率計(jì)的特性

GATT(通用屬性規(guī)范)
ATT(屬性傳輸協(xié)議)
ATT干啥用的?
ATT協(xié)議存在的目的是規(guī)定用什么樣的方法去訪問GATT服務(wù),并將訪問的到的數(shù)據(jù)傳輸給L2CAP;或者是規(guī)定L2CAP的數(shù)據(jù)怎么樣傳到GATT服務(wù)的一種規(guī)定的傳輸協(xié)議。
通信方法
屬性協(xié)議PDU
GATT映射到 ATT
ATTPDU 映射到 GATT規(guī)程
SMP(安全管理)
安全管理難點(diǎn)
安全管理難點(diǎn)在于:怎么將公共密鑰進(jìn)行安全共享
加密標(biāo)準(zhǔn)
AES-CCM 是計(jì)數(shù)器密碼塊鏈消息認(rèn)證碼模式,融合有3 種技術(shù): AES 加密引擎、計(jì)數(shù)模式和消息認(rèn)證
AES(Advanced Encyption Standard)即先進(jìn)加密標(biāo)準(zhǔn)
