蓝牙mesh组网实践(厂商透传模型介绍)
CH582的官方EVT中,除了代理节点例程和天猫精灵例程外都提供了厂商定义的透传模型。
模型位于蓝牙mesh网络协议中的最上层,负责标准化用户应用场景的实例,比如说开关模型、亮度模型、风速模型。由于蓝牙mesh网络中所有数据都经由广播承载层传输,根据网络地址来区分节点,判断数据来源,也就缺少了管道、路由、端口等的区分数据种类、路径的工具和手段,故需要模型来对数据进行判别。对于模型来说,举个例子,一个智能小灯,只支持打开或者关闭,程序中只有一个开关模型,这时候收到一个指令让它调节色温,就会出错;要想小灯能够识别该指令,就需要添加色温模型来处理指令;换言之,开关模型规定了开关小灯的指令应该是什么样的,色温模型规定了调节色温的指令应该是什么样的。标准模型可以参考天猫精灵例程中的通用模型。
对于请求、设置服务端状态的一边,称之为客户端;对于存储模型状态以及收到消息时的应对方法的一边,称之为服务端。在配网器配网方式中,配网器作为网络的“中心节点”,包含的模型为客户端;其他节点除了代理节点没有包含透传模型外,都使用服务端模型。
客户端透传模数据发送函数,一个有应答机制,函数为:int vendor_message_cli_write(struct send_param *param, uint8_t *pData, uint16_t len);
一个无应答机制,函数为:int vendor_message_cli_send_trans(struct send_param *param, uint8_t *pData, uint16_t len),两者只有有无应答的区别,参数相同。
*pData指向需要发送的数组,len是发送的数组字节数长度。
其中最关键是第一个参数——发送参数结构体↓
app_idx:16位的AppKey的索引,用于选择16字节的AppKey。配网器可以存储多个AppKey并且需要维护模型与AppKey的绑定关系,配网器在配网时会将模型与AppKey绑定,每个模型可以绑定一个或多个AppKey(默认每个模型绑定一个AppKey,可在app_mesh_confg.h头文件中更改,最多三个)。绑定同一个的AppKey后,模型之间才可通信。对于配网器例程,这里的self_prov_app_idx指向的是配网时透传模型绑定的AppKey,用户若添加了更多模型和更多AppKey,可以直接赋值比如说0x0001来指向对应的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()%200)来设置一个0~199范围内的随机数。这个值为1600时会延迟1s发送,设置0~199则延迟不超过125ms。
tid:用于应用层判断消息是否重复,是回复还是丢弃。比如说配网器往某个节点发送一个无应答消息,tid标号为0x11(3次重传的tid均为0x11);接下来再往某个节点发送一个有应答消息,tid标号即为0x12。客户端(_cli)使用标号0~127,服务端(_srv)使用标号128~191。
send_ttl:在mesh协议中占7位。默认值为255(不是最大值,是指使用系统默认TTL值),用户指定的话最大值为127(0x7F)。可以根据预计消息转发的跳数来设置最佳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),两者只有有无应答的区别,参数相同。
发送参数与客户端一致,参考上面的结构体。
上面展示了如何在用户层面发出数据,接下来展示如何显示接收到的数据,这样以来就能将透传模型最基本地用起来了。
在app.c中有如下函数↓。官方例程中打印了部分数据,没有将透传内容全部打印出来。可以在下图的函数中添加相应代码来打印全部数据。

同样可以在这个函数接下来的判断中作相应处理↓

小贴士:①使用CH582官方提供的透传模型,不一定要是客户端与服务端互相发消息,因为该模型主要是透传数据使用,不存在对于模型状态的存储和请求(比如说智能灯的当前状态是开,收到指令后下一个状态是关,状态切换时需要广播一个消息表示状态切换成功),客户端给客户端发消息也可。
②CH582是单线程单片机,不能同时处理多个消息,也不能同时处理收和发,故不要让多个节点同时给同一个节点发消息,可以在发包节点调整为不同的重发间隔,或者加上随机延迟参数,否则会造成严重丢包。
③若接收的数据较长,全部打印出来可能会影响丢包率,尤其是对于作为需要管理多个节点的“中心节点”的配网器来说。
蓝牙mesh组网实践(厂商透传模型介绍)的更多相关文章
- 关于蓝牙Mesh您必须知道的七件事
蓝牙技术联盟于7月19日正式宣布,蓝牙(Bluetooth)技术开始全面支持Mesh网状网络.全新的Mesh功能提供设备间多对多传输,并特别提高构建大范围网络覆盖的通信能力,适用于楼宇自动化.无线传感 ...
- 1、利用蓝牙定位及姿态识别实现一个智能篮球场套件(一)——用重写CC2541透传模块做成智能手环
一.预言 要实现一个智能篮球场套件,需要设计一个佩戴在篮球运动员手臂上的可以检测投篮.记步的手环,以及一套可以根据RSSI定位运动员的蓝牙定位装置.下面是大致需要的步骤: 首先,需要用CC2541透传 ...
- 低功耗蓝牙(BLE)透传模块 ——RF-BM-S01(BQB认证)
本文来源深圳信驰达科技www.szrfstar.com,技术交流群336720020. 低功耗蓝牙(BLE)透传模块 ——RF-BM-S01(BQB认证) 深圳市信驰达科技有限公司 2013年3月18 ...
- 手把手教你开发BLE数据透传应用程序
如何开发BLE数据透传应用程序?什么是BLE service和characteristic?如何开发自己的service和characteristic?如何区分ATT和GATT?有没有什么工具可以对B ...
- SIG蓝牙mesh笔记3_网络结构
目录 3. Mesh Networking 3.1 Bearers 承载层 3.2 Network Layer 网络层 3.2.3 Address validity 地址有效性 3.2.4 Netwo ...
- SIG蓝牙mesh笔记2_mesh组成
目录 SIG 蓝牙 mesh 组成 mesh网络概述 网络和子网 设备和节点 devices & nodes 入网 mesh中的几个概念 智能插座例子 SIG 蓝牙 mesh 组成 mesh网 ...
- [蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD)
1.照明即平台(LAAP) 随着照明设施向LED转型,他们也在利用类似于蓝牙MESH的技术,创建一个可连接的照明平台,作为他们建筑的中枢神经系统.这些系统除了提供先进的照明控制,还建立了一个增强版 ...
- Dubbo透传traceId/logid的一种思路
前言: 随着dubbo的开源, 以及成为apache顶级项目. dubbo越来越受到国内java developer欢迎, 甚至成为服务化自治的首选方案. 随着微服务的流行, 如何跟踪整个调用链, 成 ...
- 蓝牙mesh介绍
了解一下关于蓝牙Mesh的知识. 蓝牙mesh网络使用,并且依赖于低功耗蓝牙(BLE).低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈. 蓝牙BR / EDR能够实现一台设备到另一台设备的连接和通信 ...
- 常见无线组网分析(NB-IOT组网和Mesh组网)
NB-IOT LoRa Zigbee WIFI 蓝牙 组网方式 基于现有蜂窝组网 基于LoRa网关 基于Zigbee网关 基于无线路由器 居于蓝牙Mesh的网关 网络部署方式 节点 节点 + 网关 ...
随机推荐
- Linux c 检测U盘挂载路径方法
思路: 1.使用df -h |grep mnt shell 命令查找到挂载路径信息 本代码是将结果存入文件中,再从文件中解析出路径信息.也可使用fopen直接从管道中读取信息 2.解析出信息最后的/m ...
- ActiveMQ 常见集群模式
Master Slave 架构模式 这种模式是基于文件共享锁的高可用集群,个人理解其实是一种 Failover 模式,可以是一主一从,也可以是一主两从. 本文使用 Docker 搭建一个主从模式的 A ...
- 千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音 ...
- for循环-while循环
for循环 循环语句1--for for循环语句格式: for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ } 执行流程 执行顺序:①②③④>②③④>②③④-②不满足为止 ...
- MRS_MounRiver安装与驱动相关问题汇总
解决问题如下: MounRiver下载与安装 若MounRiver某些功能不全或插件没安装 MounRiver下载与安装 MRS官网下载:http://www.mounriver.com/downlo ...
- 函数式编程:Flutter&Dart中的组合
本文翻译自: Composition in Flutter & Dart 在 Flutter & Dart 中使用组合创建模块化应用程序. 什么是组合? 在dictionary.com ...
- Web自动化测试怎么做呢?好!接下来我们就开始Web网页测试针对性的流程解析啦!!!
前言 测试行业现在70%是以手工测试为主,那么只有20%是自动化测试,剩下的10%是性能测试. 有人可能会说,我现在做手工,我为什么要学自动化呢?我去学性能更好性能的人更少? 其实,性能的要求比自动化 ...
- 【TS】any和void
any类型 any类型,在ts中是一个万能类型,它可以替代所有类型,也就是说定义了any类型,就不用担心ts的类型束缚,但如果所有的类型都使用any那么ts就失去了它的作用,我们使用ts就是为了规范类 ...
- ctfshow_web入门 文件包含 学习
文件包含 额,这是一个做题带学习的一个笔记 算是半做题,半学习的笔记吧,所以能写的方法和注解都会写.难免先得啰嗦 由于截图都是白色背景,所以使用夜间模式(右上角哦~)观看比较易于区分图片与浏览器背景 ...
- metasploit2-practice
Metasploittable2打靶教程 本次靶机练习主要熟悉:高危端口利用:metasploit中search,show及各个模块使用. 一.环境准备 1.把靶场放在vmware打开,启用nat模式 ...