幼兒園網(wǎng)站建設(shè)情況統(tǒng)計(jì)表寧波網(wǎng)站推廣優(yōu)化哪家正規(guī)
【藍(lán)牙m(xù)esh】Lower協(xié)議層介紹
Lower層簡(jiǎn)介
?? Lower協(xié)議層用于處理網(wǎng)絡(luò)層以下的功能,包括節(jié)點(diǎn)的廣播、重傳、路由和網(wǎng)絡(luò)拓?fù)涞?#xff0c;是實(shí)現(xiàn)藍(lán)牙m(xù)esh網(wǎng)絡(luò)的關(guān)鍵協(xié)議之一。其中Lower協(xié)議層中最主要的一部分工作就是mesh數(shù)據(jù)的分片和組包。
Lower層是將Upper層發(fā)過(guò)來(lái)的數(shù)據(jù),進(jìn)行封裝并傳遞給下層,當(dāng)Upper層數(shù)據(jù)較長(zhǎng)時(shí),Lower層會(huì)對(duì)數(shù)據(jù)進(jìn)行分片處理,發(fā)送給下層。同樣的,當(dāng)接收到來(lái)自下層的數(shù)據(jù)包后,Lower層會(huì)解析并判斷數(shù)據(jù),如果數(shù)據(jù)是分片的,Lower層會(huì)對(duì)數(shù)據(jù)進(jìn)行組包,組包完成后,將其發(fā)送給Upper層。
Lower層數(shù)據(jù)包
藍(lán)牙m(xù)esh Lower層的數(shù)據(jù)包根據(jù)CTL標(biāo)志位和SEG標(biāo)志位的不同,分為四種數(shù)據(jù)類(lèi)型,分別為不分包的Access數(shù)據(jù)包、分包的Access數(shù)據(jù)包、 不分包的Control數(shù)據(jù)包和分包的Control數(shù)據(jù)包。
下面分別對(duì)四種數(shù)據(jù)包進(jìn)行介紹。
不分包的Access數(shù)據(jù)包
數(shù)據(jù)包格式如下圖:
下面分別介紹下每個(gè)字段的含義:
SEG: 表示數(shù)據(jù)包是否是分包數(shù)據(jù), 不分包的數(shù)據(jù)該字段為0
AKF:表示數(shù)據(jù)包應(yīng)用層加解密是使用appkey還是devkey。 0:devkey 1: appkey
AID: 表示appkey的ID,該字段只有AKF為1時(shí)才生效,否則該字段為0.
Upper Transport Access PDU: 這個(gè)就是應(yīng)用層真正的數(shù)據(jù)。
分包的Access數(shù)據(jù)包
下面分別介紹下每個(gè)字段的含義:
SEG: 表示數(shù)據(jù)包是否是分包數(shù)據(jù),分包的數(shù)據(jù)該標(biāo)志位為1
AKF:表示數(shù)據(jù)包應(yīng)用層加解密是使用appkey還是devkey。 0:devkey 1: appkey
AID: 表示appkey的ID,該字段只有AKF為1時(shí)才生效,否則該字段為0.
SZMIC:表示消息認(rèn)證碼的長(zhǎng)度
SeqZero: SEQ的低13位,是在Upper層進(jìn)行設(shè)置的
SegO: 表示當(dāng)前分包的包數(shù),數(shù)值是從0開(kāi)始的
SegN: 表示最后一包的包數(shù)
Upper Transport Access PDU: 這個(gè)就是應(yīng)用層真正的數(shù)據(jù)。
Segment m : 表示分包的數(shù)據(jù), 字節(jié)長(zhǎng)度1-12個(gè)字節(jié),數(shù)據(jù)包分包長(zhǎng)度每包為12個(gè)字節(jié)(除了最后一包)。
分包數(shù)據(jù)中的每包中,AKF, AID, SZMIC, SeqZero, and SegN這些字段的數(shù)值都是一樣的。
不分包的Control數(shù)據(jù)包
下面分別介紹下每個(gè)字段的含義:
SEG: 表示數(shù)據(jù)包是否是分包數(shù)據(jù),不分包的數(shù)據(jù)該標(biāo)志位為0
Opcode: 0x00:表示回復(fù)數(shù)據(jù), 0x01 - 0x7F表示Control數(shù)據(jù)的Opcode,具體的Control數(shù)據(jù)我們上個(gè)章節(jié)有講到。
Parameters:表示Control數(shù)據(jù)的具體數(shù)據(jù)包。長(zhǎng)度為0-11個(gè)字節(jié)
上面說(shuō)了Opcode為0表示是回復(fù)數(shù)據(jù),下面我們看下Control的回復(fù)數(shù)據(jù)包格式是怎樣的?
Control回復(fù)數(shù)據(jù)包
下面分別介紹下每個(gè)字段的含義:
SEG: 表示數(shù)據(jù)包是否是分包數(shù)據(jù),不分包的數(shù)據(jù)該標(biāo)志位為0
Opcode: 該字段為0,表示回復(fù)數(shù)據(jù)
OBO: 表示該數(shù)據(jù)包是否是Friend節(jié)點(diǎn)與低功耗節(jié)點(diǎn)交互的數(shù)據(jù)。 如果是則為1, 否則為0。
SeqZero: 該數(shù)值表示Seq,是上層Upper層決定的數(shù)據(jù)。
BlockAck:表示接收到了多少包分包的數(shù)據(jù),每包使用一個(gè)bit表示。
分包的Control數(shù)據(jù)
下面分別介紹下每個(gè)字段的含義:
SEG: 表示數(shù)據(jù)包是否是分包數(shù)據(jù),不分包的數(shù)據(jù)該標(biāo)志位為1
Opcode: 數(shù)值0x01 - 0x7f
RFU: 保留位
SeqZero: 表示Seq的最低13bit,有Upper層決定。
SegO: 當(dāng)前的分包值,數(shù)值從0開(kāi)始計(jì)算
SegN: 最后一包的分包值
Segment m: 分包數(shù)據(jù),長(zhǎng)度為1-8個(gè)字節(jié)
每個(gè)分包的Control數(shù)據(jù)的 Opcode, SeqZero, and SegN這幾個(gè)字段的數(shù)值是相同的。
分片與組包
Lower層的一個(gè)非常重要的功能就是對(duì)數(shù)據(jù)進(jìn)行分片和組包。當(dāng)Upper層的數(shù)據(jù)超過(guò)15個(gè)字節(jié)后,就需要在Lower層對(duì)數(shù)據(jù)進(jìn)行分片。
下面這個(gè)圖片很好的表示了數(shù)據(jù)的在每一層上的格式和封裝,大家可以仔細(xì)分析下這張圖
Access層的數(shù)據(jù)進(jìn)入到Upper層之后, 會(huì)使用appkey對(duì)Access的數(shù)據(jù)進(jìn)行加密,生成密文Access PDU 和消息認(rèn)證碼TransMIC, 當(dāng)Upper層的數(shù)據(jù)超過(guò)15個(gè)字節(jié)后,就會(huì)在Lower層對(duì)數(shù)據(jù)進(jìn)行分包處理。數(shù)據(jù)分包的格式我們前面已經(jīng)介紹過(guò)了,分包之后會(huì)傳遞到下層的network層,使用netkey進(jìn)行網(wǎng)絡(luò)層加密,這個(gè)我們下一章節(jié)會(huì)再細(xì)講。
總結(jié)
?? 藍(lán)牙Mesh中的Lower層主要的功能就是對(duì)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行分片和組包,是位于Upper層和Network層之間,對(duì)藍(lán)牙Mesh的分層加密起著非常重要的作用。