利用多个nRF24L01+模块组网通信的实现方式

这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论。这里分享的是所有nRF24L01+模块都使用通道0,实现的数量远超过6个的组网方式。

经过实战总结,可以实用到落地项目的有轮询方式、时分方式、自主避让方式等几种常用的组网方式,下面会逐一讲解实现原理。

防撞(防冲突)机制的实现原理

其实无论使用那种方式,都会涉及到防止冲突,也就是防止该信道出现多个发射信号冲撞的现象,因为一旦发生,接收方很难接收成功。除了组网内的各模块之间会发生这类现象,而且还要考虑工程密集安装的时候,也会与邻近其他组网的模块出现冲撞,所以防撞机制是必要的。

行之有效的防撞方式,经过实战检验,采用检测信道占用+按编号延迟的方式,可以很好的躲避碰撞。首先通过我的博文“nRF24L01+如何检测信道被占用-RSSI寄存器实战分享”里讲的,在发送之前先检测信道情况。然后如果信道忙,则根据自身编号(每个从机都从1-255进行依次编号)乘以一个时间基数,比如1ms(根据单片机处理相关逻辑的速度可加长),这样每个从机都会在检测到信道忙的时候,延时不同的时间再次检测和发送。如果同时遇到多个一起要发送,也会因为延时不同的原因,接下来就会错开了。

还有一种情况,就是在检测信道的时候是空闲的,但是在进入正式发送的时候,刚好有其他模块发送了,这就真撞上了。但是因为有编号延时机制,那么当检测到发送失败后,各自错开延时再次尝试,也会最终躲避碰撞了。

轮询方式一主多从

轮询方式是最安全可靠的方式,是典型的一主多从的组网方式。所有从机都不会主动发送信息,平时一直处于接收状态。只有主机发送给某个从机询问指令的时候,该从机才会立刻回复一条信息后,立刻再置为接收状态。这样就避免的多个模块随意发产生的频繁碰撞问题,使得每次通信都安全可靠。

但是这种方式是要规定一个轮询的时间间隔,主机定期询问一遍从机,这个时间间隔就影响了数据同步反应的速度。时间设置太短,模块工作太频繁。时间设置太长,从机的变化不能及时反应到主板。而且如果从机数量很多的话,每轮询一轮下来的时间也不可忽视,所以不适用于对从机变化的同步要求高的应用场景。

时分方式一主多从或多主多从

时分方式,是将所有参与组网的模块,按照编号顺序依次分配一个时间段作为发送的时间窗口。只有到模块自己的窗口期才可以发送,否则不能发送,平时都处在接收状态。这种方式也很好的规避了碰撞问题,但是遇到发送失败的话,就要等待下一个窗口期再尝试,否则会影响其它模块的发送。

这种方式就要求各个模块可以发送的时间间隙被确定下来,而且必须有一个时间基准,所有模块再同一个时间基准上开始计算自己的窗口期是哪里。时间基准的同步是这个方式的难点。实战中这种方式需要做一个群发模式,先让所有从机工作在同一个地址上,然后主机或临时主机发送时间基准,所有从机同时接收(不能一个一个发送,因为会有时延)。然后从机再工作在各自的地址上接收。

由于每个模块都分配了属于自己的发送窗口期(窗口期要大于模块发送一组32字节所需要的时间),所以这种方式既可以一主多从,也可以多主多从。但由于窗口期不能设置太短,对数量比较多的组网情况下,每个模块的两个窗口期的间隔可能会很长,所以组网数量不适合太多的应用场景。

自主避让方式一主多从或多主多从

自主避让方式,就是所有模块的发送时间都是没有限制的,有数据需要传送的时候就发,不经过任何主机指挥协调,遇到发送失败或信道占用,就延时躲避再次尝试,直到发送成功。

这种方式即可以一主多从,也可以多主多从。因为谁都可以随时发送,所以不需要主机协调,但是如果组网模块数量比较多的时候,某次碰撞可能会需要延时较长才会错开。因为有的可能接收到信息需要立刻回复,就有可能打乱延时错开的时间顺序造成二次碰撞,但终究是可以错开的。但是这种的稳定性略差,模块工作有时会一直等待,造成如果有需要给这个模块发数据的时候,一直发不进来的情况,继而造成更长时间的等待。

根据实际应用场景综合运用

以上三种方式均通过实战应用测试,在实际项目中,可以根据组网数量和对数据及时性和稳定性的要求,可以将这几种方式组合应用起来,不同的指令和时域可以使用不同的方式,或同时使用两种方式进行处理,会达到更好的效果。

这里只介绍了组网的方式原理,已经通过实战确认的,具体实现代码是需要一个完整的项目应用 场景来描述,这里就先不提供,后面陆续为大家分享更多的nRF24L01+实战应用。

nRF24L01+组网方式及防撞(防冲突)机制的实战分享的更多相关文章

  1. 基于DES算法加密的防撞库密码系统项目总结

    项目内容:基于DES算法加密的防撞库密码系统 小组名:zqhzkzkj 目标:1.对用户输入的8位字符进行DES加密,要求用户输入8位密钥 2.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...

  2. [转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件

      Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件. 1.为了防止拖动ListView时,在列表末尾重复数据显示.需要加入 HashMap<In ...

  3. 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理

    我们常常遇到自己正规的网站链接,无端被微信拦截,大家都为这问题苦恼不已.但凡想使用微信来推广产品或者从事活动营销的用户,就一定会遇到域名被微信拦截甚至封停的情况.域名没被封过,那你的营销人生肯定是不完 ...

  4. 特殊字符的过滤方法,防sql防注入代码的过滤方法

    特殊字符的过滤方法 function strFilter($str){ //特殊字符的过滤方法 $str = str_replace('`', '', $str); $str = str_replac ...

  5. 华为云计算IE面试笔记-eBackup有哪几种备份组网方式,各备份组网方式主要的应用场景及备份流程?

    应用场景: LAN-Base一般用于备份数据量小,且对备份窗口没有特殊要求的场景,此类场景下备份服务器和备份代理一般是虚拟机部署. LAN-Free一般用于备份数据量较大,且对备份窗口要求比较严格的场 ...

  6. 华为云计算灾备产品BCManager 及eBackup的组网方式

    BCManager的作用 OceanStor BCManager是面向企业数据中心存储容灾业务的管理软件,实现容灾.双活.两地三中心等容灾环境的管理,具备多种数据库应用与虚拟化环境的容灾管理功能,简单 ...

  7. Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制

    Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27 代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 前言 ...

  8. jQuery.noConflict()防冲突机制

    许多JS库都非常喜欢使用$作为函数.变量.有时候,由于页面复杂的历史问题,或者为了实现特定的功能,我们不得不在页面中引入多个JS库.今儿个来学习学习jQuery库是怎么解决$冲突问题.(jQuery- ...

  9. 使用jsencrypt(rsa加密方式)给js加密防被刷

    加密步骤 1.需要加密的参数 * * ).toISOString().replace(/T/g, }Z/, ''); //使用本地时间,然后转换格式 2.js中引用jsencrypt.js文件,然后实 ...

随机推荐

  1. 黑苹果 macOS 10.13.6 17G66 安装 nVidia WebDriver

    目前很多N卡的WebDriver已经不支持macOS 10.14了,只能停留在10.13.6,苹果AppStore下载的 macOS High Sierra 10.13.6 版本号是17G66,遗憾的 ...

  2. JsonPath基本用法

    JsonPath基本用法 本文主要介绍JsonPath的基本语法,并演示如何在Newtonsoft.Json中进行使用. JsonPath的来源 看它的名字你就能知道,这家伙和JSON文档有关系,正如 ...

  3. android studio 常见编译问题及解决思路总结

    问题一:编译运行成功后放置一段时间后再运行会报错 这个问题让我纠结了不少时间,最后才发现遇到类似的错误,clear一下project就好了.这个一般是上次生成的临时文件和这次的有冲突造成的. 问题二: ...

  4. Linux Redis 安装(带视频)

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 疯狂创客圈 高并 ...

  5. 老版本nginx存在安全漏洞,不停服务热升级

    1.场景描述 安全部通知:nginx存在"整数溢出漏洞",经测试2017年4月21日之后的版本无问题,将openresty升级到最新版本,Nginx升级到1.13.2之后的版本. ...

  6. 关联mysql失败_Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon'

    关联mysql失败_Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezon’ 时区错误,MySQL默认 ...

  7. 操作mysql第一次访问速度慢(远程)

    最近在使用java操作远程的mysql数据库的时候,第一次请求非常的慢,而且极其容易引起系统的崩溃报错连接超时 下面就这个问题来解决下把 ------------------------------- ...

  8. How to: Map a Persistent Class to a Database View Which Has No Key Field如何:映射持久化类到无主键数据库视图

    With XAF, you can build new applications from scratch or maintain existing databases. The How to: Ge ...

  9. icon图标深入指南

    图标是网络上常用的元素. 它们是通用的,可以立即识别,可以非常吸引人,引起注意,并且(如果使用正确)可以提供出色的用户体验. 在网络上实现图标时,我们有很多选择: Icon Spritesheet – ...

  10. [转载]MGR变量group_replication_primary_member

    组复制的状态变量只有一个,目前在8.0.17这个版本上还是存在的,未来会被废弃掉,我们在单主的模式下,可以用来查看哪个节点是读写节点. mysql: [Warning] Using a passwor ...