- LoRaWAN 需要正确配置网关(频率、IP 网络、服务器)并向 TTN 注册,节点才能进行通信。
- 终端设备通过 DevEUI、JoinEUI/AppEUI 和 AppKey (OTAA) 或 NWKSKEY/APPSKEY/DEVADDR (ABP) 在 TTN 应用程序中注册。
- 可以使用商用传感器(SenseCAP、Decentlab、Dragino、Tabs)或带有 ESP32/Arduino 和 LMIC 库的 DIY 节点向 TTN 发送数据。
- TTN 可促进与 Node-RED 和外部平台的集成,以可视化和利用 LoRaWAN 网络收集的物联网数据。
既然你已经读到这里,说明你想了解如何从头到尾将 LoRaWAN 节点连接到 TTN,包括网关、节点、传感器、库、密钥和网络配置等所有环节。好消息是,你无需成为电信专家;只要有结构清晰的指南和一点耐心,你就能很快搭建起自己的 LoRaWAN 网络。
接下来,我们将逐步介绍如何设置网关、将其注册到物联网网络 (TTN)、添加应用程序和终端设备,以及如何基于 ESP32 或 Arduino 开发板对 LoRaWAN 节点进行编程,并提供使用商用传感器(SenseCAP、Decentlab、Dragino、Tabs Brown)的示例。此外,我们还将介绍一些手册中不常见的实用细节:常见的关键问题、频率选择、物理引脚连接,以及验证所有设备是否真正与 TTN 通信的技巧。
什么是 LoRa 和 LoRaWAN?为什么要使用 TTN?
LoRa 和 LoRaWAN 是两个相关的概念,但它们并不相同。LoRa 是 Semtech 公司专有的远距离、低功耗射频调制技术。LoRaWAN 是一种网络协议,它依赖于 LoRa 来管理终端设备(节点)与网关和网络服务器之间的通信。
典型的 LoRaWAN 网络包含两个主要组件:网关和节点。网关充当 LoRa 世界(无线电)和 IP 世界(互联网)之间的“桥梁”,将数据包转发到 LoRaWAN 服务器。节点是传感器或执行器,它们使用 LoRa 技术与网关进行信息收发。
要连接所有这些设备,你需要一个 LoRaWAN 服务器。你可以付费使用私有服务(例如 Movistar、Vodafone 等运营商,或 Loriot、Actility、Kerlink 等平台),也可以选择使用社区网络 The Things Network (TTN),这是一个由社区维护的公共开放网络。
TTN的优势在于尊重数据治理、保持中立,并允许用户向网络贡献网关。在许多城市,人们都在自发地安装网关,任何人都可以免费享受这种网络覆盖,只需支付节点硬件的费用即可。
LoRaWAN 频率、信道和限制
购买任何设备之前,务必确保其 LoRa 频率与您所在地区兼容。在欧洲使用 LoRa 设备与在美国或亚洲使用 LoRa 设备截然不同;如果选择了错误的频段,设备可能无法使用,甚至可能违法。
在欧洲,主要使用868 MHz频段(EU868)。在美国,常用频段是915 MHz(US915)。中国零售商提供各种433 MHz模块,价格可能很诱人,但它们并非总是与LoRaWAN或您所在国家/地区的操作系统兼容。
除了频率之外,LoRaWAN 还由信道、扩频因子 (SF) 和频率规划组成。扩频因子决定了传输速度和范围:更高的扩频因子意味着更远的传输距离,但也意味着更长的空中传输时间,这会消耗更多功率并占用更多信道空间。
在欧洲,众所周知的“1%规则”适用:每个设备只能占用无线信道的时间比例很小,通常约为1%。这限制了数据发送的频率,也是LoRaWAN传感器通常每隔几分钟而不是每隔几秒钟发送一次数据的原因之一。
网关和节点硬件的准备和选择
要搭建一个实用的网络,您至少需要一个 LoRaWAN 网关和一个或多个节点(传感器)。您可以组合使用不同厂商的硬件,只要它们符合 LoRaWAN 标准并工作在同一频段即可。
一款热门的室内网关产品是Dragino LPS8,它集成了 SX1308 信号集中器,支持多达 10 个并行通道。该产品根据不同国家/地区预配置了不同的频率方案,在欧洲,其工作频率为 868 MHz。它通过 USB-C 接口以 5V 电压供电,并通过 RJ-45 或 Wi-Fi 连接到 IP 网络。
其他与 TTN 兼容的网关示例包括RAK7289(户外型、坚固耐用,并可选配 LTE/4G 功能)或官方的 TTN-GW-868 MHz 网关,后者专为城市或智慧城市项目部署网络覆盖而设计。此外,还可以使用ESP32 开发板和 SX1262 LoRa 模块构建单小区网关,例如使用 Wio-SX1262 套件和小米 ESP32S3 开发板即可实现。
作为节点,您有两种选择:使用已准备好用于 LoRaWAN 的商用传感器(SenseCAP S210x、Tabs Browan TBHH100、Dragino TrackerD、Decentlab 等),或者使用开发板(如 TTGO LoRa32 V2.0、ESP32 + RMF95、Arduino + LoRa 模块等)构建自己的节点。
配置 LoRaWAN 网关并将其连接到 TTN
项目的第一步是确保网关正常运行,并在 TTN 上显示“已连接”状态。虽然每个制造商都有自己的控制面板,但概念步骤非常相似。
例如,使用 Dragino LPS8,您可以通过 SSH 或 HTTP 进行管理。如果您使用 RJ-45 网线连接,则需要查找 DHCP 服务器分配的 IP 地址(可以使用 IP 地址扫描器或通过路由器获取)。如果您更喜欢通过 Wi-Fi 进行初始设置,LPS8 会创建一个 SSID 类似于“dragino-xxxxx”、默认密码类似于“dragino+dragino”的网络。访问 IP 地址 10.130.1.1 将进入 Web 管理面板,初始用户名和密码通常为“admin/dragino”。
进入后,您会看到一个包含多个部分的菜单,某些选项可能带有红色叉号,表示配置缺失。第一步是在 LoRa 选项卡中选择您所在地区的正确频率方案;在欧洲,该方案为 EU868(约 868 MHz)。
接下来,点击LoRaWAN 或网络服务器选项卡。在这里,您可以定义网关将连接到哪个 LoRaWAN 服务器。对于 TTN,请选择“TTN”作为提供商,并输入欧洲服务器的地址(例如 eu1.cloud.thethings.network),同时保留 UDP 端口(通常上传和下载端口均为 1700)。在同一部分,您还会看到网关 ID 或 EUI,稍后在 TTN 中会用到它。
在“网络”部分,您可以配置网关连接到互联网的方式:局域网 (LAN)、广域网 (WAN) 或 Wi-Fi WAN。对于 WAN 接口,您可以选择静态 IP 地址或 DHCP;建议尽可能使用有线连接的静态 IP 地址,以获得更稳定的连接和更便捷的管理访问。LAN 部分通常用于网关的内部接入点网络;最好不要在完全了解其作用的情况下更改此设置,因为一旦出现问题,它可能至关重要。
在 Wi-Fi 设置部分,您可以调整网关自身生成的接入点及其与外部 Wi-Fi 网络的连接。出于安全考虑,建议您更改接入点出厂时的默认 SSID 和密码。
在 RAK7289 网关上,操作步骤类似:访问 Web 管理面板,通过“网络”→“WAN 接口”配置 IP 地址(静态或 DHCP),然后在“LoRa 网络”→“网络设置”→“数据包转发器”中输入 TTN 服务器详细信息,并记下网关 EUI,以便稍后将其注册到 TTN。如果您位于提供 DHCP 服务的路由器之后,则可以通过查看租约表(例如,通过主机名“RAK7289”)或使用 nmap 等工具来查找网关的 IP 地址。
在 The Things Network 上注册网关
网关接入互联网后,您需要将其注册到 TTN。如果您没有帐户,请先在 The Things Network 网站上注册,然后访问相应区域的控制台(例如,https://eu1.cloud.thethings.network/)。
在控制台中,选择“网关”部分,然后单击“注册网关”。TTN 将要求您输入网关 ID(您帐户中的唯一名称),并根据网关类型要求输入网关 EUI。对于使用传统数据包转发器的 Dragino LPS8 网关,您必须选择“我正在使用传统数据包转发器”选项。
此外,您还需要指定频段方案(欧洲地区为 EU868)、对应的区域或路由器,以及可选的位置信息(坐标、室内/室外等)。对于像采用 XIAO ESP32S3 和 Wio-SX1262 的单小区网关这样的设备,固件本身可能会在启动时通过串口显示网关 ID;只需复制该 ID 并将其用于注册表单即可。
填写完这些信息并注册网关后,TTN 将显示状态检查器(“已连接”或“已断开连接”)以及“流量”部分,您可以在其中实时查看数据包流。如果网关和 TTN 上的所有配置都正确,您应该会在一两分钟内看到状态变为“已连接”,并在节点传输数据时开始看到流量。
这意味着基础设施(网关+服务器)现已投入运行。接下来,需要进行应用程序和终端设备的配置。
TTN中的应用程序创建和节点注册
在 TTN 中,设备并非直接注册在账户根目录,而是注册在应用程序内。一个应用程序将一个或多个发送相关数据的节点分组,例如,建筑物内的所有环境传感器,或者教育项目中的多个 GPS 追踪器。
在 TTN 控制台中,转到“应用程序”部分并创建一个新应用程序。为其指定一个唯一的 ID,还可以选择添加描述,并选择相应的区域。在该应用程序中,您将使用其凭据(DevEUI、JoinEUI/AppEUI 和 AppKey 或其他密钥,具体取决于激活方法)注册每个 LoRaWAN 节点。
对于像Browan TBHH100-868温湿度传感器这样的商用传感器,通常会贴有包含DevEUI、AppEUI和AppKey的标签。它们通常使用OTAA(空中激活)方式,这种方式会在每次连接网络时生成密钥会话,因此比ABP更安全。
使用 OTAA,在 TTN 中选择注册新的终端设备,输入 JoinEUI(AppEUI)、DevEUI 和 AppKey,验证数据并确认。保存后,如果节点配置正确且在网关的覆盖范围内,它将接收到网络信标,执行加入过程,您将在控制台中看到包含测量值的上行链路消息。
同样的情况也适用于像Decentlab液位和温度传感器这样的设备:制造商会提供ID、DevEUI、AppEUI和AppKey,但事先并不知道您将使用哪个服务器。您需要负责将这些信息注册到TTN(或其他服务器),以便注册传感器。如果您提出要求,许多Decentlab设备会预先注册到TTN,这进一步简化了流程。
配置商用 LoRaWAN 传感器
让我们来看一些具体的例子,了解如何准备和注册商用 LoRaWAN 传感器,然后这些传感器将通过您的网关与 TTN 通信。
以 SenseCAP S210x 系列(例如环境传感器)为例,典型的操作流程是使用制造商的 SenseCraft 应用程序。首先,下载该应用程序,然后通过按钮打开传感器(按住按钮几秒钟,直到 LED 指示灯每秒闪烁一次),最后在应用程序中选择“扫描”来读取设备的二维码。
在应用程序中,有一个“高级配置”模式,您可以在其中选择“The Things Network”作为平台。您必须选择与网关相同的频率方案(例如 EU868),并确认加入模式为 OTAA。应用程序将显示设备 EUI、AppEUI(JoinEUI)和 AppKey;建议您记下这些信息,因为在 TTN 注册设备时需要输入它们。
以Tabs Browan TBHH100-868 传感器为例,其按键已在出厂时预先配置。该传感器可测量温度和湿度,由 3,6V 电池供电,并按照以下规则传输数据:如果没有变化,则每 60 分钟传输一次;如果温度变化超过 ±2°C 或湿度变化超过 ±5%,则提前传输。要注册该传感器,只需将制造商提供的 APPKey、APPEUI 和 DevEUI 输入到您的 LoRaWAN 服务器(例如 TTN)中即可。有时可能会出现格式或字节顺序(MSB/LSB)问题,因此如果首次连接失败,请务必检查这一点。
Dragino TrackerD 设备用作带紧急按钮的 GPS 追踪器。每个设备都有自己的一组 LoRaWAN 密钥。在 TTN 系统中,这些密钥通常注册在同一个应用程序(例如“course-tracking”)中,如有必要,可通过串口(USB)使用 AT 命令配置设备。文档详细介绍了用于调整传输速率、报警行为等的命令。重要提示:许多 Dragino 固件要求将 AT 命令完整粘贴到终端中,而不是逐个字符输入。
在Decentlab的液位传感器、压力传感器或环境传感器等产品中,其设计理念类似:DevEUI、AppEUI和AppKey用于将它们连接到TTN(或其他网络)。Decentlab通常将传输间隔设置为10分钟,因为这是数据消耗量和分辨率之间经过验证的折衷方案,当然,用户也可以根据需求或通过配置进行修改。用户可以在制造商的云平台上查看数据,也可以通过添加相应的有效载荷解码器将设备集成到第三方平台(例如MyDevices、ResIoT、WMW等)中。
使用开源硬件构建您自己的 LoRaWAN 节点
如果你喜欢动手实践,最有趣的事情往往是搭建和编程自己的 LoRaWAN 节点。一种非常流行的组合是使用基于 ESP32 并集成 LoRa 的开发板,例如 TTGO LoRa32 V2.0 868 MHz,并添加一个简单的传感器,例如 DS18B20 温度传感器。
这种方法需要四个部分:控制板(ESP32、Arduino 等)、LoRa 无线电模块(例如 RFM95 型 SX1276/78)、要测量的传感器,以及可选的用于在本地显示数据的外围设备,例如 OLED 显示屏。
TTGO LoRa32 V2.0 集成了一个 LoRa 收发器,并且根据版本不同,还配备了一个小型 OLED 显示屏。它基于 ESP32,提供 WiFi 和蓝牙功能,在很多情况下,连接到互联网后,它也非常适合构建单通道迷你网关。然而,在这款开发板以及类似的开发板上,LoRa 模块的某些信号(DIO1、DIO2)并未预先连接到微控制器,您需要自行连接。
例如,TTGO LoRa32 V2.0 通常使用以下 LoRa 引脚配置:SCK 接 GPIO5,MISO 接 GPIO19,MOSI 接 GPIO27,CS 接 GPIO18,RESET 接 GPIO14,DIO0 接 GPIO26。DIO1和 DIO2 通常分别与 GPIO33 和 GPIO32 物理连接,这两个引脚位于另一排的正对面,因此可以使用跳线轻松连接。
连接这些线路通常有三种方法:将导线直接焊接到引脚上(用于最终组装)、如果电路板在面包板上则使用跳线,或者将线路布线到专用PCB上,然后将TTGO插入该PCB。跳线连接通常最方便测试。
节点软件:LMIC库、频率和TTN密钥
要在 Arduino/ESP32 上对 LoRaWAN 节点进行编程,广泛使用MCCI LoRaWAN LMIC 库,该库实现了 LoRaWAN 协议栈,并管理与信道、加入、重试、接收窗口等相关的一切。
首先,在Arduino IDE 的库管理器中搜索“LMIC”并选择“MCCI LoRaWAN LMIC library”来安装该库。安装完成后,需要注意一个关键细节:默认情况下,该库配置为 US915(美国),因此如果您位于欧洲,则必须将其更改为 EU868。
为此,请找到库文件夹(例如 /Arduino/libraries/MCCI_LoRaWAN_LMIC_library/project_config/)中的 lmic_project_config.h 文件,并编辑其中的定义。注释掉 CFG_us915,并启用 CFG_eu868,同时确保启用了正确的无线电类型(例如,对于 SX1276/78 模块,启用 CFG_sx1276_radio)。此更改只需一次,即可应用于所有 LMIC 项目。
然后,您可以打开一个内置示例,例如ttn-abp,它会定期发送“Hello, world!”作为有效载荷。此示例可作为基础,方便您根据自己的开发板和 TTN 凭证进行调整。
在代码中,你会看到一个lmic_pinmap 结构体,它指定了 NSS (CS)、RST 和 DIO 引脚。默认情况下,它通常映射为 Feather M0 LoRa 的引脚,因此如果你使用的是 TTGO LoRa32 V2.0,则需要修改此结构体,使其使用 .nss = 18、.rst = 14 和 .dio = {26, 33, 32}(假设你已将 DIO1 连接到 GPIO33,DIO2 连接到 GPIO32)。如果你的硬件不同,则需要查阅其文档或查找特定示例。
引脚排列正确后,就可以配置用于在 TTN 中标识节点的密钥了。在 ttn-abp 示例中,变量 NWKSKEY、APPSKEY 和 DEVADDR 旁边会显示 FILLMEIN 字样,您可以根据需要填写值。
您在创建启用 ABP 激活的设备时,可以从 TTN 控制台获取这些数据。TTN 会提供网络会话密钥 (NWKSKEY)、应用程序会话密钥 (APPSKEY) 和设备地址 (DEVADDR)。出于安全考虑,这些密钥在界面中默认隐藏,但您可以将其显示出来,更方便的是,您可以直接复制这些值作为 C 数组(使用“<>”按钮),并确保字节顺序正确(最高有效位)。点击复制图标会将数组复制到剪贴板,您可以直接将其粘贴到代码中每个 FILLMEIN 元素所在的位置。
对于 NWKSKEY 和 APPSKEY,您将使用TTN 提供的字节数组格式;而对于 DEVADDR,您需要将十六进制值设置为 u4_t 类型的单个整数,例如 `static const u4_t DEVADDR = 0x26011111;`。这样,您的节点就能进行身份验证,并将数据包路由到您的 TTN 应用程序。
将传感器集成到节点代码中
LoRaWAN 框架搭建完成后,就可以用真实的传感器数据替换常见的“Hello, world!”了。继续以 TTGO LoRa32 和 DS18B20 为例,我们将使用 OneWire 总线和 DallasTemperature 库。
在草图开头,包含头文件并定义总线引脚:`#include <OneWire.h>`、`#include <DallasTemperature.h>` 和 `#define ONE_WIRE_BUS X`,其中 X 是连接传感器的 GPIO 引脚。创建 `OneWire` 对象 `oneWire(ONE_WIRE_BUS)` 和 `DallasTemperature` 对象 `sensor(&oneWire)`。如果尚未安装 DS18B20 库,请从库管理器中添加。
在 setup() 函数中,您可以使用 sensor.begin() 初始化传感器,如果需要,还可以设置分辨率(例如,sensor.setResolution(11))。之后,传感器就可以在您需要时读取温度了。
LMIC 中用于发送数据的关键函数是 `do_send(osjob_t* j)`。该函数内部会检查是否存在正在进行的传输(`OP_TXRXPEND`)。如果没有,则调用 `sensor.requestTemperatures()`,使用 `sensor.getTempCByIndex(0)` 获取温度值,并将其存储在 `mydata` 数组中。例如,可以使用 `mydata[0] = (uint8_t)sensor.getTempCByIndex(0);` 仅发送温度的整数部分。
然后调用LMIC_setTxData2(1, mydata, sizeof(mydata), 0)函数,其中第一个参数是 LoRaWAN 端口(本例中为 1),第二个参数是缓冲区大小,第三个参数是缓冲区大小,最后一个参数指示消息是否已确认(1)或未确认(0)。库随后会在下一个可用时隙安排传输。
有很多可能的改进空间:扩展有效载荷以包含十进制数据、添加其他传感器、以高效的二进制格式打包数据等等。但即使是这个简单的版本,您也已经拥有一个可以定期向 TTN 发送实时测量数据的节点,这些数据可以在控制台上看到,并且可以随时与其他系统集成。
OTAA激活、安全性和实践经验
到目前为止,我们主要通过代码示例讨论了ABP,但在生产环境中,强烈建议使用OTAA(空中激活)。例如,Decentlab传感器和许多SenseCAP传感器都使用OTAA方法,因为它能增强安全性。
使用OTAA协议时,LoRaWAN会话会在设备每次加入网络时“空中”协商建立。当节点断电、重启或失去连接时,下次加入网络时会生成新的会话密钥,这使得他人很难通过复制静态密钥来克隆设备。
在 TTN 控制台中,当您为设备选择 OTAA 时,您将看到DevEUI、JoinEUI/AppEUI 和 AppKey ,而不是静态的 NWKSKEY 和 APPSKEY 。会话密钥每次都会根据这些值以及与服务器的交换而生成,您只能在会话期间看到派生的密钥。
实际上,从零开始使用 LoRaWAN 的用户发现,只要网关已在 TTN 注册,并且 OTAA 传感器配置正确,注册过程就非常简单:在 TTN 上创建一个帐户,激活网关,使用制造商提供的密钥注册传感器,几分钟内即可在 Web 平台(无论是 Decentlab 自己的平台、SenseCAP 平台还是第三方仪表板)上查看数据。
传感器的 LoRa 盒的位置(最好是垂直位置,这样有利于内部天线的辐射方向图) 、无线电环境和网关的高度等因素都会极大地影响实际覆盖范围,但一旦理解了设置流程,设置过程就相当机械化。
从 TTN 到您的应用程序:集成和可视化
现在节点已开始向 TTN 上传数据,下一步是将这些信息导入到您自己的应用程序、仪表板或自动化工作流程中。TTN 为此提供了强大的集成功能和 API。
一种非常常见的方法是使用Node-RED 从 TTN 接收数据并根据需要进行处理。您可以使用 TTN 应用程序凭据配置 MQTT 或 HTTP 连接,解码有效负载(根据传感器的格式),然后几乎可以执行任何操作:保存到数据库、显示图表、触发警报等等。
另一种选择是使用已与 TTN 集成的第三方平台,例如 Datacake、MyDevices、ResIoT、WMW 等。许多此类平台已经为 Decentlab 传感器或某些 Dragino 型号等设备提供了特定模板,因此您只需选择设备类型,将其链接到您的 TTN 应用程序,即可在用户友好的仪表板上查看数据。
例如,在教育项目中,TTN 已与RAK7289 网关和 Dragino TrackerD 追踪器配合使用,用于定位人员或车辆。工作流程如下:网关注册,追踪器在 TTN 中注册,在控制台上查看数据,然后实时显示在公共 Datacake 仪表板上,仪表板上包含地图和图表,显示位置、电池电量等信息。
需要理解的重要一点是,TTN 充当 LoRaWAN 网络层和数据路由器;您可以决定应用层和可视化层:从使用 API 的 Python 脚本到工业物联网数据平台。
简而言之,将 LoRaWAN 节点连接到 TTN 需要几个步骤(正确的频率、正确配置的网关、TTN 注册、节点密钥、OTAA 或 ABP 激活、设备软件,以及后续集成,如果需要),但只要遵循正确的指南,即使没有经验,每个步骤都易于操作。初始设置完成后,部署更多节点或网关将成为一个高度可重复且可扩展的过程,非常适合大规模传感器项目、智慧城市计划,或者仅仅是学习和试验远程物联网。