深入解析LoRa长距离无线技术 - 第一部分

本文详细介绍了LoRa无线技术及其在物联网中的应用,包括LoRaWAN网络架构、安全密钥机制、AT命令配置,并通过实际演示展示点对点通信的实现方式。

介绍LoRa(长距离)无线技术 - 第一部分

Ray Felch //

本文是多部分系列的第一篇,介绍LoRa无线技术和LoRaWAN低功耗广域网(LPWAN)。有趣的是,我在研究一个GPS跟踪项目时发现了这项技术,并很快确定它可能是GPS模块的可行替代方案。随着对LoRa研究的深入,我发现这项技术和传感器网络的概念非常迷人。根据初步研究,LoRa似乎是一项相当新的技术(不到6年),但基于CSS(线性调频扩频)技术,类似于CDMA和其他GSM协议中使用的扩频(跳频)技术,这些技术并不新。

本系列本部分的大纲将从介绍LoRa和LoRaWAN开始,重点介绍特殊用例,并包括两个REYAX LoRa模块之间点对点(视距)通信的工作演示。接下来,本系列将继续介绍The Things Network(TTN)以及如何构建自己的私有LoRa网关以连接到它。LoRaWAN包括商业和社区两个方面。The Things Network与LoRaAlliance合作,提供社区版(免费)访问LoRaWAN。本系列最后将演示如何通过个人网关将自己的终端节点(传感器)设备连接到TTN及其服务器端应用程序。

一般信息

随着物联网(IoT)在全球范围内达到数十亿设备的激增,对无线技术开发者和维护者社区的需求也显著增加。其他无线技术如WiFi、蓝牙经典版、低功耗蓝牙、Zigbee、Zwave等,都在为当前流通的许多物联网设备用例提供支持方面发挥着重要作用。这些技术中的每一种都能充分满足物联网设备的特定需求,例如传输大量数据、流媒体视频和音频、自动化和监控、可穿戴设备(健身和健康)、短距离通信、医疗、汽车和农业行业以及资产跟踪等,仅举几例。

尽管这些各种无线技术在为我们的物联网设备提供强大特性和功能方面满足了重要需求,但每种技术都有其固有的局限性。一般来说,在无线通信方面,当比较可用带宽(数据速率)与所需范围时,局限性变得明显。例如,根据下图,我们可以看到蓝牙经典耳机的最大范围约为50米,数据速率仅为几Mbps。这使其非常适合提供合理大小的音频负载;然而,带宽不足以支持流媒体视频。请注意,WiFi和蜂窝技术支持更高的数据速率(由于可用带宽更高),并且可以轻松支持流媒体视频和高互联网流量,但代价是高功耗(对于WiFi,还有信号范围的额外代价)。

链路预算

各种无线技术之间的权衡通常以“链路预算”表示,这基本上意味着将信号从点A“链接”到点B的总成本(以dBm计算)。实际上,工程师用于确定链路预算的公式和计算非常复杂,除了简单的带宽与范围之外,还考虑了许多因素。地理位置、操作环境和建筑物可能会阻碍和/或反射RF(射频)信号,导致信号强度损失。放大器增益、天线增益、电缆和天线之间的阻抗失配(导致高SWR)都会影响信号强度和接收器灵敏度。最终,有许多因素会影响整体链路预算。

参考同一图表,我们看到LoRa具有极低的链路预算(传递信号的低成本),尤其是考虑到它可以实现的更高距离(范围)。这使其成为与电池寿命至关重要的极低功耗物联网终端设备通信的理想选择。这一切都是通过尽可能保持数据负载小而实现的,这通常是传感器型终端设备的情况。

介绍LoRa

LoRa是一种低功耗、长距离无线技术,专注于提供极低功耗(单枚纽扣电池可使用数年)和长距离(10英里视距)解决方案,同时与通常生成非常小的数据负载(数据包)的物联网设备配合使用,例如湿度、温度和湿度传感器、执行器或水和燃气表监控。

LoRa在免许可的ISM(工业、科学和医疗用途)亚千兆赫频段运行,非常适合实现低功耗广域(LPWAN)传感器网络。

LoRa是一种专有的低功耗广域网调制技术,由法国格勒诺布尔的Cycleo开发,并被Semtech(专利LoRaAlliance的创始成员)收购。它基于从线性调频扩频(CSS)技术衍生的扩频调制技术。分配的无线电频率包括欧洲的EU 433(433.05-434.79 MHz)和EU 863-870(863-870/873 MHz);澳大利亚的AU915-928/AS923-1(915-928 MHz);北美的US 902-928(902-928 MHz);印度的IN 865-867(865-867 MHz);东南亚的AU 915-928/AS 923-1和EU433 [4];以及全球的2.4GHz。购买LoRa无线电模块时,请仔细检查收发器频率是否与您所在地区的频段匹配。

介绍LoRa联盟和LoRaWAN

LoRa联盟由500多名成员组成,包括IBM、思科和惠普等技术领导者,以及施耐德、博世、Diehl和Mueller等领先产品公司。该联盟的目标是标准化一个强大且不断增长的生态系统,用于大规模部署低功耗物联网广域网(LPWAN)。他们的雄心勃勃的目标是能够连接预测物联网量的50%。他们目前在177个国家拥有163家网络运营商。

根据联盟的说法,“网络运营商同意,他们只能使用经典(许可频段)蜂窝技术连接预测物联网设备量的10-15%。WiFi和BT Smart很好地服务于某些应用,但显然你不会用WiFi连接农业湿度传感器。LPWA(低功耗广域网)具有固有的长距离和低功耗特性,将成为物联网应用的‘首选’技术,其中需要远程位置、易于部署、每个网关数千个连接以及长电池寿命。”

虽然LoRa定义了物理(无线电)层,但应用和媒体访问控制(MAC)层(LoRaWAN)规范由LoRa联盟定义,并充当网络层协议,管理其网关和终端节点(物联网设备)之间的通信。

正如LoRa联盟所述,“LoRaWAN®规范是一种低功耗广域(LPWA)网络协议,旨在将电池供电的‘物’无线连接到区域、国家或全球网络中的互联网,并针对关键物联网(IoT)要求,如双向通信、端到端安全、移动性和本地化服务。”

OTA占空比

注意:无线电设备的“空中”占空比通常由政府监管,通常设置为1%。

同样,LoRaWAN规范规定了连接频率的占空比,所有符合LoRaWAN的网络设备使用这些频率进行设备的空中激活(OTAA)。在大多数地区,此占空比也设置为1%。

此外,The Things Network(社区版)采用了公平使用政策。

起初,这些限制可能看起来有些约束,但在低功耗传感器节点网络的使用案例中,这可以对我们有利。Andreas Spiess在他的教程“LoRa / LoRaWAN De-Mystified”(见本文末尾的链接)中最好地描述了这一点。

基于我们的网关集中器有8个RF通道的事实,这意味着它可以支持多达8个物联网设备并行运行。意识到8个设备与每个网关数百个节点的预测目标相比很小,我们可以将这些相同的8个设备用于50%的时间,从而将我们的传感器网络增加额外的8个设备。遵循相同的概念,如果我们将每个设备的操作时间限制在仅1%,我们现在可以在单个网关上支持800个节点,顺便说一下,这也符合管理法律。

安全密钥:

LoRaWAN 1.0指定了几个安全密钥:NwkSKey、AppSKey和AppKey。所有密钥的长度均为128位,使用AES-128算法允许加密/解密负载,类似于802.15.4标准中使用的算法。

当将新的终端设备加入网络时,设备首先注册到一个应用程序(由网关的账户持有者创建)。当设备注册(加入)时,它被分配一个APPEUI、DEVEUI和APPKEY,所有这些都对设备是唯一的。当激活设备以部署在网络时,使用相互已知的AppKey创建NwkSkey和AppSKey(会话密钥)。

NwkSKey与网络共享,而AppSKey保持私有。顾名思义,会话密钥在当前会话期间使用,并在每个后续空中激活(OTAA)会话中重新生成。

注意:LoRaWAN规范的旧版本允许使用个性化激活(ABP)静态激活设备。如果使用ABP进行激活,则所有会话使用相同的会话密钥,除非由账户持有者手动更改。随着版本3.0(The Things Stack)的发展,OTAA似乎是首选的更安全的激活方法。

网络会话密钥(NwkSKey)

终端(节点)和LoRaWAN服务器之间的交互使用NwkSKey验证每个消息的完整性,使用消息完整性代码(MIC),方式与802.15.4标准中使用的相同。MIC(LoRaWAN使用AES-CMAC)防止消息被篡改。

应用会话密钥(AppSKey)

AppSKey用于负载的加密和解密。负载在终端(节点)和Handler/应用服务器之间加密,保护发送和接收的消息不被OTA读取。

应用密钥(AppKey)

AppKey仅由设备和应用程序知道,并且如上所述,用于生成两个会话密钥。

注意:The Things Network(TTN)也允许我们使用默认的AppKey或自定义我们自己的。

帧计数器

与任何无线通信协议一样,无线电信号的空中捕获是完全可能的,并且设备价格低至25美元。幸运的是,我们的数据使用AppSKey加密,并且网络流量使用MIC(消息完整性代码)检查防止篡改。帧计数器实现在802.15标准中引入,以帮助防止重放攻击,其中信号被捕获并重新传输以欺骗原始设备。

当设备激活时,帧计数器(FCntUp)和(FCntDown)设置为零。简单来说,当发生消息上行链路时,FCntUp递增,同样,当发生消息下行链路时,FCntDown递增。如果设备或网络看到帧计数器小于最后看到的帧计数器,则整个消息被丢弃(忽略),从而防止MitM(中间人)攻击。

介绍The Things Network

The Things Stack是第3版的企业级LoRaWAN网络服务器,构建在开源核心上。The Things Stack允许我们在自己的硬件上以及云中构建和管理LoRaWAN网络。

The Things Stack部署用于各种商业部署场景;然而,他们还提供社区版部署,提供“免费使用”的网络服务器,提供世界上最大的基于社区的LoRaWAN网络。要连接到这个免费众包、开放和分散的LoRaWAN网络,用户需要注册TTN账户,并购买或构建自己的网关以连接到网络。我选择使用Raspberry Pi-4和RAK2243 Pi-HAT构建自己的网关,我将在本系列后面分享这些信息。

The Things Network基于一个开源项目,致力于为物联网设备构建一个网络,基于一种允许这些设备在没有WiFi或蜂窝连接的情况下连接到互联网的协议。基本概念围绕终端(传感器)设备传输被“范围内”的网关听到,然后连接到LPWAN。在本系列后面,我打算提供一步一步的指南,以低于100美元的成本构建您自己的个人LoRaWAN网关,并演示如何通过您的网关使用LoRaWAN将您的DIY自制(或商店购买)传感器连接到The Things Network。

简单LoRa通信演示

以下演示基于CETech的akarsh98提出的优秀示例(见本文末尾的链接)。

硬件

  • (2) ESP32微控制器模块 amazon.com/ESP-WROOM-32-Development-Microcontroller-Integrated-Compatible/dp/B08D5ZD528/
  • (2) REYAX RYLR890 LoRa无线电模块 amazon.com/RYLR896-Module-SX1276-Antenna-Command/dp/B07NB3BK5H/
  • Dupont跳线 amazon.com/s?k=Jumper+Wire+Dupont&ref=nb_sb_noss_2

这些无线电模块可以使用任何微控制器进行接口,因为我们将使用标准UART(TX/RX)连接与板载STM32微控制器芯片通信。之前,我使用Arduino Uno开发板和小型草图接口到STM32芯片,但在此演示中,我将使用ESP32设备。这些是令人惊叹的廉价微控制器,开箱即用内置WiFi和蓝牙兼容性。

注意:通常,传感器终端不需要ESP32的WiFi/蓝牙功能,并且不会在野外使用,因为那些是高功耗功能,违背了低功耗和长电池寿命的预期目标。然而,为了演示LoRa无线通信,ESP32为我们提供了快速简单的设置(4根线),并且不需要焊接。

如前所述,我们的LoRa示例基于CETech的akarsh98的一个项目,该项目使用两个ESP8266(较新的ESP32的前身)和两个REYAX RYLR890 LoRa模块。请注意,我修改了他的代码以支持较新的ESP32 UARTS。ESP32有三个硬件UART onboard,因此开发人员认为不再需要支持与ESP8266一起使用的SoftwareSerial库。

接线非常简单,LoRa模块的Vcc和Gnd连接到ESP32设备的Vcc和Gnd。LoRa模块的Tx连接到ESP32的GPIO-16(RX2引脚),LoRa模块的Rx连接到ESP32的GPIO-17(TX2引脚)。

LoRa模块包含板载STM32微控制器的事实允许我们使用一组特殊的AT命令与LoRa无线电模块通信。我们的ESP32设备将通过串行UART将这些命令直接传递给STM32。STM32微控制器根据我们的AT命令行动,将为我们控制LoRa无线电模块。在本系列后面,我们将看到如何直接控制其他LoRa无线电,使用我们的代码和特殊的开源LoRa库。

LoRa模块AT命令

如前所述,我们将发送特殊的AT命令来控制LoRa无线电。有许多AT命令可供我们使用(链接在本文末尾提供),但我们将使用一些基本命令来快速启动和运行。通常,AT命令分为两组:配置和操作。

配置AT命令

首先,我们需要配置无线电模块:

  • AT+MODE <sleep> (0 = 发送和接收模式(默认),1 = 将无线电置于睡眠模式)

  • AT+ IPR <set baud rate> (300 – 115200 [默认是115200])

  • AT+ PARAMETER <Spreading Factor>, <Bandwidth>, <Coding Rate>, <Programmed Preamble> (见下文)

  • AT+BAND=<parameter> (868500000 = 欧洲,915000000 = 美国 [默认是美国])

  • AT+ADDRESS=<address> (0 = 65535 [默认是0])

  • 扩频因子: (7 – 12 ([默认是12])

  • 带宽: (0 – 9 [默认是7 = 125 kHz])

  • 编码率: (1 – 4 [默认是1])

  • 编程前导码: (4 – 7 [默认是4])

扩频因子和带宽是关于LoRa低功耗和范围考虑的两个最重要参数。扩频因子越高,空中(OTA)时间越长,导致更多功耗和更好范围,但代价是降低数据速率。这就是LoRa在配置范围或低功耗操作方面可以灵活的地方。诚然,我花了一些时间才最终弄清楚这一切,所以我将尝试用一个例子来解释。

首先,数据速率取决于使用的带宽和扩频因子。LoRaWAN可以使用带宽为125 kHz、250 kHz或500 kHz的通道(取决于地区或频率计划)。扩频因子由终端设备(传感器)选择(和设置),并影响传输帧所需的时间。

增加带宽或减少扩频因子允许字节在更短的时间内发送。一般规则是,带宽加倍允许我们在相同时间内发送两倍的数据负载。同样,将扩频因子减少一也允许我们在相同时间内发送两倍的数据负载。

请记住,降低扩频因子也可能使网关更难以接收传输的信号,因为它更容易受到噪声的影响。如果网关距离很远,您可能会使用更高的扩频因子(SF10)(数据速率会较慢,但更可靠)。如果网关在附近,我们可以使用较低的扩频因子(SF7)并增加数据速率。显然,尽可能保持数据负载小有助于整体数据速率、范围和功耗。

操作AT命令

配置无线电后,我们准备开始发送和接收,这可以通过以下命令完成: 注意:每个LoRa模块(发送器和接收器)的地址必须相同才能相互通信。

发送

AT+SEND=<Address>, <Payload Length>,<Data> (Address = 0 – 65535, Payload Length = 最大240字节, Data = ASCII格式)

接收

+RCV =<Address>, <Payload Length>,<Data>,<RSSI>,<SNR> (与SEND相同,但有两个额外参数)

RSSI(接收信号强度指示器)是以dB测量的接收信号强度指示器,SNR是以dB测量的信噪比。

注意:接收不需要‘AT’,因为我们只是接收数据(实际上不是发出无线电命令)。

上传代码(假设已安装并运行Arduino IDE)

  • 将ESP32连接到PC的USB端口
  • 进入Arduino IDE,在工具下选择ESP32 Dev Module板和USB端口
  • 将代码(草图)上传到ESP32

断开ESP32并连接第二个ESP32。对第二个ESP32遵循相同的步骤。LoRa无线电Messenger草图(复制并粘贴为两个ESP32设备的新草图)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* LoRa transmitter - receiver messenger -- llcoder 11-18-2021
* There are three serial ports on the ESP known as U0UXD, U1UXD and U2UXD.
*
* U0UXD is used to communicate with the ESP32 for programming and during reset/boot.
* U1UXD is unused and can be used for your projects. Some boards use this port for SPI Flash access though
* U2UXD is unused and can be used for your projects.
*/

#define RXD2 16   // LoRa TX (ESP32 RX2)
#define TXD2 17   // LoRa RX (ESP32 TX2)

#include<LoRa.h>

String incomingString;
String PrStr;                                           // String used to print the incoming string after decoding it

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);  // (ESP32 UART)
}

void loop() {
  if (Serial.available()){
        incomingString = Serial.readString();
          if(incomingString.length()>2){
          Serial.print("YOU: ");
          Serial.println(incomingString);
          String messStr = "AT+SEND=0,";              // messStr(AT COMMAND) is to be sent to the LoRa module to send the relevant data
          messStr += (incomingString.length()-2);
          messStr += ",";
          messStr += incomingString;
         
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计