nRF24L01+组网方式及防撞(防冲突)机制的实战分享
利用多个nRF24L01+模块组网通信的实现方式
这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论。这里分享的是所有nRF24L01+模块都使用通道0,实现的数量远超过6个的组网方式。
经过实战总结,可以实用到落地项目的有轮询方式、时分方式、自主避让方式等几种常用的组网方式,下面会逐一讲解实现原理。
防撞(防冲突)机制的实现原理
其实无论使用那种方式,都会涉及到防止冲突,也就是防止该信道出现多个发射信号冲撞的现象,因为一旦发生,接收方很难接收成功。除了组网内的各模块之间会发生这类现象,而且还要考虑工程密集安装的时候,也会与邻近其他组网的模块出现冲撞,所以防撞机制是必要的。
行之有效的防撞方式,经过实战检验,采用检测信道占用+按编号延迟的方式,可以很好的躲避碰撞。首先通过我的博文“nRF24L01+如何检测信道被占用-RSSI寄存器实战分享”里讲的,在发送之前先检测信道情况。然后如果信道忙,则根据自身编号(每个从机都从1-255进行依次编号)乘以一个时间基数,比如1ms(根据单片机处理相关逻辑的速度可加长),这样每个从机都会在检测到信道忙的时候,延时不同的时间再次检测和发送。如果同时遇到多个一起要发送,也会因为延时不同的原因,接下来就会错开了。
还有一种情况,就是在检测信道的时候是空闲的,但是在进入正式发送的时候,刚好有其他模块发送了,这就真撞上了。但是因为有编号延时机制,那么当检测到发送失败后,各自错开延时再次尝试,也会最终躲避碰撞了。
轮询方式一主多从
轮询方式是最安全可靠的方式,是典型的一主多从的组网方式。所有从机都不会主动发送信息,平时一直处于接收状态。只有主机发送给某个从机询问指令的时候,该从机才会立刻回复一条信息后,立刻再置为接收状态。这样就避免的多个模块随意发产生的频繁碰撞问题,使得每次通信都安全可靠。
但是这种方式是要规定一个轮询的时间间隔,主机定期询问一遍从机,这个时间间隔就影响了数据同步反应的速度。时间设置太短,模块工作太频繁。时间设置太长,从机的变化不能及时反应到主板。而且如果从机数量很多的话,每轮询一轮下来的时间也不可忽视,所以不适用于对从机变化的同步要求高的应用场景。
时分方式一主多从或多主多从
时分方式,是将所有参与组网的模块,按照编号顺序依次分配一个时间段作为发送的时间窗口。只有到模块自己的窗口期才可以发送,否则不能发送,平时都处在接收状态。这种方式也很好的规避了碰撞问题,但是遇到发送失败的话,就要等待下一个窗口期再尝试,否则会影响其它模块的发送。
这种方式就要求各个模块可以发送的时间间隙被确定下来,而且必须有一个时间基准,所有模块再同一个时间基准上开始计算自己的窗口期是哪里。时间基准的同步是这个方式的难点。实战中这种方式需要做一个群发模式,先让所有从机工作在同一个地址上,然后主机或临时主机发送时间基准,所有从机同时接收(不能一个一个发送,因为会有时延)。然后从机再工作在各自的地址上接收。
由于每个模块都分配了属于自己的发送窗口期(窗口期要大于模块发送一组32字节所需要的时间),所以这种方式既可以一主多从,也可以多主多从。但由于窗口期不能设置太短,对数量比较多的组网情况下,每个模块的两个窗口期的间隔可能会很长,所以组网数量不适合太多的应用场景。
自主避让方式一主多从或多主多从
自主避让方式,就是所有模块的发送时间都是没有限制的,有数据需要传送的时候就发,不经过任何主机指挥协调,遇到发送失败或信道占用,就延时躲避再次尝试,直到发送成功。
这种方式即可以一主多从,也可以多主多从。因为谁都可以随时发送,所以不需要主机协调,但是如果组网模块数量比较多的时候,某次碰撞可能会需要延时较长才会错开。因为有的可能接收到信息需要立刻回复,就有可能打乱延时错开的时间顺序造成二次碰撞,但终究是可以错开的。但是这种的稳定性略差,模块工作有时会一直等待,造成如果有需要给这个模块发数据的时候,一直发不进来的情况,继而造成更长时间的等待。
根据实际应用场景综合运用
以上三种方式均通过实战应用测试,在实际项目中,可以根据组网数量和对数据及时性和稳定性的要求,可以将这几种方式组合应用起来,不同的指令和时域可以使用不同的方式,或同时使用两种方式进行处理,会达到更好的效果。
这里只介绍了组网的方式原理,已经通过实战确认的,具体实现代码是需要一个完整的项目应用 场景来描述,这里就先不提供,后面陆续为大家分享更多的nRF24L01+实战应用。
nRF24L01+组网方式及防撞(防冲突)机制的实战分享的更多相关文章
- 基于DES算法加密的防撞库密码系统项目总结
项目内容:基于DES算法加密的防撞库密码系统 小组名:zqhzkzkj 目标:1.对用户输入的8位字符进行DES加密,要求用户输入8位密钥 2.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...
- [转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件
Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件. 1.为了防止拖动ListView时,在列表末尾重复数据显示.需要加入 HashMap<In ...
- 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理
我们常常遇到自己正规的网站链接,无端被微信拦截,大家都为这问题苦恼不已.但凡想使用微信来推广产品或者从事活动营销的用户,就一定会遇到域名被微信拦截甚至封停的情况.域名没被封过,那你的营销人生肯定是不完 ...
- 特殊字符的过滤方法,防sql防注入代码的过滤方法
特殊字符的过滤方法 function strFilter($str){ //特殊字符的过滤方法 $str = str_replace('`', '', $str); $str = str_replac ...
- 华为云计算IE面试笔记-eBackup有哪几种备份组网方式,各备份组网方式主要的应用场景及备份流程?
应用场景: LAN-Base一般用于备份数据量小,且对备份窗口没有特殊要求的场景,此类场景下备份服务器和备份代理一般是虚拟机部署. LAN-Free一般用于备份数据量较大,且对备份窗口要求比较严格的场 ...
- 华为云计算灾备产品BCManager 及eBackup的组网方式
BCManager的作用 OceanStor BCManager是面向企业数据中心存储容灾业务的管理软件,实现容灾.双活.两地三中心等容灾环境的管理,具备多种数据库应用与虚拟化环境的容灾管理功能,简单 ...
- Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制
Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27 代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 前言 ...
- jQuery.noConflict()防冲突机制
许多JS库都非常喜欢使用$作为函数.变量.有时候,由于页面复杂的历史问题,或者为了实现特定的功能,我们不得不在页面中引入多个JS库.今儿个来学习学习jQuery库是怎么解决$冲突问题.(jQuery- ...
- 使用jsencrypt(rsa加密方式)给js加密防被刷
加密步骤 1.需要加密的参数 * * ).toISOString().replace(/T/g, }Z/, ''); //使用本地时间,然后转换格式 2.js中引用jsencrypt.js文件,然后实 ...
随机推荐
- 【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能
测试条件: 1.IAR8.30开最高等级速度优化. 2.MDK5.27正式版使用AC5开最高等级优化3,开启时间优化,测试C标准库和微库MicroLib两种. 3.MDK5.27正式版使用AC6开最高 ...
- 自学Java编程,如何混到一个7k薪资实习生的岗位
现在Java软件开发的专业一直都是热门,有很多专业的学生,比如电子.机械.会计.土木等等专业由于专业本身没有更高的提升空间,所以现在的年轻人更加喜欢做一些科技前沿的工作,毕竟现在接触的都是电子产品.而 ...
- centos7下安装客户端rabbitmq9.0
下载目前最新rabbitmq客户端版本: wget https://github.com/alanxz/rabbitmq-c/archive/v0.9.0.tar.gz php扩展 : wget ht ...
- zuul实现的限流
限流一般可以根据客户端IP,请求的URL,用户登陆信息进行限制,每秒钟限制多次数,这从别一方面也提升了系统的性能,无用的并发没那么多了. 依赖包 <dependency> <grou ...
- Cesium 加载 gltf 模型
var viewer = new Cesium.Viewer('cesiumContainer', { /*帮助*/ navigationHelpButton: true, baseLayerPick ...
- Zabbix自定义监控项(模板)
虽然Zabbix提供了很多的模板(简单理解为监控项的集合),在zabbix界面点击share按钮就可以直接跳到模板大全的官方网站,但是由于模板内的监控项数量太多不好梳理且各种模板质量参差不齐,还是建议 ...
- MySQL Online DDL与DML并发阻塞关系总结
MySQL DDL操作执行的三种方式 1,INPLACE,在进行DDL操作时,不影响表的读&写,可以正常执行表上的DML操作,避免与COPY方法相关的磁盘I/O和CPU周期,从而最小化数据库的 ...
- SQL Server如何正确的删除Windows认证用户
在SQL Server数据库中,有时候会建立一些Windows认证的账号(域账号),例如,我们公司习惯给开发人员和Support同事开通NT账号权限,如果有离职或负责事宜变更的话,那么要如何正确的删除 ...
- 数据库死锁的问题,Deadlock found when trying to get lock; try restarting transaction at Query.formatError
场景: 应用刚上线排除大批量请求的问题 线上多次出现的Deadlock found when trying to get lock错误 代码: async batchUpdate(skus, { tr ...
- [Go] 轻量服务器框架基础TCP服务模块
框架要先把整体的结构定义好,一般都是在$GOPATH目录的src下建立自己的目录 zinterface是一些接口的定义 znet就是接口的具体实现 IServer.go package zinterf ...