ble mesh-Proxy protocol详解(2)
举栗子 ble mesh 中存在一类代理节点(proxy node),其作用是通过GATT,将接受到的数据,发送给mesh 网络中,不具备gatt 能力的设备。
例如:天猫精灵需要wifi 配网,需要获取到wifi 网络的账号和密码,这个时候需要用手机app ,通过bt gatt 连接到天猫精灵,发送数据,然后如果mesh 网络中,其他节点需要这个账号和密码信息,天猫精灵可以通过adv转发这些信息。
这个过程中,天猫精灵就是一个proxy server 的角色,手机是一个proxy client 角色, mesh 灯组 等设备属于不具备gatt 连接类型设备
万物皆数据 所有蓝牙协议的核心作用就是定义好一套数据帧格式
然后世界内,所有需要应用蓝牙的人,都来遵守同一套规则,然后就能正常通信
如果你NB,不愿遵守,也可以自创一套,那不是咱现在讨论的 bt proxy 协议。回归正题, Proxy PDU
Proxy PDU 整个数据帧分为三部分,SAR标志符,类型标志符,数据
文章图片
前两部分长度固定,共占用一个字节(opcode),实际数据长度取决于用户定义(variable)。
但是受限与GATT层一帧数据的大小(默认ATT_MTU=23),过长的PDU,会被分割和重组(SAR),多次发送。
文章图片
SAR(分割与重组),二进制两个bit,四个值分别定义如下。
文章图片
思考发送数据的类型,指示后续data为数据会发送到那一层,方便用正确的规则去解析后面的实际数据
怎么判断一个PDU有发送完成?
直到收到的数据帧SAR标志位为00或者11
怎么发送一个超长的PDU?
根据ATT_MTU的大小,将数据分割,第一包数据SAR01,中间N包数据SAR10,最后一包数据11
文章图片
仅有四种数据类型,6bit ,0x04-0x3f保留
0x01 mesh beacon:新设备和mesh 节点之间的 广播包,两种
- Unprovisioned Device beacon ,配网之前的pdu
- Secure Network beacon
配置中间角色 在上述栗子中, 手机与灯组的沟通,需要天猫精灵作为中间角色,传递消息。
但是我们用户在手机端,并不需跟所有的灯沟通,我们只需控制其中一个灯,这个时候就可以通过一些配置,给天猫精灵发送一些过滤条件,仅仅接受所关注的那个灯所发出的讯息。
记住,手机作为client, 天猫精灵作为server , 是client 配置serverFilter types 白名单
仅仅接受目的地地址destination addresses ,在白名单中的设备
黑名单
除了黑名单以内的所有设备,其他destination addresses 的所有设备都会接受
其实也很明白,白名单内全收,黑名单内全部不收
Proxy configuration 0x02 Proxy configuration messages
这类PDU,是用来 配置代理过滤条件。
在整个proxy 行为中,有两个数据的流动:
- 灯组 --> 天猫精灵
- 手机 <–> 天猫精灵
数据格式与Network PDU完全相同
文章图片
在 Proxy configuration messages仅关注如下类型的数据:
The CTL field shall be set to 1.
The TTL field shall be set to 0.
The DST field shall be set to the unassigned address
核心的操作对象就是这个地址DST
手机 <–> 天猫精灵
操作手段,action 有如下四种,opcode 占有一个字节,定义如下
文章图片
这四种行为不难理解,设置模式,增加或减少,返回状态。
Proxy Server behavior
- 一旦连接建立,Proxy Server初始化为白名单模式,并且白名单为空
- 白名单模式下,一旦收到client 端的有效信息,需要将SRC unicast address,加入白名单
- 黑名单模式下, 一旦收到client 端的有效信息,需要将SRC unicast address,移除黑名单
- 一旦连接建立,server 需要发送Secure Network Beacon client
- 一旦收到client端的Secure Network Beacon, server端需要做一些处理
- 发送的message,SRC需要设置为primary element unicast address
- 收到Set Filter Type message ,先清除,再回状态
- 收到Add Addresses to Filter message ,回状态; 如已经存在或者空间不够,忽略
- 收到Remove Addresses from Filter message ,回状态,如果不存在,忽略
- 收到unexpected value of the SAR field ,直接disconect
- 收到Reserved for Future Use ,忽略
- SAR timmer =20s,超时断开
总结:Proxy Client behavior
server初始化默认白名单为空
无论哪种模式,一旦连接建立,给client SRC address 金水
server收到command,先处理,再回状态,client根据callback判断是否有成功执行
无效命令和超时都会断开连接
- 发送的消息,SRC 设置为primary element unicast,SEQ同样使用sequence number of its
primary element - 接受到无效信息,直接断开
- 接受到保留的类型数据,忽略
- 超时同设是20s,超时断连
文章图片
文章图片
推荐阅读
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 杭电oj——2030汉字统计
- tableView|tableView 头视图下拉放大 重写
- Android|Android BLE蓝牙连接异常处理
- 前端代码|前端代码 返回顶部 backToTop
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- #12-UITableView|#12-UITableView 优化方案
- iOS自适应高度的TableViewCell
- HashMap&ConcurrentHashMap&HashTable
- 2018年|2018年 Bible study 01/02/2018