基于LoRa的物联网数据传输系统研究与设计

2021-06-25 03:41严朝阳
关键词:发送数据重传字节

严朝阳,方 飞,曹 傧,谭 歆

(1.重庆邮电大学 通信与信息工程学院,重庆 400065;2.内江师范学院 物理与电子信息工程学院,四川 内江 641100)

0 引 言

物联网[1]是新一代信息技术的重要组成部分。随着物联网技术的高速发展,我们生活的整个社会智能化程度越来越高。在不久的将来,物联网技术必将引起我国社会信息的重大变革,与社会相关的各类应用也将显著提升整个社会的信息化和智能化水平,进一步增强服务社会的能力,从而不断提升我国的综合竞争力。

其中数据传输系统是物联网实现“物物相联,人物互动”的基础。传输设备一般拥有微控制单元(microcontroller unit,MCU ),由于低成本限制,因此,一般采用嵌入式系统。物联网的规范要求整个终端设备必须是智能的,能够处理各种复杂任务,因此,信息传输设备一般都有操作系统。目前,无线传感器网络中存在多种操作系统[2],但节点的操作系统必须在内存、处理器以及能量等方面严格符合应用的需求,也必须能够灵活地允许多种应用同时使用系统资源。传统操作系统移植与裁剪复杂并且系统为每一个进程分配一个栈来保存信息,对于内存资源有限的嵌入式设备,会带来过度的内存消耗。和绝大多数开源嵌入式操作系统相比,Contiki是一个小型的、开源的、极易移植的多任务操作系统,只需要几kByte的代码和几百字节的内存就能提供多任务的环境及TCP/IP支持,专门设计以适用于一系列的内存优先的网络系统,提高了系统内存的利用率,如表1。

表1 Contiki,TinyOS和uC/OS-II的比较结果Tab.1 Comparison results of Contiki, TinyOS and uC/OS-II

物联网应用中的无线技术有多种,从传输距离上可划分成2类:①短距离通信技术,包括ZigBee,WiFi,Bluetooth等;②长距离无线通信技术,包含无线广域网和低功耗广域网等。低功耗广域网技术是近年国际上一种革命性的物联网接入技术,远距离无线电(long range radio,LoRa)便属于此技术领域。LoRa[3-4]基于线性调频扩频调制,保持与频移键控(frequency-shift keying,FSK)调制相同的低功率特性并显著增加了通信距离,改变了以往关于传输距离与功耗的折衷考虑方式,为用户提供一种简单的能实现远距离通信。LoRa技术与其他无线技术的特点对比如表2。

表2 4种常见无线技术对比Tab.2 Comparison of 4 common wireless technologies

1 相关工作

针对基于LoRa的物联网数据传输系统的设计,研究学者提出了许多的设计方案,例如,杨磊等[5]介绍了传输系统架构的软硬件设计,终端节点内置SX1276射频芯片利用主控MAPS-k64完成了数据的裸机收发过程;资文彬等[6]在LoRa终端节点中移植Contiki操作系统完成了数据的尽可能交付。赵太飞等[7]系统感知层终端节点采用星型组网的方式,通过LoRa无线通信将数据上传至汇聚节点后,汇聚节点利用GPRS公网将数据上传至云端。其中终端节点内嵌uC/OS-II实时操作系统。

本文提出了基于LoRa的数据传输系统,感知层采用星型网络架构,与网状网络架构相比,具有低延迟、组网简单的优点;采用LoRa传输技术大大改善接收的灵敏度,降低了功耗且得益于扩频调制技术增加了通信距离;节点移植轻量级的线程编程模型Contiki操作系统来处理数据有效收发的一系列任务,例如基于循环队列缓冲的数据收发,封装成帧,确认回复,周期性休眠等任务。节点与网关之间采用自定义通信协议同时网关支持LoRa,WiFi,NB-IoT,RS485等多种通信技术。

2 系统设计

2.1 LoRa终端设计

LoRa终端设计如图1,终端节点集成了STM32F103,Sx1278射频,传感器3个功能模块。节点由一节5号电池提供能量,传感器模块负责监测区域内的信息采集和数据格式转换。STM32内嵌Contiki操作系统,负责整个系统调度,完成数据的存储和管理。Sx1278射频模块负责与网关进行无线通信,传输数据帧(包括数据信息和控制命令)。

图1 设备终端节点设计框架Fig.1 Terminal framework

2.2 多模异构网关设计

网关设计[8]如图2,网关下行通过LoRa技术与设备终端节点通讯,上行通过NB-IoT、网口、WiFi、RS485、串口与服务器通讯。网关CPU基于STM32F103C8T6 MCU设计,主要运行物联网OS和通讯协议。NB-IoT基于Boudica芯片的模组设计,将终端节点数据上传至NB-IoT基站。网口基于ENC28J60-I芯片设计实现,将终端采集的数据通过以太网进行传输,WiFi基于nRF24L芯片实现,将终端的数据通过WLAN传输。

图2 多模异构物联网网关设计框架Fig.2 Multi-mode heterogeneous IoT gateway design framework

网关是数据上下行传输的中心节点。网关模块不仅需要向下支持 LoRa 传输及其相关驱动,还需要向上支持各种网络协议栈,以便同云端服务器进行通信。网关模块也内置有Contiki操作系统,支持数据文件存储与管理。

2.3 Contiki系统调度设计

Contiki[9]是一个专门针对物联网或者无线传感器网络应用的操作系统。它提供2种机制:Protothreads机制和事件机制。Protothreads 是一个轻量级线程模型,这种线程模型中,多个线程共享一个任务栈,不用在为每一个进程分配一个栈存储,这样可以大大节省了内存,适合存储资源紧张的微控制处理器。一个运行中的Contiki系统包括内核、函数库、线程加载器及一系列进程。一个进程也可以是一个应用程序,也可以是一个服务功能。

Contiki操作系统采用事件驱动机制,每个正在执行的应用都对应一个事件的响应,不同的进程等待事件的发生,在等待期间,进程处于阻塞状态,此时进程将执行权交给处理器,处理器可以执行其他任务。这种机制可使运行在Contiki上的应用程序进行动态加载,提高了应用程序的灵活性。

本系统调度[10]流程如图3,应用程序作为一个进程放在自启动的指针数组中,系统启动后,先进行一系列的硬件初始化(包括串口、时钟),接着初始化进程,启动系统进程(如管理etimer的系统进程etimer_process)和用户指定的自启动进程,然后进入处理事件的循环。通过遍历执行完所有高优先级的进程,而后转去处理事件队列的一个事件,处理该事件(通常对应于执行一个进程)之后,需先满足高优先级进程才能转去处理下一个事件。

图3 Contiki整体调度原理Fig.3 Contiki overall scheduling principle

程序的每次执行都是一个事件的响应。节点包括3个主要任务[11],即App_f_Task,MAC_f_Task和RF_f_Task,如图4。App_f_Task主要为用按键信息模拟数据源,也可编写一段定时发送的数据流模拟数据源,当有数据发送时,匹配事件类型,加入发送事件队列,分配发送空闲缓存区。MAC_f_Task主要负责将数据封装成帧,循环冗余校验(cyclic redundancy check,CRC)解析数据,将目标数据帧加入发送缓存等。RF_f_task主要完成射频收发。3个任务不断轮询,当产生模拟数据时,外部事件触发APP_f_Task,会立即调用同步方式传递MAC_f_Task事件,该进程获得执行权,执行相应的进程。MAC_f_Task操作完成后,通过异步方式传递事件RF_f_Task,完成整个系统调度。

图4 设备终端节点数据收发调度设计图Fig.4 Equipment terminal node data transmission and dispatch scheduling design

网关主要完成信息的存储和转发,如图5。App_f_Task主要完成信息的收集与存储并交付数据信息到Server_f_Task。Key_f_Task模拟用户产生数据,当按键被按下时,通过同步方式,传递事件到App_f_Task。App_f_Task获得执行权时,生成数据帧,通过异步方式,传递事件到Server_f_Task,Server_f_Task获得执行权。 Rf_f_Task即节点发送来的消息,异步传递到App_f_Task处理并重新封装数据帧发送给Server_f_Task,App_f_Task再次生成数据帧转交给Rf_f_Task,进而通过射频发送给节点。

图5 网关App_f_task调度分析Fig.5 Gateway app_f_task Scheduling analysis

Server_f_task主要完成信息的转发,如图6。App_f_task有数据要发送时,通过异步方式触发Server_f_task,Server_f_task接收来自App_f_task的数据信息,将节点或者网关的数据传输至NB模块,从而发送到云端服务器;当云端下发指令时,通过UART_ISR交付到Server_f_task,解析并处理数据帧,然后将数据关键信息转交给App_f_task进程进行进一步处理。

图6 网关Server_f_task 调度分析Fig.6 Gateway server_f_taskscheduling analysis

3 物联网数据传输系统的总体架构

物联网数据传输系统的整体架构[12]如图7。依据物联网的体系架构分为3层:感知层、传输层、应用层。应用层主要负责显示,统计节点信息,查看节点标识,数据传输速率,以及配置节点状态,控制终端节点进行休眠等。传输层主要提供2种无线传输方式即WiFi和NB-IoT。感知层主要是由终端节点构成星型网络,节点和网关都有唯一标识。感知层位于整个系统的最前端,主要负责获取、转发数据。其中终端节点有2种工作模式:休眠模式,活跃模式。终端节点设置成周期性休眠方式时,能够有效节省能量。终端节点负责采集数据并在发送数据前进行封装成帧,加入任务序号,传输次数,源节点和目的节点标识、数据信息、CRC校验等,节点在收到数据后对数据进行解析,差错校验等。

图7 整体架构Fig.7 Overall structure

3.1 组网方式

设备终端节点与异构网关采用星型网络拓扑结构,如图8。节点与网关采用单跳通信,网关和节点都有唯一标识。在该网络中,网关为中继节点,连接着设备终端和远端云服务器,网关上行可通过NB-IoT与远端云服务器通信,使用标准的IP协议进行通信,网关下行通过LoRa技术连接设备终端节点。星型连接[13]的拓扑结构简单,连接方便,管理和维护都相对容易,而且扩展性强,当节点没有发送和接收任务时,进入休眠状态也不会影响该拓扑,提高了系统的稳定性。在网络中的所有节点均为双向交替通信。

图8 星型组网Fig.8 Star networking

网关和终端设备之间的通信可以选择不同信道频段下的多种速率。高速率的传输距离近时延小,低速率的传输距离远时延大,所以选择速率时需要在传输距离和通信时延之间进行权衡,同一频段使用不同的扩频因子的通信之间不会造成干扰。在网络中,终端节点还将进行周期性休眠以降低节点功耗,延长网络寿命。

3.2 数据格式

终端节点和数据收发以事件的形式进行处理。终端节点共定义了9种事件类型。每种事件封装好相应的属性,有各自的数据帧[14](控制信息和数据信息),以及不同的解析函数。其中初始化Strobe事件的发送数据帧以及Strobe事件的数据回复帧帧长都为9字节,如图9。节点发送和回复事件数据帧长分别为10字节和9字节,如图10和图11。协议标识(Header)表示协议版本号,方便用户更新及识别协议版本;任务序号(Task_sn)用来记录当前的节点发送成功的任务次数;报文顺序号(Msg_sn)用来记录当前节点当前任务发送的次数,范围为0-最大值,最大值表示最大重传次数,超过最大重传次数报文顺序号为最小值;控制命令(State)表示事件类型,用来查询相应的事件类型属性。源id和目的id各占一个字节,最大可寻址0—256,默认节点id为0x00,节点id可配置。后两位为CRC校验位,校验[15]从第一个字节到CRC前一个字节,计算多项式为0xA001。网关下发给节点以及节点回复给网关的数据帧格式如图12、图13。

HeaderTask-snMsg-snStateId_sId_d0CRCCRC

HeaderTask-snMsg-snStateId_sId_d10/1CRCCRC

HeaderTask-snMsg-snStateId_sId_d0CRCCRC

HeaderTask-snMsg-snStateId_sId_d10/1CRCCRC

HeaderTask-snMsg-snStateId_sId_d0CRCCRC

3.3 内存管理

在本设计中,为发送和接收事件开辟了缓存空间。发送和接收共用一个缓存空间。缓存空间共有7 008字节。将缓存空间划分为1个A类,2个B类,3个C类,4个D类,大小分别为48,68,264,1 508字节。当有数据要发送时,将事件加入空闲事件队列,查询出该事件的相关属性,并根据所需数据帧长度,分配需要的缓存空间。接收数据时,匹配目的id,根据接收数据长度创建接收数据缓存区,解析数据帧。当接收数据帧为确认消息时,匹配发送消息。释放对应发送数据的缓冲空间,释放事件队列。如果没有收到确认消息且重发次数到达最大值,就丢弃该包,并释放缓存空间,释放相应的队列消息。

3.4 数据重传机制

网关和节点都具有数据重传机制,如图14。即无论是网关向节点发送数据,还是节点向网关发送数据,在指定的重传时间间隔内,对方都需要回复确认消息(acknowledge character,ACK),若没有收到回复消息,发送方就会启动数据重传机制,重传次数可由用户预先定义好。超过重传次数,就丢弃该包。

图14 节点重发调度Fig.14 Node retransmission scheduling

3.5 节点周期性休眠机制

由于节点处于空闲侦听状态下的能量消耗值等同于节点在接收状态时的能量消耗[16]。因此,采取周期性休眠唤醒节省能量。节点上电启动之后,会初始化RTC外设并使能闹钟唤醒,节点进入正常工作状态,在所设置的运行时间到达之前,如果节点收到了网关下发的休眠指令,节点则会提前进入休眠状态,否则的话,节点会按照正常的运行时间到达才会进入休眠。整个节点进入休眠[17]分为2部分:①射频模块从工作模式变为待机模式(Sx1278最低功耗的状态);②MCU的IO口置为模拟输入状态,各个外设时钟关闭(RTC除外),MCU进入休眠低功耗状态,等待RTC定时器闹钟定时唤醒MCU。

3.6 节点和网关通信流程

节点刚上电时,根据CSMA/CA[18]协议发送数据。节点产生一个Strobe事件,用来表示自己要加入网络。发送一个心跳包数据,设置一段发送等待时延,发送完毕之后启动重传计时。网关收到数据后,回复确认消息,节点收到后停止重传计时。如果在计时时间以后还没有收到确认回复,则节点重传数据,当超过最大重传次数时,节点放弃本次发送。节点加入网络后,可以连续发送数据帧消息,在发送方维持发送队列信息和缓存发送消息,在没有收到ACK回复时,发送队列中的发送数据不会被清空,只要在收到ACK回复以及超过重传次数时,发送数据在缓存空间中被清空。节点和网关通信过程如图15。

图15 节点与网关通信过程Fig.15 Communication process between LoRa node and gateway

3.6.1 节点发送流程

终端节点加入网络后,以节点发送数据到网关为例[19-21],如图16。

图16 发送流程图Fig.16 Transmission flow chart

1)如果有数据发送,分配事件类型,加入空闲事件队列,根据事件类型规定数据帧大小创建空闲缓存区。

2)封装数据帧,如添加任务序号、帧头、源id、目的id、CRC校验码等,并加入发送缓存中。

3)判断是否有重传数据,优先发送重传数据,如果重传次数超过3次,就放弃发送并清空在缓存中的重传数据。

4)如果没有重传数据,继续封装成RF数据包,节点监听信道,通过Sx1278射频芯片进行发送,根据CSMA/CA协议完成本次发送。设置一段发送时延。

5)判断该事件是否需要确认回复,如果需要则启动重传计时器,超过等待时间则重发消息,如果重传次数达到最大值,就丢弃该包。如果是不需要再进行确认回复,则释放事件队列。每次发送下一次数据前随机延时一段时间继续发送下一次数据。

3.6.2 节点接收流程

以节点收到网关数据为例,如图17。

图17 接收流程图Fig.17 Receiving flow chart

1)节点监听信道,判断是否有数据接收。

2)接收数据时,Sx1278射频接收RF数据包,匹配目的id与本id是否一致。

3)读取接收长度创建数据缓存区。获取数据帧的各个数据位查询该事件绑定的属性,进行数据长度检查以及CRC校验。

4)检查该事件是否是确认事件,如果是确认事件,查询事件队列中等待回复的事件,判断是哪次发送数据的确认消息,该事件收到确认消息以后,从发送缓存中释放。如果是需要回复确认类消息,重新封装,创建事件发送队列,加入数据缓存区,等待一段随机时间以后进行发送。

3.6.3 网关数据传输设计

网关接收和发送流程和节点类似。网关共创建了12种事件类型,5种任务。分别以网关上行至远端服务器和下行至终端节点为例进行说明。网关上电系统初始化后,首先以上行链路为例。

1)扫描接收事件队列,根据事件属性获取接收节点的数据长度创建数据缓存区。

2)获取节点发送的事件数据帧的各个数据位查询与该事件绑定的属性,进行目的id和数据长度的检查。

3)判断收到的属于确认回复类消息还是数据消息,如果是数据类消息,网关先创建确认回复事件队列,创建数据缓存区,采用插队发送的方式优先发送确认消息给源节点。

4)确认消息回复以后,网关重新进行封装该数据消息并加入发往云端的事件队列,创建数据缓存区。

5)网关上行时会先判断是哪个上行模块(NB-IoT,Wifi)工作,以NB-IoT模块为例,设备上电初始化完成NB模块与云端服务器建立连接,接着开始监听信道。

6)将数据通过USART交付NB-IoT模块,并设置发送等待时间,发送完毕后,设置下一次发送的随机延时。

网关下行表示收到了从远端云平台下发的指令。

1)创建接收缓冲解析数据包。根据目的id进行判断是发送给网关自己的还是需要转发给目的节点。

2)如果是给节点的数据则重新封装,加入发送缓存区。

3)判断是否正在发送其他数据包,以及是否还有重传数据,如果还有包发送,则等待其发送结束,再随机退避一段时间。如果是有重传数据,则优先发送重传数据,重传结束后,RF层读取数据,封装用户数据为RF数据包,通过射频芯片发送。

4 系统测试

软件开发过程中总会产生一些和设计时不一致的错误,为了发现和解决错误,需要进行测试。本测试从用户的角度出发,对程序的输入输出功能进行检查,对系统的功能和性能进行验证。

4.1 环境搭建

由于嵌入式设备硬件资源有限,一般使用“宿主-终端”模式开发,在PC机上进行程序开发,然后移植到物联网设备上进行测试。本设计使用Keil uVision V5.18.0.0 集成开发环境进行开发,然后再用Armcc-v6编译器编译完成,下载至物联网设备中,借助Serial Port Utility串口工具来打印调试信息,查看网关接收和发送数据信息,以及借助物联网云平台查看数据。验证系统正确收发、确认重传功能,以及测试传输系统在(0.5~4 km)的距离条件下的通信性能。

4.2 数据传输功能测试

任意选取2个节点,一个网关,一台PC。2根串口线,分别连接节点和网关。打开Serial Port Utility,并打开物联网平台,节点通过定时发送字节流方式产生数据。

节点在发送信息后,在没有收到网关的确认回复时,继续发送,当发送次数超过3次时,就会放弃发送,释放队列,释放缓存。如图18。

图18 节点重传调试信息Fig.18 Node retransmission debugging information

节点刚上电时,发送9字节的心跳包,网关收到数据后,回复9字节的确认消息如图19。rf_rx_data[9]表示网关收到9个字节的数据帧, 并且节点id为十六进制0x5A,网关id为0x50,当网关收到数据之后,进行确认回复rf_tx_data[9],可以看到目的id为0x5A。rf_g_rssi表示接收信号强度,根据Sx1278 芯片资料,在这里信号强度为(-137+rf_g_rssi) dBm。网关将节点事件上传至物联网云平台,在调试信息中可以看到server_indata[13]=m90…start.,物联网云平台数据如图20。从图20中也可以看到,节点的初始消息在调试信息中还可以看到id为0x11的节点也上电进行初始化,节点m17(id为0x11)发送的相关数据信息,例如m17_led=1,表示17号节点led灯亮,数据发送速率1.12 kbit/s,频率为481 MHz等。

图19 网关调试信息Fig.19 Gateway debugging information

图20 云平台数据Fig.20 Cloud platfrom data

4.3 性能测试

将网关置于所选测试地带较为空旷处,在不同的距离处节点发送一定量的数据包,将网关通过USB转串口线与PC机连接,打开Serial Port Utility,将接收数据保存到相应文档,同时节点也通过串口线与另一台PC机连接,打开Serial Port Utility,将发送数据保存到相应文档。节点定时发送100次数据给网关, 统计发送和接收数据对比后如图21。

图21 单节点不同发送距离Fig.21 Different transmission distance of single node

由图16可知,节点与网关的通信距离可达4.0 km,虽然有丢包现象,但可以通过增加中继节点降低丢包率,完成系统可靠的传输。

5 结束语

随着物联网技术的广泛使用,物联网数据采集系统因为位于现实世界与后续数据的应用连接部分,也显得越来越重要。本文设计了一套基于物联网的数据传输系统,本系统组网灵活,操作简单,传输距离较远,能提供具有多种功能的资源共享服务平台,可有效实现对数据的实时监测,实时准确采集并实时显示等,为以后的应用开发提供了良好的平台。通过现场测试使用,性能稳定可靠,操作方便。在下一步工作中,节点周期性休眠/侦听可以有效降低功耗,但同时也因为处于休眠状态时带来丢包,因此,将进一步改进休眠算法。提高系统准确性。

猜你喜欢
发送数据重传字节
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
无线网络中基于网络编码与Hash查找的广播重传研究
一种车载自组织网络的媒体接入控制协议
带标记方式的CRDSA++协议性能分析*
面向异构网络的多路径数据重传研究∗
简谈MC7字节码
使用IPSec安全传输数据
基于主控同步的CAN总线多点实时数据采集技术
一种基于散列邻域搜索网络编码的机会中继重传方法