物联网LoRa系列-11:LoRa终端--基于物理层协议的PingPong应用程序的软件架构

article/2025/3/16 11:06:34

至此,我们已经搭建好LoRa终端的软硬件开发环境,接下来,将解构和实现LoRa终端的应用程序。

LoRa终端的应用程序,(1)可以直接基于LoRa的物理层协议(LoRa芯片实现);(2)也可以基于LoRa MAC协议。

本文将介绍LoRa的终端--基于物理层协议的PingPong应用程序的软件架构

目录:

1. PingPong应用程序的模型

2. PingPong应用程序的协议栈

3. PingPong应用程序软件架构

4. PingPong软件模块的来源

5. PingPong的工程文件解读

6. PingPong应用程序的主流程图解读

7. PingPong的Master/Slave的状态机切换解读

8. LED灯控制的优化


1. PingPong应用程序的模型

上图LoRa终端PingPong应用程序的模型。

在此模型中,有两个LoRa终端节点,我们称为NodeA和NodeB;

每个节点是两个角色中的一个:Master和Slave角色。

Master负责发送或广播Ping消息,当Slave收到Ping消息后,延时10ms后,发送Pong消息作为回复。

Master在收到Slave的Pong回复消息后,延时1s,再发送下一个Ping消息。

就这样周而复始,master不断的发送Ping消息,slave不断的回复Pong消息。

Master和Slave的角色,是在消息交互过程中自动协商出来的。

当然,为了可视化PingPong的消息交互流程,在发送消息时,点亮LED, 发送完消息后,关闭LED.

由于master和slave发送消息的延时不同,因此LED灯亮的时间也不相同。

详细参考源代码。

备注:

在本案例中,只有一个灯,用于展示数据的发送和接收:在收到数据后,打开LED, 在发送完数据后,关闭LED.


2. PingPong应用程序的协议栈

在上图中,

(1)PingPong应用程序:

负责发送和接收Ping和Pong消息,Ping和Pong是两个不同的字符串消息,一个是"Ping”字符串,一个是"Pong”字符串。

同时负责根据收到Ping和Pong消息后,进行Master和Slave角色的切换。

(2)LoMAC:在该应用中,并没有实现LoRa MAC层协议,本文主要关注:如何直接通过LoRa的物理层射频层芯片SX126X发送特定的数据:ping和pong字符串。

(3)MCU驱动程序:应用程序通过MCU的驱动程序来访问LoRa SX126X芯片,用于发送和接收Ping和Pong消息。

(4)MCU单片机:所有应用程序的执行体。

(5)LoRa物理层芯片Sx126X:芯片实现LoRa协议的最底层(RF射频层和物理层协议)。

如下是LoRa物理层协议的帧结构,ping和pong字符串消息是承载在物理层的Payloa中的。

更详细的软件模块见如下:


3. PingPong应用程序软件架构

在上图中,灰色的部分不在本文讨论。


4. PingPong软件模块的来源

上述所有的软件模块,都可以由开发板供应商一次性提供,包括IAR或STDP集成开发工具的工程文件。

但我们需要知道,开发板供应商只是这些程序的集成者,他们并非所有程序的创建者,程序主要来源如下几方:

(1)STM8 MCU的芯片商:ST公司

(2)LoRa射频芯片SX1262的芯片供应商:semtech

(3)IAR和STDP集成开发环境:IAR公司或ST公司

(4)LoRa模组供应商:翱捷科技,该公司是模组代码的主要的集成者,他们集成了STM8 外设驱动 + SX126x驱动

(5)开发板提供商:成都芯域矩阵,是最终代码继承者,但95%以上的代码都不是其实现的,他们只对于开发板相关的代码进行了部分的适配。

代码模块类型代码位置

代码的提供者

PingPong应用程序..\LoRaMac-node\src\apps\ping-pong\ASR6505\main.c

semtech提供样本, 可以semtech官网获取

模组和开发板厂家只提供模板和开发板相关的适配

LoRa射频芯片驱动..\LoRaMac-node\Src\Radio\SX1626x\*.*

semtech提供样本,

模组厂家提供适配版本

操作系统级接口驱动程序..\LoRaMac-node\src\system\*.*semtech提供,屏蔽不同MCU和不同目标的差别
C语言标准库:静态库..\LoRaMac-node\src\boards\*.*IAR或ST集成工具公司提供
STM8标准外设接口驱动程序..\Libraries\STM8L15x_StdPeriph_Driver\*.*ST公司提供,可以ST官网获取
IRA软件工程或STDP..\Projects\PingPong\EWSTM8开发板供应商

5. PingPong的工程文件解读

User: 用户应用程序,LoRa Ping Pong应用程序和MAC class A, C都在此。

STM815x_StdPeriph_Driver:MCU外设接口,如SPI, I2C,timer等接口驱动。

LoRaNode: LoRa协议栈程序,包括物理层+射频层芯片Sx126x驱动程序与MAC协议程序。

Ouput:编译输出。


6. PingPong应用程序的主流程图解读

在上图汇总可以看出,

在master模式下,如果收到ping消息,说明这里有两个master,则收到Ping消息的节点,主动让出master模式,进入Slave模式;

在slave模式下,如果收到pong消息,说明这里有两个Slave,则收到Pong消息的节点,主动退出Slave模式,进入master模式。

在master模式下,如果超时没有收到slave的发来的pong响应,则master认为,slave可能没有收到master的ping,则重发ping。

在slave模式下,如果超时没有收到slave的发来的ping消息,由于ping pong应用程序是请求、响应模式,因此slave则一直等待。

这种设计有一个缺陷:

就是Master掉线之后,Slave也无法响应了,因此在测试过程中,会发现一个奇怪的现象,就是master断线后,slave也没有反应了,且此时,Slave无法切换到master模式,这是ping Pong应用程序的缺陷之一。

解决办法:

(1)重启master节点。


7. PingPong的Master/Slave的状态机切换解读

上电初始状态,每个节点默认是master模式,在启动的过程中,先发送ping的节点,就可能保持在master模式,而后启动慢一点的节点,会收到启动快一点的节点的ping消息,然后切换到slave模式。这样,就完成在启动过程中,master和slave角色的自动协商。

但这样的设计和代码实现,也有一个大的缺陷,就是如果两个节点的启动时间基本相同,发送ping报文的时间也基本相同,则两个节点在发送ping报文的过程中,都无法处于接收状态,因此无法收到对方的ping报文,导致一个很严重的测试后果:即两个节点都master状态,超时之后,持续发送ping报文,始终无法进入一个master,一个slave的ping pong效果。

下图展现了这个特殊的异常过程:

在上图中,master1和master2的启动时间相差无几,Master1正在发送ping消息的时候,master2也在发送ping消息,而RFIC收和发是不能同时进行的,在发送的时候,不能接收,在接收的时候,不能发送。

这样导致master1和master2始终处于5分钟接收Rx超时状态,超时后,两个节点,同时发送ping,同时进入接收状态,因此,任何一个节点,都无法进入slave模式。现象是:两个节点的接收LED灯都一直不闪烁,误以为程序没有执行。

错误的根本原因:

(1)设计的缺陷,未能考虑到两个节点同时发送和同时接收这样的小概率事件。

(2)发送消息时间过长,到2-3s中。ping和pong消息只有4个字节,但在代码实现是,消息的长度是64字节,后续的60字节都是填充数据。

解决的办法:

(1)重启其中一个节点,确保两个节点的发送消息的时间是错开的,即一个节点在发送,一个节点在接收。如果一次不成,多重启几次。达到如下的效果:

master2的滞后,可以使得Master1和Master2在接受和发送时是错开的,即master1在发送,master2在接受,在master2发送时,master1处于接收状态。

这样错开的结果是,master2先收到master1发送过来的ping消息,然后切换到slave模式下,然后被动等待master1的ping消息,然后被动的发送响应消息pong消息。

(2)减少发送数据包的长度,数据包的长度越长,发送的窗口的时间越长,这样master1和master2发送窗口重叠的可能就越大。减少发送数据包的长度,降低发送窗口的长度,降低问题出现的概率,但不能根除。

(3)加大接收超时定时器,目前的接收超时定时器是5分钟,加大该定时器,实际上就是加大接收窗口的长度。这样可以降低问题出现的概率,但不能根除。

(4)设计上解决:在接收超时后,采用随机的延时发送ping报文,而不是固定的延时,或立即发送。但这需要MCU提供随机延时的功能。


8.  LED显示的优化

为了展示RFIC发送64字节的数据需要较长的时间,我们可以优化LED的显示。

(1)当前的LED显示的代码逻辑:

        case RX:
            if( isMaster == true ) //master
            {
                if( BufferSize > 0 )
                {
                    if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
                    {                        
                        printf("Master Received: PONG\r\n");

                        // Send the next PING frame
                        /* LED TX ON */
                        GPIO_LOW(LED_TX_PORT,LED_TX_PIN);  //打开LED

                        Buffer[0] = 'P';
                        Buffer[1] = 'I';
                        Buffer[2] = 'N';
                        Buffer[3] = 'G';
                        // We fill the buffer with numbers for the payload
                        for( i = 4; i < BufferSize; i++ )
                        {
                            Buffer[i] = i - 4;
                        }
                        DelayMs(1000);
                        printf("Master Sent: PING\r\n");
                        Radio.Send( Buffer, BufferSize );  //请求射频芯片发送ping消息。
                        /* LED TX OFF */
                        GPIO_HIGH(LED_TX_PORT,LED_TX_PIN); //关闭LED
                    }

                 }         

           else  //Slave模式
            {
                if( BufferSize > 0 )
                {
                    if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
                    {
                        printf("Slave Received: PING\r\n");
                        printf("Slave Rssi: %d\r\n", RssiValue);
                        printf("Slave Snr: %d\r\n",  SnrValue);
                        // Send the reply to the PONG string
                        /* LED TX ON */
                        GPIO_LOW(LED_TX_PORT,LED_TX_PIN);  //打开LED
                        Buffer[0] = 'P';
                        Buffer[1] = 'O';
                        Buffer[2] = 'N';
                        Buffer[3] = 'G';
                        // We fill the buffer with numbers for the payload
                        for( i = 4; i < BufferSize; i++ )
                        {
                            Buffer[i] = i - 4;
                        }
                        DelayMs(1);
                        Radio.Send( Buffer, BufferSize );    //请求射频芯片发送ping消息。
                        printf("Slave Sent: PONG\r\n");
                        /* LED TX OFF */
                        GPIO_HIGH(LED_TX_PORT,LED_TX_PIN); //关闭LED
                    }

(2)当前的LED显示的优化逻辑

把LED灯的关闭时间点,推迟到射频芯片发送完完整的消息之后。

        case TX:  //射频芯片发送完成

             GPIO_HIGH(LED_TX_PORT,LED_TX_PIN); //关闭LED
             //turn Rx on as soon as possible
             Radio.Rx( RX_TIMEOUT_VALUE );

        case TX_TIMEOUT: //射频芯片发送出错,或发送被打断。

              GPIO_HIGH(LED_TX_PORT,LED_TX_PIN); //关闭LED

通过LED等的亮度时间,就可以清晰地知道:

射频芯片什么时候处于发送状态,发送数据。

什么时候,处于接收状态,等待接受消息。


结束语:

至此,我们可以利用开发板提供商提供的软件工程代码,能够进行两个LoRa节点间,点对点通信。

两个LoRa节点直接利用的是LoRa芯片提供的物理层的功能。ping和pong消息是直接承载在LoRa的物理成的帧结构中。

后续会进一步深入拆解LoRa物理层的功能和原理:包括物理层的编码、调制解调、天线、电磁波频频等概念与原理。


http://chatgpt.dhexx.cn/article/i6JASqo8.shtml

相关文章

自有协议的LoRa模块应用

LoRa主要是由SemTech公司开发并拥有专利的物理层的调制技术。基于LoRa&#xff0c;LoRa联盟也开发和开放了的LoRaWAN的协议&#xff0c;用于组建网络和实现应用。Ali在LoRaWAN基础上又开发了LPWAN的物联网应用平台&#xff0c;这些都需要遵从专有的LoRa芯片&#xff0c;专门协议…

LoRa协议在Arduino上的应用——原理及代码分析(一)

目录 LoRa简介硬件设备源码分析Sender 两种调制方式 LoRa简介 详细的LoRaWAN协议解析在这里 本文主要介绍LoRa在Arduino上的实现过程&#xff0c;从而学习LoRa协议的实现。 硬件设备 包括传统的GFSK调制技术以及LoRa&#xff08;远程&#xff09;扩频技术 这里说一下啥叫LoR…

物联网LoRa系列-25:LoRa终端--LoRaWAN协议简介与LoRa WAN终端软件选择

前言&#xff1a; 从本篇文章开始&#xff1a; 从通信节点的角度度看&#xff0c;将从Lra终端对点对通信转到LoRa终端与LoRa网关的通信、LoRa终端与LoRa云服务器的通信&#xff1b; 从协议栈的角度看&#xff0c;将从物理层上升到LoRa的MAC层&#xff0c; 即LoRaWAN&#xf…

lora三层服务器协议,LoRa以及LoRa包含的几种协议

为何LoRa成为“一夜爆红”的新技术呢?一定是因为它具有非常显著的特点: 长距离:1~20km 节点数:万级,甚至百万级 电池寿命:3~10年 数据速率3~50kbps LoRa作为一种无线技术,基于Sub-GHz的频段使其更易以较低功耗远距离通信,可以使用电池供电或者其他能量收集的方式供电。…

Lora如何组网?有哪些简单的Lora组网协议?

我从事物联网设计10余年&#xff0c;对无线通讯技术的ASK、FSK、Zigbee、Z-Wave、NB-Iot、Lora及LoraWan等都有一些或多或少的接触。 其中Lora无线通讯技术对我影响比较深刻&#xff0c;了解也相对比较透彻。 我在2016年接触的Lora无线通讯技术&#xff0c;但是&#xff0c;在…

什么是LoRa协议?

1 开场白 这篇文章给读者分享LoRa和LoRaWAN相关的技术简介, Low-Power, Wide-Area Networks(LPWAN)为实现数十亿的万物互联设备而生, LoRaWAN专为LPWAN网络优化更长的电池寿命,更长的距离和更低的代价。 [欢迎大家关注公众号:LoRa万物互联,获取更多LoRa资讯] 2 LoRa是什…

物联网LoRa系列-2:LoRa系统架构与协议栈详解

主要内容 1. 什么是Lora&#xff1f; 2. LoRa的主要特点&#xff1f; 3. LoRa的系统架构&#xff1f; 4. LoRa终端节点的网络连接方式&#xff1f; 5. LoRa终端节点的三种工作模式&#xff1f; 6. LoRa的协议栈&#xff1f; 1. 什么是LoRa LoRa是semtech公司创建的低功耗…

LoRa协议

注意&#xff1a;本页提供的信息来自LoRa™Alliance于2015年1月发布的LoRaWAN Specification V1.0。LoRa联盟负责随时更改规格&#xff0c;恕不另行通知。RF Wireless World不对任何与此相关的问题负责。请参阅LoRa Alliance&#xff08;https://www.lora-alliance.org&#xf…

用命令:tar -zxvf,解压tar.gz包失败的问题解决。

问题描述&#xff1a; 主机上&#xff0c;使用tar -zxvf 解压tar.gz包的时候&#xff0c;出现以下错误&#xff1a; gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 问题办法&#xff1a; 开门见山&#xff0c;…

Liunx tar -zxvf 命令解压失败

使用tar -zxvf 命令解压mysql.tar报错 [rootiZ2ze8f0mv6pvfs1n3rpgaZ mysql]# tar -zxvf mysql.tar gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 解决方案 去掉z参数&#xff0c;使用 tar -xvf 解压正常 […

tar -zxvf是什么意思

先上DJ&#xff0c;先上DJ 含义&#xff1a;使用gzip工具&#xff08;-z&#xff09;解压&#xff08;-x&#xff09;由参数-f指定的文件&#xff0c;并显示压缩过程中详细信息&#xff08;-v&#xff09; 参数含义tarLinux压缩/解压缩命令-z代表gzip&#xff0c;使用gzip工具…

word标题设置级别

想要这样子: 点击标题1,标题1前面就带有级别. 新建word是这样的,没有带级别: 转自:https://blog.csdn.net/xtggbmdk/article/details/82591717 选择多级列表菜单 “2”级的右侧选“标题2” .在标题3的右侧选择标题3

NPOI Word 多级标题结构设置

通过NPOI实现以下功能 首先通过Word新建个样式模板&#xff0c;该样式模板包括你想要的几个标题样式&#xff0c;比如我这里就需要三个样式&#xff0c;标题、标题1、标题2 打开Word,新建文档&#xff0c;然后输入内容&#xff0c;更改样式&#xff0c;另存为word模板&#xf…

word:如何一键修改同一级别标题

word&#xff1a;如何一键修改同一级别标题 1.选中任意一个三级标题——开始——编辑——选择——选中格式相似的文本 2.修改字体样式&#xff1a;开始——样式——标题 3 ——右击——修改 样式名称不要修改——举例字体更改为&#xff1a;微软雅黑、五号、加粗、深红色——…

Word标题中按级别自动添加编号

一 大标题 1 标题1 1.1 标题1.1 1.1.1 标题添加 1.1.2 zaitian 1.2 新添加 1.2.1 在添加 1.3 标题1.2 2 标题2 2.1 标题2.1 2.2 添加新标题 3 标题2.2 3.1 标题天机 3.1.1 标题3 教程&#xff1a;为了实现上述的样式&#xff0c;即标题编号按照&#xff1a; 标题大级别.中级级…

Word文档标题自动增加序号

在编写Word文档时&#xff0c;经常需要使用到多级标题&#xff0c;为了可读性&#xff0c;一般需要给标题增加序号&#xff0c;该文档就是作者实际操作过程中遇到的问题和解决方法。 第一步&#xff1a; 选择“开始”-----》“段落”---》“多级列表”---》“定义新的多级列表…

word设置标题多个级别

https://jingyan.baidu.com/article/1876c852468dd8890b1376a9.html 1.在开始菜单里面看看标题 2.选择多级列表菜单 3.点击下面更多按钮&#xff0c;在”1“的右侧选”标题1“ 4.在“2”级的右侧选“标题2” 5.在标题3的右侧选择标题3

java生成word带多级标题,word自动生成多级标题的方法

毕业论文格式是一件很麻烦的事&#xff0c;通过修改各级标题来实现。如何快速地修改格式呢?接下来学习啦小编为你分享word自动生成多级标题的方法。希望对你有帮助! word自动生成多级标题的方法 使WORD里面的文章自动生成目录: 假如文章中标题格式为 第一节……大标题(一级) 1…

word@导航窗格@标题的大纲级别@章节导航

文章目录 项目符号编号多级列表项目符号编号多级列表&#x1f388;多级列表的定义多级列表(multilevel list)绑定标题样式(heading style)&#x1f388;重新自定义多级列表 补充:论文的章节结构论文写作中编号和多级列表的常见用途章节标题和子标题列表和条目参考文献图表和表格…

word设置生成目录显示的级别

作者&#xff1a;非妃是公主 专栏&#xff1a;《笔记》《C》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 点击自定义目录&#xff0c;如下&#xff1a; 然后点击选项&#xff0c;如下&#xff1a; 在弹出的目录选…