LoRa低成本全双工网关的设计与实现
2019-02-18陈孝松
陈孝松
(浙江理工大学 信息学院,浙江 杭州 310018)
0 引言
近年来,物联网开始受到广泛重视,传统的无线网络不适合应用于物联网业务,因为物联网的对象只有在需要信息传输时,才会去连网尝试传输,其他时间大多是在等待和休眠。当物联网设备的状态为休眠时,选择下线释放所占用的频谱资源[1]。
LoRa是一种低功耗广域物联网(Low-Power Wide-Area Network,LPWAN)的长距离通信技术,可以解决传统无线网络传输距离远和低功耗不可兼得的矛盾[2]。与WiFi[3],Zigbee,BLE,2G/3G/4G等网络相比,LoRa技术的最大优点是传输距离远[4],受其他信号的干扰小[5]。与NB-IoT技术相比,LoRa在功耗和响应时间实时性方面的性能更优[6]。
现在大多数公司采用的LoRa节点是基于Semtech公司提供的SX1278模块[7],LoRa网关是基于美国Semtech公司提供的SX1301模块[8]。由SX1301模块组成的LoRa网关由于硬件的限制,只能工作在半双工模式下,即接收和发送不能同时工作。
为了解决这个不足,本文设计了一种全双工LoRa网关[9]。把低成本的SX1278模块添加到原始的LoRa网关上,实现了同时接收与发送数据[10-12]。
1 系统架构
1.1 原始LoRaWAN系统
原始LoRaWAN系统架构如图1所示[13],LoRa节点由MCU(STM32)和SX1278模块构成,LoRa网关由树莓派和模块SX1301构成,LoRa服务器由LoRa Gateway Bridge,LoRa App Server,LoRa Server构成。
图1 原始LoRa系统架构
LoRa节点的MCU(STM32)控制SX1278调制解调模块,只能在一个信道上接收或发送,处于半双工工作模式[14]。
LoRa服务器LoRa Gateway Bridge负责把LoRa网关的UDP数据包转换为MQTT数据包发送给LoRa App Server,或者把LoRa App Server的MQTT数据包转换为UDP数据包发送给网关。LoRa Server负责处理LoRa网络数据。LoRa App Server负责处理LoRa的应用数据。
LoRa网关的树莓派(MCU)控制SX1301调制解调模块,只能在一个信道上接收或发送,也处于半双工工作模式[15]。
LoRa信号的传输时间为前导码时间加上有效负载时间:
Tpacket=Tpreamble+Tpayload。
(1)
前导码的传输时间为:
Tpreamble=(npreamble+4.25)Tsym,
(2)
有效负载的传输时间为:
Tpayload=npayload×Tsym。
(3)
npayload为有效负载符号数,定义如下:
npayload=8+max(ceil(tmp)(CR+4),0),
(4)
(5)
式中,PL为有效负载的字节数,SF表示扩频因子,H取0或1,DE取0或1,CR为编码率。
1.2 改进LoRaWAN系统
原始LoRa网关是半双工网关,在同一时刻,只能接收或发送数据。原始LoRa网关在接收数据时,可以同时接收8个信道的数据;在发送数据时,在同一时间只能在一个信道上发送一个数据包。如图2所示,在原始LoRa网关加上SX1278模块后,就成为一个全双工的网关,上行数据和下行数据在LoRa网关上互不影响,极大的提高了信道利用率。
图2 改进的LoRa系统架构
2 全双工LoRa网关的优势
从成本角度考虑,SX1278模块是SX1301模块的几十分之一,这是提出全双工网关设计的最大优势[16]。
从性能角度考虑,原始LoRa网关的SX1301模块在进行发送数据时,只能在一个信道上发送。SX1301模块在发送工作模式时,所起到的作用和SX1278模块一样。
从可实现角度考虑,针对SX1278模块和SX1301模块,芯片厂商已经放出免费和开源的代码,只需在开源代码上进行修改,就可以实现功能。
3 设计与实现
网关的硬件连接图如图3所示,树莓派负责控制数据的发送与接收,同一时刻只能有一个模块和树莓派进行SPI通信。当LoRa网关接收数据时,SX1301模块使能,SX1278模块不使能,树莓派只和SX1301模块通信。当LoRa网关发送数据时,SX1278模块使能,SX1301模块不使能,树莓派只和SX1278模块通信。
图3 网关硬件连接图
由此可知,对每一个模块而言,数据包的传输方向是固定的,如图4所示。对SX1301模块,只工作在接收模式,接收来自LoRa节点的数据。对SX1278模块,只工作在发送模式,把数据发送给LoRa节点。图5为LoRa网关程序流程图。
图4 数据包传输方向
图5 LoRa网关程序流程图
如图5所示,除了原始LoRa网关程序里具有的上行和下行线程外,改进后的LoRa网关程序另外创建了一个线程用于控制SX1278模块的数据发送。上行线程从SX1301缓存中读取数据,上传至LoRa服务器。下行线程收到LoRa服务器的数据后,不是送至原先的SX1301缓存中,而是存入SX1278缓存中。SX1278处理线程从缓存中读取到数据后,先对数据包中的时间戳进行合法性判断,然后定时通过SX1278调制解调模块发送至LoRa节点。
4 实验结果与局限性
4.1 实验结果与性能比较
实验中,服务器使用内核版本为4.10.0-28-generic的Ubuntu 16.04.2的操作系统。在服务器上部署GO,Redis,PostgreSQL与Node.js开发环境,处理LoRa网络数据和应用数据。
为了使实验现象更明显,所有的LoRa节点在同一个信道上发送,上行信号有效负载字节数PL=50,根据式(1)计算可知,当扩频因子SF=12,编码率CR=1,前导码长度为8时,上行信号传输时间为2.794 s。下行信号有效负载字节数PL=20,传输时间为1.811 s。上行信号每个节点发送周期20 s,下行信号一个节点接收周期为10 s,上下行信号都不需要确认帧。
图6为LoRa节点日志记录,对每种情况,数据包发送总数为1 000个。
图 6 LoRa节点日志
节点个数与上行信号发送成功率的关系如表1所示,可以看出,在数据量不大的情况(4个节点)和数据量较大的情况(14个节点),改进的LoRa网关都能起到全双工的作用。当下行信号发送时,原始的半双工网关上行信号的发送成功率下降了很多,而改进后的全双工网关上行信号的发送成功率不受任何影响。
表1 节点个数与上行信号发送成功率的关系
4.2 局限性
原始LoRa网关的SX1301模块的发送时间同步是芯片完成的,而改进LoRa网关的SX1278模块的发送时间同步是靠软件完成的。本实验的时间同步是在树莓派Linux系统的用户态下完成的,Linux系统用户态和内核态之间的通信有一定的延迟。本实验网关上的Linux系统因为所运行的程序比较单一,所以Linux系统用户态和内核态通信的延迟对实验结果没影响。但是如果Linux系统运行的程序过多时,就会出现延迟非常大的情况,就会导致发送时间的同步有很大的误差。如果能把SX1278的发送时间同步在树莓派Linux系统的内核态中完成,就能把延迟降到最小,时间同步也会更加精确,这是需要进一步做的工作。
5 结束语
本文从实际应用出发,研究和实现了把原始的半双工LoRa网关改进成全双工LoRa网关的设计方案。SX1301模块的成本非常高,而SX1278模块相对而言成本非常低,把二者结合做成全双工网关的成本和原始LoRa网关的成本几乎一样,而性能却大幅提升。网关可以发送和接收LoRa上行信号和下行信号。硬件和软件实现也并不复杂,都是在原来开源代码的基础上进行修改。由实验结果可知,改进后的全双工LoRa网关可以正常工作,相对原始的半双工LoRa网关性能提升了,LoRa网络信道利用率也得到提高。