举栗子

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标志符,类型标志符,数据

ble mesh 传歌 mesh to brep_数据

前两部分长度固定,共占用一个字节(opcode),实际数据长度取决于用户定义(variable)。

但是受限与GATT层一帧数据的大小(默认ATT_MTU=23),过长的PDU,会被分割和重组(SAR),多次发送。

ble mesh 传歌 mesh to brep_蓝牙_02


SAR(分割与重组),二进制两个bit,四个值分别定义如下。

ble mesh 传歌 mesh to brep_数据_03

思考

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

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

ble mesh 传歌 mesh to brep_蓝牙_04


仅有四种数据类型,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完全相同

ble mesh 传歌 mesh to brep_网络通信_05


在 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 占有一个字节,定义如下

ble mesh 传歌 mesh to brep_网络通信_06


这四种行为不难理解,设置模式,增加或减少,返回状态。

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端的行为 及 消息类型,应该很容易理解白名单和黑名单的流程图

ble mesh 传歌 mesh to brep_mesh_07


ble mesh 传歌 mesh to brep_蓝牙_08