版本算法 |
撰寫日期加密 |
內容spa |
做者設計 |
V1.0.03d |
2018.07.02code |
初次整理11orm |
黃俊嘉blog |
本章介紹低功耗藍牙再空中發送的數據包格式。基於藍牙規範core_v4.2.pdf。接口
低功耗藍牙規範中,有兩類報文:廣播報文和數據報文。事件
(1)設備利用廣播報文發現、鏈接其它設備。一旦鏈接創建以後,則開始使用數據報文。
(2)低功耗藍牙規定了3個廣播信道(37,38,39)和37個數據信道(0~36)。
不管是廣播報文仍是數據報文,鏈路層只使用一種數據包格式:
注:報文是一比特一比特傳輸的,且從最低位開始。
1字節的前導,4字節的接入地址,2~257本身的的協議數據單元PDU,3本身的CRC檢驗。
報文前導是最開始的8位數據。接收機能夠用它來:
(1)perform frequency synchronization -- 肯定"0"、"1"比特所使用的頻率
(2)symbol timing estimation -- 時序估計
(3)Automatic Gain Control (AGC) training -- 配置自動增益控制
廣播信道報文前導:10101010b。數據信道報文前導依賴Access Address 的最低bit,1-- 01010101b,0 -- 10101010b。
(1)什麼是接入地址?
(2)廣播信道報文的接入地址
全部廣播信道報文的接入地址爲:10001110100010011011111011010110b (0x8E89BED6)
(3)數據信道報文接入地址
每一個兩個設備的鏈路層鏈接之間數據信道報文接入地址是不相同的。處於初始化狀態的設備,並按照定鏈接請求定義。
數據信道報文接入地址爲:32bits隨機數,有以下限制:
符合規則的大概有231個。
PDU有廣播的報文和數據信道的報文兩種。後邊有詳細介紹。
CRC爲3字節,計算PDU的校驗值。後邊有詳細介紹。
僅發生在廣播信道上的數據交互協議報文。報文整體格式以下:
Advertising channel PDU header:
PDU Type:
PDUType(b3 b2 b1 b0) |
PackeName |
0000 |
ADV_IND |
0001 |
ADV_DIRECT_IND |
0010 |
ADV_NONCONN_IND |
0011 |
SCAN_REQ |
0100 |
SCAN_RSP |
0101 |
CONNECT_REQ |
0110 |
ADV_SACN_IND |
0111-1111 |
Reserved |
RFU : 保留
TxAdd : 發送地址類型
RxAdd : 接收地址類型
長度 :6~37字節
廣播報文有如下4種:
(1)ADV_IND :可鏈接的無定向廣播事件。
(2)ADV_DIRECT_IND: connectable directed advertising event
(3)ADV_NONCONN_IND: non-connectable undirected advertising event
(4)ADV_SCAN_IND: scannable undirected advertising event。
這些PUDs的數據流向爲 advertiser->scanner/initiator。
可鏈接非定向廣播。Payload包含廣播地址和廣播數據。主要代表本身是能夠被鏈接的,其餘設備能夠經過掃描獲取。
廣播地址字段:TxAdd = 0,AdvA地址公共地址。TxAdd = 1,AdvA地址隨機地址。
廣播數據字段:根據應用不一樣具體設計(0~31字節)。
可鏈接定向廣播事件。Payload包含廣播地址和接收地址。用於向特定設備創建鏈接的數據包。
廣播地址字段:TxAdd = 0,AdvA地址公共地址;TxAdd = 1,AdvA地址隨機地址。
發起者地址字段:RxAdd = 0,AdvA地址公共地址,RxAdd = 1,AdvA地址隨機地址。
Note: This packet does not contain any Host data
不可鏈接非定向廣播事件,僅用於廣播信息,其餘設備掃描接收。
廣播地址字段:TxAdd = 0,AdvA地址公共地址。TxAdd = 1,AdvA地址隨機地址。
廣播數據字段:廣播信息。
可掃描的非定向廣播事件。
注: ADV_DISCOVER_IND was renamed to ADV_SCAN_IND
廣播地址字段:TxAdd = 0,AdvA地址公共地址。TxAdd = 1,AdvA地址隨機地址。
廣播數據字段:廣播信息。
掃描報文有兩種報文:
(1)SCAN_REQ: sent by the Link Layer in the Scanning State, received by a Link Layer in the Advertising State
(2)SCAN_RSP: sent by the Link Layer in the Advertising State, received by a Link Layer in the Scanning State
這兩個報文都是用在鏈接過程當中請求廣播者獲取信息的。有發起鏈接發出SCAN_REQ,廣播者SCAN_RSP。
SCAN_REQ報文包含請求方的地址和指定迴應方的地址。用於創建鏈接是請求獲取被鏈接方的設備信息。
掃描地址字段:TxAdd = 0,ScanA地址公共地址。TxAdd = 1,ScanA地址隨機地址。
廣播地址字段:RxAdd = 0,AdvA地址公共地址。RxAdd = 1,AdvA地址隨機地址。
Note: This packet does not contain any Host Data.
該報包含發送地址和接收地址+迴應數據。即ScanRspData包含迴應數據。
廣播者字段:TxAdd = 0,ScanA地址公共地址。TxAdd = 1,ScanA地址隨機地址。
RxAdd = 0,AdvA地址公共地址。RxAdd = 1,AdvA地址隨機地址。
迴應數據字段:?????,數據是怎麼樣的,ScanA怎麼接收判斷是本身想要的數據。
發起者發起鏈接的報文有1個:
CONNECT_REQ :This PDU is sent by the Link Layer in the Initiating State and received by the Link Layer in the Advertising State.
該報文由(Initiating State)發起鏈接端的發出,Advertising State端接收。格式以下:
包含有請求端地址InitA、接收端地址AdvA、數據域LLDate。
地址InitA:TxAdd = 0,InitA地址公共地址。TxAdd = 1,InitA地址隨機地址。
地址AdvA:RxAdd = 0,AdvA地址公共地址。RxAdd = 1,AdvA地址隨機地址。
LLData數據定義以下:
LLDate的10個字段:
字段 |
描述 |
Access Address |
接入地址 |
CRC校驗 |
詳細Section 3.1.1 |
窗口長度 |
transmitWindowSize=WinSize*1.25ms來定義,詳細Section 4.5.3。 |
窗口偏移 |
transmitWindowOffset=WinOffset*1.25ms來定義,詳細Section 4.5.3。 |
鏈接間隔 |
connInterval = Interval * 1.25 ms,詳細Section 4.5.1 |
從機延時 |
connSlaveLatency = Latency,詳細Section 4.5.1。 |
鏈接超時 |
connSupervisionTimeout = Timeout * 10 ms,詳細Section 4.5.2。 |
ChM |
信道地圖映射,標記信道是否已經使用,每個信道由1個位表示一個信道index。 詳細Section 1.4.1。 LSB在前,數據信道0~36(37~39預留),值0表示沒有被使用,值爲1表示信道已經使用。 |
Hop |
hopIncrement和ChM來決定數據傳輸過程當中的跳頻算法。Section 4.5.8.2定義有跳頻算法。 |
SCA |
睡眠時鐘精度,參照表2.2設置。 |
數據信道的PUD有一個16bit的頭部,一個長度可變的payload,還可能包含一個32bit的數據完整性檢查MIC。格式以下:
頭部格式以下:
Header |
|||||
LLID (2bits) |
NESN (1bits) |
SN (1bits) |
MD (1bits) |
保留 (3bits) |
Length (8bits) |
字段以下:
Field |
Description |
LLID |
標誌該報文類型:LL Data PDU or an LL Control PDU. |
NESN |
Next Expected Sequence Number,下一個序列號,參考Section 4.5.9 |
SN |
Sequence Number序列號,參考Section 4.5.9 |
MD |
More Data,參考Section 4.5.6 |
Length |
數據長度:Payload + MIC,範圍0~255字節。 |
注意:MIC字段出如今:(1)加密的鏈路層鏈接中;(2)payload爲0的數據信道PDU的加密鏈路層鏈接中。計算參考 [Vol. 6] Part E, Section 1。
由頭部的LLID決定Payload的數據格式。
頭部LLID字段爲01b or 10b時,使用來發送L2CAP數據。
當LLID=01b,lenght=00000000b時,是一個空報文。主鏈路層能夠發送空報文給從機,從機響應任意數據信道報文(包含空報文)。
當LLID=11b時,lenght不能爲00000000b,發送有數據的L2CAP數據。
頭部LLID字段爲11b時,表示這個數據包是用於控制、管理LL鏈接的LL control PDU。報文格式以下:
控制報文數據lenght不能爲0,全部控制報文都有數據域。
其中Opcode指示控制&管理packet的類型,包括:
Opcode |
Control PDU Name |
0x00 |
LL_CONNECTION_UPDATE_REQ |
0x0D |
LL_REJECT_IND |
Opcode |
Control PDU Name |
若是未使用LL Data PDU報文或者不支持,接收到LL Data PDU報文將會迴應LL_UNKNOWN_RSP PDU。
若是接收到無效的Opcode,將會迴應LL_UNKNOWN_RSP PDU。
控制數據域格式以下:
......(未完待續)