注意:针对 LoRaWAN 演示项目的 FreeRTOS 支持位于 FreeRTOS-Labs。 该演示功能齐全,但正在进行优化或重构,以提高内存使用率、增强模块性、完善说明文档、提升演示可用性或测试覆盖率。 它与主 Labs Project 下载分开,可以在 GitHub 上的
Lab-Project-FreeRTOS-LoRaWAN 存储库获取。
针对 LoRaWAN 演示的 FreeRTOS 支持
如上所述, A 类提供最节能的通信模式并且可实现最长的电池寿命。上行和下行消息都可以被确认(需要另一方的 ACK)或未经确认(无需 ACK)。下图 3a 和 3b 展示了已确认的上行链路和下行链路的时间序列。了解有关详细说明,请参阅 LoRaWAN 1.0.3 规范的第 18 节。
图 3a:已确认数据消息的上行时序图(来源:LoRa 联盟)
点击放大。
图 3b:已确认数据消息的下行时序图(来源:LoRa 联盟)点击放大。
此页上的演示描述了 A 类应用程序的工作示例。它会生成 A 类设备应用程序任务, 该任务按照 LoRaWAN 区域参数定义的链路公平访问策略,定期发送上行链路消息。上行链路消息在已确认或未确认模式下均可发送。成功启用上行链路后,任务将等待下行链路消息或任何其他来自 MAC 层的事件。 它将帧负载和接收下行链路的端口写入控制台。如果 MAC 层显示有其他下行链路消息挂起或有出于控制目的需要发送上行链路,它会立即发送空上行链路。如果 MAC 层检测到帧丢失,它会触发再入网流程来重置帧计数器。处理完所有下行链路数据和事件后,任务将恢复休眠状态直到下一个传输周期。
MAC 层到应用程序的所有事件都使用轻量级任务通知发送。LoRaWAN 允许将服务器的多个请求捎带到上行链路消息中。这些请求的响应由应用程序接收,以便使用队列。如果应用程序想要在发送上行链路有效负载之前同时对接收到的多个有效负载进行读取,也会使用下行队列。
低功率模式
A 类设备通信的一个重要特征是,应用程序在其生命周期的大部分时间休眠,因而消耗的功率更少。可以使用 FreeRTOS
的无滴答空闲功能为演示项目启用低功耗模式。通过为
portSUPPRESS_TICKS_AND_SLEEP()
宏提供板特定的实现,并将
configUSE_TICKLESS_IDLE
设置为 FreeRTOSConfig.h 中的适当值,即可启用 tickless 空闲模式。启用无滴答模式后,MCU 可以在任务空闲时休眠,但会被无线中断或其他定时器事件中断唤醒。
入门指南
此博客文章描述了演示所需的硬件:
支持的平台
快速设置
设备硬件设置 (Nordic NRF52840 + Semtech SX126x Mbed Radio)
图 4 所示为 Nordic NRF52480 开发套件,图 5 所示为 Semtech SX126x LoR 无线电收发器的 Mbed 屏蔽板。
图 4:Nordic NRF52840-DK 板
点击放大。
图 5:Semtech SX126x LoRa 无线电收发器
点击放大。
该套件与 Arduino Uno 第 3 版的标准兼容,因此可以将 SX126x 屏蔽板堆叠在其上,如图 6 所示。Nordic MCU 运行 FreeRTOS 和 LoRa MAC 层,并通过 SPI、GPIO 和 Uart 接口与 LoRa 无线电收发器进行通信。
图 6:Nordic NRF52840-DK 板与 Semtech SX126x LoRa 组合视图
点击放大。
设置 IDE
下载并查看代码
使用 Git 存储库设置 SSH。
下载存储库以及相关存储库:
git clone --recurse-submodules https://github.com/FreeRTOS/Lab-Project-FreeRTOS-LoRaWAN.git
FreeRTOS LoRaWAN 实现使用略有修补的 LoRaMac-Node 4.4.4 版本。该补丁程序用于公开无线 HAL 回调,以通知无线中断事件。要应用补丁程序,请执行以下操作:
cd Lab-Project-FreeRTOS-LoRaWAN
git apply --whitespace=fix FreeRTOS-LoRaMac-node-v4_4_4.patch
通过以下路径打开 Segger Embedded Studio 中的解决方案:
demos/classA/Nordic_NRF52/classa_demo.emProject
图 7:Segger IDE 显示 A 类演示项目
点击放大。
在 The Things Network (TTN) 上注册设备
在终端设备通过 The Things Network (TTN) 进行通信之前,请按照步骤在应用程序中注册该设备。
设置激活凭据
Over the Air Activation (OTAA) 和 Activation By Personalization (ABP) 方法要求在设备中配置 Device EUI、Join EUI 以及必要的密钥。对于生产用例,强烈建议您使用安全元件预先配置这些凭据。为了支持预先配置的凭据,用户需要使用 secure-element.h 接口提供安全元件的实现,该接口由 LoRaMac 节点提供。在 LoRaMac-node 存储库中可以找到不同安全元件的引用实现。
所提供的示例使用基于软件的安全元件。可以使用 getter 函数从内存位置或闪存中检索凭据。默认情况下,示例将凭据硬编码为静态常量变量。以下步骤描述了如何设置这些变量的值。
- 进入
demos/classA/common/credentials.c
文件,并根据演示的激活类型配置全局变量。
注意:这些参数是以十六进制值数组的形式提供,其中以大端字节顺序表示字节。
- 对于 Over The Air Activation (OTAA):
- 将变量 devEUI 设置为全局唯一的 8 字节 Device EUI。
- 将变量 joinEUI 设置为 8 字节 Join EUI。
- 将 appKey 设置为 16 字节的预共享网络密钥。
- 对于 Activation By Personalization (ABP):
- 将变量 devEUI 设置为全局唯一的 8 字节 Device EUI。
- 将变量 joinEUI 设置为 8 字节 Join EUI。
- 将变量 appSessionKey 和 nwkSessionKey 设置为 16 字节的预共享会话密钥。
- 将 END_DEVICE_ADDR 设置为预先分配的 24 位 NET ID。
static const uint8_t devEUI[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const uint8_t joinEUI[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const uint8_t appKey[ 16 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
- 注释或删除以 #error 开头的行
#error "Please configure DEV EUI, Join EUI and App key to run the demo using OTAA"
设置 LoRaWAN 区域
各个区域的枚举列表位于头文件 LoRaMac-node/src/mac/LoRaMac.h 中
构建并运行代码
加入该设备
- 设备 在初始化 LoRaWAN 堆栈后发送 Join Request。
图 9:TTN 控制台显示终端设备 Join Request
点击放大。
- 图 10 中的 TTN 控制台显示 Join Accept(加入接受)从 LNS 发送回网关,然后发送到终端设备。
图 10:TTN 控制台显示终端设备 Join Accept
点击放大。
- 图 11 中的终端设备调试控制台显示已接收 Join accept,并且设备成功完成 Join 过程。终端设备获得
Device Address
,该地址随后用于所有上行链路和下行链路通信。
图 11:Segger IDE 显示通过设备地址分配完成 Join 流程
点击放大。
发送上行链路数据
LoRaWAN A 类设备通信允许设备在成功激活后随时发送上行链路数据。但是,连接到 LoRaWAN 网络的设备应遵循针对特定区域定义的占空比限制和公平访问策略。该策略限制数据包大小或发送时间以及允许传输的占空比。请点击此处以获取有关占空比限制和公平访问策略的更多信息。
FreeRTOS 的 A 类设备演示任务按照以占空比间隔为基础配置的间隔发送 2 字节的周期性上行链路数据。以下是该设备在 TTN 上发送和接收的数据包的屏幕截图:
- 如图 12 所示,该设备在每个 TX-RX 周期发送 2 字节的
0xFEED
上行链路数据包。数据包以未确认模式发送,这意味着不会收到这些数据包的 ACK。(注意:若要更改为确认模式,请在 demos/classA/common/classa_task.c
中设置以下配置)。
#define LORAWAN_CONFIRMED_SEND ( 1 )
图 12:Segger IDE 显示设备成功发送上行链路数据
点击放大。
- 图 13 示出由 TTN 控制台接收的数据包以及接收元数据,诸如网关 RSSI、SNR。
图 13:TTN 控制台显示终端设备上行链路数据以及接收元数据
点击放大。
接收下行链路数据
对于 LoRaWAN A 类设备通信,设备仅在每条上行链路消息后打开接收插槽。对于来自 TTN 控制台的设备,可以将下行链路数据包排入队列。LNS 选择设备网关,并将数据包排入网关的队列。设备在成功发送下一个上行链路数据包后接收下行链路数据包。
- 若要将 TTN 的下行链路数据包排入队列, 进入应用程序页面,然后点击您的应用程序。点击注册设备的选项卡,然后选择要向其发送下行链路数据包的设备。如图 14 所示,在设备页面的下行链路选项卡下,将有效负载排入下行链路队列。(图 14 示出 2 字节的
0xC0DE
有效负载,该有效负载以未确认模式排入 FPort 2
队列。)
图 14 TTN 控制台调度下行链路
点击放大。
- 在 A 类设备操作模式下,TTN 网络服务器调度下行链路数据, 然后在接收到来自设备的下一个上行链路数据包时将下行链路数据发送到该设备。
图 15 TTN 控制台调度下行链路
点击放大。
- 如图 16 所示,终端设备在下一条上行链路之后在两个接收窗口中的一个
FPort 2
上接收下行链路数据 0xC0DE
:
图 16 Segger IDE 显示为终端设备接收下行链路数据
点击放大。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.