本帖最后由 JayWell 于 2022-5-20 15:42 编辑
蓝牙mesh网络中所有消息最终都在广播承载层传输,也就是说节点和节点之间收发数据,消息中只有源目地址,没有具体的路由路径或是点对点连接,直接广播出去。收发两节点之间距离远,不能直连时,需要中间有若干开启转发功能的节点来帮助中继消息。有两个手段帮助限制广播泛洪,一个是节点的消息缓存机制,收到消息时会比对一下缓存中有没有这则消息,有就丢弃;另一个是消息中的TTL字段,最大值为255,每转发一次自减1,当TTL自减为1时就不再转发,接收或丢弃消息。如果只用蓝牙mesh协议自带的转发机制,只在一个网络中去转发消息,收发节点之间以正好直连的距离一条直线排布了9998个节点,是无法中继到的。提供一个思路,可以利用子网络和自定义指令,根据自定义的UUID将节点划分到不同的子网中,比如说用UUID[15]字节存放子网标号,用一些节点跨多个子网,跨子网节点可以再组一个子网(就叫它子网0)。当可能需要远距离传播时,将携带有自身UUID[15]和目标节点网络地址、UUID[15]的消息发送给跨子网节点,跨子网节点根据UUID[15],将消息重新打包,在子网0内组播至所有节点。其他跨子网节点拆包,分析自定义指令中的目标子网是不是自身跨的多个子网中的一个,若是则重新打包,发送给目标节点。
|