Friend直接流程建立都是通过上层传输曾的控制PDU进行交互。控制消息大部分都为不分段消息,所以这一章我们以下层传输层的为分段消息作为PDU格式的总体示意图。

1. Friendship相关Control PDU

1.1. Friend Poll

由LPN发起,请求Friend发送LPN睡眠期间为LPN存储的消息。
Opcode=0x01,对应的Parameters如下所示:

Field Size(bits) Notes
Padding 7 0b0000000,固定值
FSN 1 Friend Sequence Number

TTL域设置为0。
消息使用friendship security credentials加密。

1.2. Friend Update

Friend通知LPN安全参数已经改变,或者当前消息队列为空。
Opcode=0x02,对应的Parameters如下所示:

Field Size(octets) Notes
Flags 1 第0个bit表示当前的Key Refresh阶段
第1个bit表示当前的IV Update状态
第2-7位RFU
IV Index 4 Friend节点当前的IV Index
MD 1 MD=0:表明Friend Queue为空
MD=1:表明Friend Queue非空

Field Notes
Key Refresh Flag 0:未处于阶段2
1:处于阶段2
IV Update Flag 0:未处于IV更新状态
1:处于IV更新状态中

TTL域设置为0。
消息使用friendship security credentials加密。

1.3. Friend Request

LPN发起,向所有Friend节点广播,希望与一个Friend建立Friendship。
Opcode=0x03,对应的Parameters如下所示:

Field Size(octets) Notes
Criteria 1 表明要与本LPN建立Friendship,Friend应该具有的最低要求
ReceiveDelay 1 LPN端要求的ReceiveDelay
0x00-0x09:Prohibited
0x0A-0xFF:Receive Delay,单位1ms
PollTimeout 3 LPN端设置的初始PollTimeout Timer值
0x000000-0x000009:Prohibited
0x00000A-0x34BBFF:PollTimerout,单位100ms
0x34BC00-0xFFFFFF:Prohibited
PreviousAddress 2 友尽前的前朋友地址
NumElement 1 当前LPN节点的元素数量,通过该值和首元素地址可以计算出该LPN的非首元素的地址,从而保证能够缓存非首元素模型的消息。
0x00:Prohibited
0x01-0xFF:元素个数
LPNCounter 2 Request命令发送次数的计数

Field Size(bits) Notes
RFU 1 Reserved for Future Use
RSSIFactor 2 RSSI计算精度
0b00:1
0b01:1.5
0b10:2
0b11:2.5
ReceiveWindowFactor 2 ReceiveWindow计算精度
0b00:1
0b01:1.5
0b10:2
0b11:2.5
MinQueueSizeLog 3 Friend队列能存储消息数量的最小值
0b000:Prohibited
0b001:2
0b010:4
0b011:8
0b100:16
0b101:32
0b110:64
0b111:128

TTL域设置为0。
消息使用master security credentials加密。

1.4. Friend Offer

Friend收到LPN发起的Request,觉得自己条件满足要求的,向LPN发起Offer,导师转身了。
Opcode=0x04,对应的Parameters如下所示:

Field Size(octets) Notes
ReceiveWindow 1 本Friend支持的ReceiveWindow
0x00:Prohibited
0x01-0xFF:Receive Window,单位1ms
QueueSize 1 Friend端提供的队列大小
SubscriptionListSize 1 Friend提供给该LPN的订阅表大小,Friend通过此表来判断该消息是否属于该LPN
RSSI 1 计算出来的我Friend与你LPN之间的RSSI值,表征两者之间的信号强度
FriendCounter 2 Offer命令发送次数的计数

TTL域设置为0。
消息使用master security credentials加密。

1.5. Friend Clear

新Friend与LPN建立了Friendship后,发送该消息通知LPN的前Friend,告诉他被抛弃了,需要自己把之前留给LPN的资源给回收了。
Opcode=0x05,对应的Parameters如下所示:

Field Size(octets) Notes
LPNAddress 2 需要移除的LPN的单播地址
LPNCounter 2 新的Friendship的LPNCounter值

新Friend发送此消息期待老Friend响应,若没有收到响应,则需要重发,每次重发的时间间隔为上一次的2倍,初始间隔时间为1s。
TTL域设置为0。(会不会导致Old Friend收不到New Friend的Clear消息??协议P85)
消息使用master security credentials加密。

1.6. Friend Clear Confirm

LPN的老Friend收到新Friend的Friend Clear消息后,向新Friend响应Confirm消息,表示这边知道了,你们放心耍。
Opcode=0x06,对应的Parameters如下所示:

Field Size(octets) Notes
LPNAddress 2 需要移除的LPN的单播地址
LPNCounter 2 收到的Friend Clear中的LPNCounter值

TTL域设置为0。(疑问同上??协议P85)
消息使用master security credentials加密。

1.7. Friend Subscription List Add

LPN发送此命令给Friend,告诉Friend需要添加订阅地址。
Opcode=0x07,对应的Parameters如下所示:

Field Size(octets) Notes
TransactionNumber 1 交互的标记号,用于区分每个独立的消息
AddressList 2*N 需要添加的订阅地址(群组地址、虚拟地址)

TTL域设置为0。
消息使用friendship security credentials加密。
当N>5时,会产生分段。

1.8. Friend Subscription List Remove

LPN发送此命令给Friend,告诉Friend需要删除订阅地址。
Opcode=0x08,对应的Parameters如下所示:

Field Size(octets) Notes
TransactionNumber 1 交互的标记号,用于区分每个独立的消息
AddressList 2*N 需要删除的订阅地址(群组地址、虚拟地址)

TTL域设置为0。
消息使用friendship security credentials加密。
当N>5时,会产生分段。

1.9. Friend Subscription List Confirm

Friend收到Subscription List Add/Remove后,需要响应Confirm,告诉LPN我这边已经收到了。
Opcode=0x09,对应的Parameters如下所示:

Field Size(octets) Notes
TransactionNumber 1 交互的标记号,用于区分每个独立的消息

TTL域设置为0。
消息使用friendship security credentials加密。

2. Friendship建立流程

2.1. ReceiveDelay/ReceiveWindow/PollTimeout

LPN月Friend之间的通信LPN每一条消息都有Friend的响应。
ReceiveDelay:LPN发送一条消息后,开始监听Friend的响应之间的时间。(给Friend准备响应的时间??)
ReceiveWindow:LPN监听Friend的响应的窗口。收到Friend的响应后,关闭窗口,发送下一个请求;若窗口时间到仍未收到响应,需要重发上次消息。达到重发次数上限(一般是3次),就认为对端不在消息处理范围内,可能是没开机或者出故障了,所以LPN需要结束Friendship,再次向周围Friend发起建立Friendship的请求。

PollTimeout:两次连续的Friend Poll之间的最大时间间隔,即LPN单次的最大睡眠时间,Friend收到Friend Poll后,重置此timer。若PollTimeout时间到期,Friendship结束。在1.3可以知道,PollTimeout的取值范围为0x0A-0x34BBFF,单位是100ms,换算过来为1s-96h之间,为啥最大值是96h呢?因为IV更新流程的最大持续时长为96小时,这样保证了LPN不会错过IV的安全更新。

2.2. Friendship建立

建立流程如下:
① LPN向周围所有Friend发送Friend Request,表示他需要一个Friend为他保存数据。这里的Request消息TTL为0,保证只有直接收到消息的Friend才能收到Request。
② Friends收到Request后经过Friend Offer Delay的延迟后,向LPN发起Friend Offer,Friend发送Offer后期待1s内,LPN响应,若没有响应,则表示LPN未选择他 。
③ LPN在等待期间(发送Request后等待100ms,然后开启1s的等待窗口)收到的所有Offer中选择最满意的一个。给那个指定的Friend发送Friend Poll消息。若没有收到Offer,则再次发送Request,两次连续的Request之间的间隔至少为1.1s。
④ Friend收到Poll后,表示LPN选择了他,然后响应Friend Update消息,并向LPN的上一任Friend发送Friend Clear消息。
⑤ LPN收到Friend Update消息后,表明Friendship建立成功。

Friend Offer Delay体现当前LPN对信号强度和信号窗口期的重视度,通过不同的Delay,响应Offer,一是可以避免大量的Offer同时响应,导致信号拥堵,再者可以通过Factor的设置,优先过滤出想要的Friend。Friend Offer Delay的计算公式如下:
LocalDelay=ReceiveWindowFactor∗ReceiveWindow−RSSIFactor∗RSSIFriendOfferDelay=max(100,LocalDelay)\begin{aligned} &LocalDelay=ReceiveWindowFactor*ReceiveWindow-RSSIFactor*RSSI\\ &FriendOfferDelay = max(100, LocalDelay) \end{aligned} ​LocalDelay=ReceiveWindowFactor∗ReceiveWindow−RSSIFactor∗RSSIFriendOfferDelay=max(100,LocalDelay)​
当Friend收到已于他建立了friendship的LPN的Friend Request请求,说明LPN认为friendship已断,或者LPN想换一个Friend,此时Friend应该结束LPN,并释放相关的资源。

3. Friend/LPN通信

在进行通信之前,需要对friendship进行配置。

3.1. Friendship配置

配置流程如下:
① LPN收到Friend的Update后,表示友谊建立成功。发送Friend Subscription List Add消息,将自己订阅表的地址发送给Friend。
② Friend收到Subscription List Add后,响应Friend Subscription List Confirm消息,表示地址添加成功。
配置时Add和Remove消息与对应的Confirm消息应有相同的TransactionNumber值。
配置完成后,就可以进行通信了。

3.1. Friendship通信

通信流程如下:
① 所有发给LPN的消息,Friend会根据LPN的PrimAddress和元素个数和订阅表判断是否属于LPN,然后把此消息存在Friend Queue中。(Friend节点为每个建立Friendship的LPN都维护了一个Friend Queue)
② LPN醒来后,向Friend发送Friend Poll,Friend收到Poll后,向LPN响应队列的第一条消息。
③ LPN收到消息后,再次向Friend发送Friend Poll,Friend依次把队列的消息响应给LPN,若此时队列为空,则响应MD=0的Friend Update消息。
④ LPN收到MD=0的Friend Update消息,表明Friend缓存的消息都收到了。LPN再次进入睡眠,等待下一次唤醒。

当Friend Queue满了的时候,收到新的消息不是Friend Update时,则抛弃最老的非Update消息,Update消息包含了网络安全KeyRefresh和IVUpdate,因此不能被普通消息替换掉。
若Friend Queue中有多个分段确认消息,其中仅仅只有IV和Seq不同,则抛弃过期的确认消息。
LPN发起Friend Poll时,所带参数的最后1bit为FSN,当收到Friend发送的存储消息后,下一次的Poll消息中的FSN会翻转,表示这条消息LPN收到了,若Friend收到的Poll消息中FSN未翻转,说明LPN未收到上一次的消息,这事Friend需要将上一次的消息再发一次。

4. Friendship安全

在建立Friendship期间,交换的数据中包含LPNAddress/FriendAddress/LPNCounter/FriendCounter以及NetKey共同生成friendship security material,只由NetKey生成的为master security material。在非LPN/Friend的条件下,均使用master加密。在LPN/Friend建连期间的控制命令使用master security material,配置和通信期间的控制命令使用friendship security material。
所以Friend Request/Offer/Clear/Clear Confirm使用master security material。
Friend Poll/Update/Subscription List Add/Remove/Confirm使用friendship security material。
Friend Queue存储的消息通过Publish Friendship Credentials Flag字段来选择friendship还是master加密,这个字段是由配置客户端配置节点Publication参数时配置的。
若LPN向外发的消息使用的friendship security material,则只有Friend能解析,Friend收到后,转化为master加密然后再中继出去。

5. LPN分段消息的收发

发给LPN的分段消息,Friend代替LPN接收,分段确认消息也由Friend发送给源节点。Friend重组完这个分段消息后才会放入Friend Queue中,等待LPN睡醒后来拿。
LPN主动向外发送分段消息,首先分段消息应该使用master加密,只有Friend才能解析friendship加密的消息。LPN发送所有分段后,向Friend发送Poll消息,期望收到Friend存储的Segmented Ack消息,根据收到的Ack消息再次重发对端未收到的分段,其余流程同普通分段消息发送。
在分段发送期间,LPN不会睡眠,因此不会存在timer超时的情况。

Ble Mesh技术(九)之Friendship相关推荐

  1. Ble Mesh技术(一)之概览

    1. Mesh概览 1.1. mesh消息的收发 mesh消息收发方式区别于ble的连接方式,而是通过消息的发布(publish)与订阅(subscribe)进行消息的传递. mesh的数据包主要包含 ...

  2. BLE Mesh (8) —— Friendship

    目录 1.Timing 2.建立 Friendship 2.1.大致过程 2.2.关键细节分析 2.2.1.Friend Request 2.2.2.Friend Offer 2.2.3.Friend ...

  3. Ble Mesh技术(十二)之Provisioning

    任何一个出厂的mesh设备是一个未配网设备(Unprovisioned Device),需要使用配网者(Provisioner)对未配网设备进行配网,使其成为mesh网络中的一个节点.要使未配网设备成 ...

  4. BLE 技术(八)--- BLE MESH 各层报文是如何设计的(上)?

    文章目录 前言: 一.SIG MESH Bearer Layer 1.1 Advertising Bearer Layer 1.2 GATT Bearer Layer 二.SIG MESH Provi ...

  5. BLE Mesh(2)—— 基本术语及含义

    目录 1.节点(node) 2.开通配置(provisioning) 3.元素(element) 4.消息(message) 5.地址(Address) 6.消息的发布/订阅(Publish / Su ...

  6. BLE MESH组网(四)安全概述

    BLE MESH(四)安全概述 一.安全的重要性 二.蓝牙MESH网络的安全性是强制性的 三.蓝牙MESH网络安全基础 四.关注点和安全密钥分离 五.区域隔离 六.节点移除.密钥刷新和垃圾桶攻击 七. ...

  7. BLE MESH组网(二)友谊功能和设备管理

    BLE MESH组网(二) Friendship功能 一.概述 1.Friendship是什么 2.Friend和LPN 3.Friend参数 4.好友建立 Friendship消息 安全 友谊终止 ...

  8. Bluetooth 蓝牙介绍(四):低功耗蓝牙BLE Mesh网络 Ⅰ—— 基础概念

    文章目录 背景 术语 Managed Flooding Models Scenes 架构 Node Features 中继节点 代理节点 友元节点和低功耗节点 示例 BLE Mesh Networki ...

  9. 蓝牙|BLE Mesh详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/suxiang198/article/details/80160984 What is BLE mes ...

最新文章

  1. 如何在 Python 中开始机器学习?(小白必看)
  2. vivado的综合与实现策略怎样设置
  3. 500强公司面试的经典正确与错误回答对比!
  4. 把你的 VS Code 打造成 C++ 开发利器
  5. 四五六年级计算机教学计划,五六年级信息技术教学计划
  6. git切换用户密码_Git 最基本的命令
  7. cshop是什么开发语言_国内程序员那么多,为什么不开发一个属于自己的编程语言?...
  8. popwin.js 弹出小窗口,图片预览;
  9. 【Linux】虚拟服务器之LVS
  10. Android性能优化系列---管理你的app内存(二)
  11. hdu 1856 求集合里元素的个数 输出最大的个数是多少
  12. 第五章 线性回归 学习笔记下
  13. 一些基础的java编程代码
  14. 20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
  15. CURL 发送请求详解
  16. Generate Constructor using Fields..
  17. Focal Loss讲解
  18. 科研小助手PubMed的插件PubMedy
  19. 38 全志平台的script.bin在linux内核里的应用分析
  20. 9种常用的软件容错处理方式

热门文章

  1. stm32 开发软件分享
  2. faceless 开源_Big Faceless Java报表生成器
  3. Pathview包:整合表达谱数据可视化KEGG通路
  4. 设值单元格字体和背景色的颜色-实例
  5. 在 Arch Linux 上使用人脸识别(howdy)来登陆和认证
  6. goland debug Got a connection, launched process /private/var/folders/l9/
  7. 学Java第十三天(至Map)
  8. Word中录制宏,学会后成大神
  9. Discuz!教程之门户列表页文章中无图片时,从图库中选择一张作为封面
  10. uniapp app 端截屏且保存到本地