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标志符,类型标志符,数据整个数据帧分为三部分,SAR标志符,类型标志符,数据前两部分长度固定,共占用一个字节(opcode),实际数据长度取决于用户定义(variable)。
但是受限与GATT层一帧数据的大小(默认ATT_MTU=23),过长的PDU,会被分割和重组(SAR),多次发送。

前两部分长度固定,共占用一个字节
SAR(分割与重组),二进制两个bit,四个值分别定义如下。在这里插入图片描述

思考

怎么判断一个PDU有发送完成?
直到收到的数据帧SAR标志位为00或者11
怎么发送一个超长的PDU?
根据ATT_MTU的大小,将数据分割,第一包数据SAR01,中间N包数据SAR10,最后一包数据11

发送数据的类型,指示后续data为数据会发送到那一层,方便用正确的规则去解析后面的实际数据

在这里插入图片描述
仅有四种数据类型,6bit ,0x04-0x3f保留
0x01 mesh beacon:新设备和mesh 节点之间的 广播包,两种

  1. Unprovisioned Device beacon ,配网之前的pdu
  2. Secure Network beacon

0x00 Network PDU :network layer defines the Network PDU format

配置中间角色

在上述栗子中, 手机与灯组的沟通,需要天猫精灵作为中间角色,传递消息。
但是我们用户在手机端,并不需跟所有的灯沟通,我们只需控制其中一个灯,这个时候就可以通过一些配置,给天猫精灵发送一些过滤条件,仅仅接受所关注的那个灯所发出的讯息。

记住,手机作为client, 天猫精灵作为server , 是client 配置server

Filter types

白名单
仅仅接受目的地地址destination addresses ,在白名单中的设备
黑名单
除了黑名单以内的所有设备,其他destination addresses 的所有设备都会接受

其实也很明白,白名单内全收,黑名单内全部不收

Proxy configuration

0x02 Proxy configuration messages
这类PDU,是用来 配置代理过滤条件。
在整个proxy 行为中,有两个数据的流动:

  1. 灯组 --> 天猫精灵
  2. 手机 <–> 天猫精灵

灯组 --> 天猫精灵

数据格式与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,超时断开

总结:
server初始化默认白名单为空
无论哪种模式,一旦连接建立,给client SRC address 金水
server收到command,先处理,再回状态,client根据callback判断是否有成功执行
无效命令和超时都会断开连接

Proxy Client behavior

  • 发送的消息,SRC 设置为primary element unicast,SEQ同样使用sequence number of its
    primary element
  • 接受到无效信息,直接断开
  • 接受到保留的类型数据,忽略
  • 超时同设是20s,超时断连

流程图

如果看懂了client 和server端的行为 及 消息类型,应该很容易理解白名单和黑名单的流程图
在这里插入图片描述
在这里插入图片描述