我们很高兴介绍 LoRaWAN - FreeRTOS Labs 项目,它是 LoRaWAN 与 FreeRTOS 实现连接的参考案例。本项目旨在演示 FreeRTOS 如何使用 LoRa 技术简化 IoT 应用程序的开发。 LoRa 是一种长距离、低功耗的无线技术,运行在非授权频谱中。它 专为需要在不同环境中远距离发送不频繁、少量数据的传感器而设计。LoRa 是一种物理层展布频谱调制技术,源自啁啾扩频 (CSS) 无线通信技术。LoRaWAN 由 LoRa 联盟开发,是 LoRa 网络的系统架构和通信协议规范。
LoRaWAN 网络架构
LoRa 联盟定义了 LoRaWAN 的网络层和系统架构。图1 描绘了 LoRaWAN 连接流程,不同组件将终端节点连接到云端和应用服务器。

应用服务器 (AS) 负责安全地处理、管理和解析传感器应用数据,以及为驱动仪表板 UI 提供数据。
入网服务器 (JS) 管理入网终端设备的空中激活 (OTAA) 流程。JS 对终端设备执行入网流程(双向认证),将终端设备应当连接到哪个 AS 通知给 LNS,并派生会话密钥。 每个 JS 由一个 64 位的全局标识符 AppEUI (或 JoinEUI) 唯一标识。终端设备基于 DevEUI、Join EUI、DevNonce、根密钥 (AppKey、NwkKey ) 在本地派生会话密钥,使得安全密钥不会通过无线交换。JS 向 LNS 传递网络会话密钥并向 AS 传递应用程序会话密钥。终端设备安全地存储各自的根密钥,而等效的匹配密钥则安全地存储在 JS 上。因此,JS 包含其管理的每个终端设备的以下信息:
- DevEUI(终端设备唯一序列标识符)
- 根密钥
- AppKey(应用程序密钥)
- NwkKey (网络密钥)
- 应用程序服务器标识符
- 终端设备服务配置文件
个性化激活 (ABP) 过程相对简化和不安全。在通过个性化激活过程中,入网流程被跳过,并且可以在生成 ID 和密钥时进行个性化。终端设备被绑定到特定的网络或服务,而且其网络地址的一部分由网络标识符 (NetID) 构成,这使得他们在供电后可以立即使用。
LoRaWAN 规范定义了三种终端设备类型:A 类、B 类和 C 类。A 类设备大部分时间处于空闲状态(如节能模式)。当终端设备传感器正在监控的环境发生变化时,设备会唤醒并启动上行链路,将传感器读数传输 (Tx) 到 LNS。终端设备随后监听来自 LNS 的响应,在上次启动上行链路传输 (Tx) 之后的指定时间(1 秒和 2 秒)内,它至多打开两个接收 (Rx) 窗口。LNS 可以在任一 Rx 窗口中发送下行链路消息。B 类设备扩展了A 类设备的 Rx 功能,为来自 LNS 的下行链路消息增加预定的 Rx 窗口。这是通过使用由网关传输的时间同步信标来实现的,同步信标指示终端设备周期性地打开 Rx 窗口。C 类设备始终保持接收 (Rx) 窗口开启,进一步扩展了 A 类设备功能。C 类设备不依赖电池供电,除了在发送 (Tx) 上行链路消息时,始终监听下行链路消息。因此,在 LNS 和终端设备之间的通信中,C 类设备的通信延迟最低。 了解有关 LoRaWAN 1.0.3 的详细描述,请参阅此处。
FreeRTOS 的 LoRaWAN 堆栈
FreeRTOS 为嵌入式软件开发者提供了诸多好处。继续阅读。如图 2 所示,FreeRTOS 的 LoRaWAN 堆栈使用 LoRaWAN 管理任务对 LoRaWAN 网络的时序约束进行抽象,从而为应用程序层提供更简单的编程模型。它将处理无线中断和 MAC 层事件的问题与用户应用程序分开。这使得应用程序任务能够顺序执行,具有更模块化。这也有助于定义良好的 Helper API。Helper API 可以在不同的应用程序中复用,例如阻塞 API 可以用于加入网络、发送和接收原始数据。如果设备不支持安全配置, 还可以使用用于配置和获取加入证书的 Helper 函数。对于当前版本,仅支持 A 类设备功能。未来版本将支持 B 类 & C 类设备,同时支持应用程序在不同的操作类型之间切换。堆栈还暴露了 无线硬件抽象层 (HAL),为应用程序提供了直接控制 LoRa 无线模块或调制解调器的能力。HAL 可以用于一个或多个 LoRa 无线电收发器或 LoRa 无线电调制解调器。
FreeRTOS 的 LoRaWAN 堆栈使用 LoRaMac-Node,这是 Semtech 对 LoRaWAN 终端设备协议规范的开源实现。LoRaMac-Node 实现了 LoRaWAN 的 1.0.3 版规范。了解更多有关 LoRaMac-Node 的详细信息,请访问 Semtech 的文档。FreeRTOS 支持 LoRaWAN 的源代码可在此处获得。

开发 LoRaWAN IoT 应用程序
在 LoRaWAN 通信中,上行和下行消息都可以被确认(需要另一方的 ACK)或未经确认(无 ACK)。下图 3a 和 3b 展示了已确认的上行链路和下行链路的时间序列。了解有关详细说明,请参阅 LoRaWAN 1.0.3 规范的第 18 节。


FreeRTOS 堆栈会生成 A 类设备应用程序任务,该任务定期发送上行链路消息 并遵循 LoRaWAN 地区参数定义的链路公平访问策略。上行链路消息在已确认或未确认模式下均可发送。成功启用上行链路后,任务将等待下行链路消息或任何其他来自 MAC 层的事件。 它将帧负载和接收下行链路的端口写入控制台。如果 MAC 层显示有其他下行链路消息挂起或有出于控制目的需要发送上行链路,它会立即发送空上行链路。如果 MAC 层检测到帧丢失,它会触发再入网流程来重置帧计数器。处理完所有下行链路数据和事件后,任务将恢复休眠状态直到下一个传输周期。
MAC 层到应用程序的所有事件都使用轻量级任务通知发送。LoRaWAN 允许将服务器的多个请求捎带到上行链路消息中。这些请求的响应由应用程序接收,以便使用队列。如果应用程序想要在发送上行链路有效负载之前同时对接收到的多个有效负载进行读取,也会使用下行队列。
低功率模式
A 类设备通信的一个重要特征是,应用程序在其生命周期的大部分时间休眠,因而消耗的功率更少。可以使用 FreeRTOS,如此处所述的无滴答时钟空闲特性,为演示项目启用低功率模式。通过为 portSUPPRESS_TICKS_AND_SLEEP (
)宏提供板特定的实现,并将 configUSE_TICKLESS_IDLE
设置为 FreeRTOSConfig.h
中的适当值,即可以启用无滴答时钟模式。启用无滴答模式后,MCU 可以在任务空闲时休眠,但可以通过无线中断或其他定时器事件中断来唤醒。
支持的平台
供货商 | MCU | LoRa Radio Shield | IDE |
Nordic |
|||
STMicroeletronics |
搭建和测试 FreeRTOS LoRaWAN 应用程序所需的网关硬件:
- LoRa 树莓派网关 (请参阅入门访问 The Things Network )
小结
LoRaWAN FreeRTOS Labs 项目提供了 LoRaWAN 节点使用 FreeRTOS 的参考实现,简化利用 LoRa 技术的低功率和远距离 IoT 应用的开发。您可以在 FreeRTOSLoRaWAN 代码存储库中找到 LoRaWAN 管理器的完整应用程序源代码和详细的 API 引用。我们支持您为这项令人振奋的技术做出贡献,如扩展受支持平台目录和丰富应用示例。
FreeRTOS 基于 MIT 授权,是一款适用于微控制器的开源实时操作系统,让您可以轻松地编写、部署、保护、连接和管理低功耗的小型边缘设备。您可以从 FreeRTOS.org 或 GitHub (https://github.com/freertos/freertos) 上下载源代码,并可以在 FreeRTOS 用户指南上找到更多关于 FreeRTOS、它的库和演示的信息。
作者:
- Gaurav Gupta(资深合作伙伴解决方案架构师 - AWS IoT )
- Paul Butler(资深合作伙伴解决方案架构师 - AWS IoT )
- Ravishankar Bhagavandas(软件开发工程师 - AWS IoT )