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文件,然后实 ...
随机推荐
- Scrum Meeting - 第七周【Alpha阶段】
每日任务内容: 本次会议为第七次Scrum Meeting会议 本次会议项目经理召开时间为20:00,在北区男生宿舍楼召开,召开时长约10分钟,探讨了本周选课网站编写的后续工作. 小组成员 本周任务 ...
- C#开发微信小程序(五)
导航:C#开发微信小程序系列 关于小程序项目结构,框架介绍,组件说明等,请查看微信小程序官方文档,关于以下贴出来的代码部分我只是截取了一些片段,方便说明问题,如果需要查看完整源代码,可以在我的项目库中 ...
- js 从两道面试题加深理解闭包与箭头函数中的this
壹 ❀ 引 在本文之前我已经花了两个篇幅专门介绍了JavaScript中的闭包与this,正好今早地铁上看到了两道面试题,试着做了下发现挺有意思,所以想单独写一篇文章来记录解析过程.若你对于闭包与t ...
- 【linux命令】软连接和硬链接的区别(ln命令)
Linux 文件系统把硬盘分为三个部分:超级块.inode 列表.数据区 inode 指示:该文件的数据存放在数据区的哪些块内.因为这个“映射”关系不能变更,因此,inode 相当于代表着文件本身.( ...
- 05-深入python的set和dict
一.深入python的set和dict 1.1.dict的abc继承关系 from collections.abc import Mapping,MutableMapping #dict属于mappi ...
- Spring Security OAuth2 开发指南(非最新版本)
请注意哈,本文翻译的时候,官网的的版本和本文翻译的时候是一一对应的. 但是官网已经更新文档和概念了,因此和本文翻译的就不在是同一个范围了. 因此我已经将标题修改为(非最新版本),各位老铁直接看官网就可 ...
- com.alibaba.fastjson和net.sf.json的区别
JSON有两种结构 json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构 1.对象:对象在js中表示为“{}”括起来的内容, ...
- Prism_ViewModelLocator(5)
ViewModelLocator ViewModelLocator用于绑定视图的DataContext,以使用标准命名约定的一个ViewModel的实例. Prism ViewModelLocator ...
- 基于Moya、RxSwift和ObjectMapper优雅实现REST API请求
在Android开发中有非常强大的 Retrofit 请求,结合RxJava可以非常方便实现 RESTful API 网络请求.在 iOS开发中也有非常强大的网络请求库 Moya ,Moya是一个基于 ...
- IDEA新建Spring配置文件的方法
IDEA创建Spring Config 选择项目文件右键 输入文件名称即可 applicationContext.xml