蓝牙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的网关 网络部署方式 节点 节点 + 网关 ...
随机推荐
- VUE引入自定义文字方式
单vue文件引入老是报错,所以我用了全局引入 1.先在assets里新建font文件夹,把字体放进去,然后在字体旁边新建font.less, font.less内容如下: @font-face{ fo ...
- Angular8中共享模块,共享组件的写法(anular其他模块组件引用方法)
Angular8中共享模块,共享组件的写法(anular其他模块组件引用方法) 第一步:全局创建一个共享的module 这里示例创建一个模块common-share 创建完成后,会生成两个文件 文件1 ...
- 关于VBA中,activesheet用法的一些思考
前二天,给财务部做了个数据采集的工具,因为财务现在用的是excel2013 和2017的版本,所以我决定不用python,改用VBA来处理这个工具. 在 写过程的时候,我用了sheets(i)来定位表 ...
- django框架之drf:2、restful规范,序列、反序列化,drf安装及使用(django原生接口及drf接口编写)
Django之drf 一.restful规范 1.概念 REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy ...
- Python读取大量Excel文件并跨文件批量计算平均值
本文介绍基于Python语言,实现对多个不同Excel文件进行数据读取与平均值计算的方法. 首先,让我们来看一下具体需求:目前有一个文件夹,其中存放了大量Excel文件:文件名称是每一位同学的 ...
- git分支的一些处理情况记录
一.开发分支(dev)上的代码更新后,要合并到 master 分支 git checkout dev #切换到dev分支 git pull #将远程更新的代码同步到本地 git checkout ma ...
- cnpm : 无法将“cnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 1
出现问题原因: 使用vscode终端powershell控制台查看cnpm版本或者运行cnpm的相关命令时提示如标题错误(cmd控制台提示:'cnpm' 不是内部或外部命令,也不是可运行的程序或批处理 ...
- 【TS】函数和函数类型
在使用函数的时候,通常会给函数传值,或者给函数一个返回值调用,这个时候就会涉及到函数类型. 函数类型分为两个方面: 1.函数参数 2.函数返回值 语法: function 函数名( 参数 : 参数类型 ...
- php中 mysql 中文乱码解决办法
首先要保证是utf-8编码或者支持中文的编码 2.Windows下修改方法 MySQL安装目录下的my-default.ini改为my.ini文件 [client]节点 default-charac ...
- Error in created hook: "TypeError: Cannot read properties of undefined (reading 'get')"
写Vue 的时候常遇到的错误之一就是XXXXXX未定义,然后来一个undefined这种问题一般都是创建钩子出错:无法读取未定义的 xxx 属性. 此错误一般多出现在 created() 中, Vue ...