蓝牙mesh组网实践(透传模型的使用)


CH582的官方EVT中,除了代理节点例程外都提供了透传模型。

模型位于蓝牙mesh网络协议中的最上层,负责标准化用户应用场景的实例,比如说开关模型、亮度模型、风速模型。由于蓝牙mesh网络中所有数据都经由广播承载层传输,只根据网络地址来区分节点收到的数据包是否接收处理,也就缺少了管道、路由、端口等的区分数据种类、路径的工具和手段,故需要模型来对数据进行判别。对于模型来说,举个例子,一个智能小灯,只支持打开或者关闭,程序中只有一个开关模型,这时候收到一个指令让它调节色温,就会出错;要想小灯能够识别该指令,就需要添加色温模型来处理指令。

对于请求、设置服务端状态的一边,称之为客户端;对于存储模型状态以及收到消息时的应对方法的一边,称之为服务端。配网器作为网络的“中心节点”,包含的模型为客户端;其他节点除了代理节点没有包含透传模型外,都使用服务端模型。

客户端透传模数据发送函数,一个有应答机制,函数为:int vendor_message_cli_send_trans(struct send_param *param, uint8_t *pData, uint16_t len);

一个无应答机制,函数为:int vendor_message_cli_write(struct send_param *param, uint8_t *pData, uint16_t len),两者只有有无应答的区别,参数相同。

*pData指向需要发送的数组,len是发送的数组字节数长度。

其中最关键是第一个参数——发送参数结构体↓

app_idx:使用的AppKey的索引。一个设备可以有多个AppKey,使用索引选择哪一个。

addr:配网过程中,配网器会自动存储节点的网络地址在一个结构体数组中,可以将绝对地址0x0001改成app_nodes[n].node_addr来代入第n个节点的网络地址。默认0x0001为配网器地址。

trans_cnt:对于需要应答的消息,每次发送都会等待应答消息一定时长(默认2秒),超时便会重传;等待时间内收到应答,则不会重传。对于无应答消息,由于不知道接收方是否收到了消息,都会重传参数中的次数。0x03表示总计传输次数为3次,0x01即为不重传。传输超时时长可在 app_vendor_model_cli.c 中的 cli_msg_timeout 静态变量处修改。

period:重传间隔,数据量较多、网络内同一时刻的消息数较多,建议重传间隔加大。

rand:随机延迟,图中为0即没有加延迟。可以使用(tmos_rand()%100)来设置随机数。

tid:消息的标号,有助于消息缓存机制判断是否已经收到并缓存了该消息,以判断是转发还是丢弃。

send_ttl:默认值为255,是最大值。可以根据预计消息转发的跳数来设置最佳TTL值以减小广播承载层压力。

类似的,服务端透传模数据发送函数,一个有应答机制,函数为:int vendor_message_srv_indicate(struct send_param *param, uint8_t *pData, uint16_t len);

一个无应答机制,函数为:int vendor_message_srv_send_trans(struct send_param *param, uint8_t *pData, uint16_t len),两者只有有无应答的区别,参数相同。

发送参数与客户端一致,参考上面的结构体。

---------------------------------待更新----------------------------