注意:FreeRTOS LoRaWAN 演示项目位于 FreeRTOS-Labs。 It is fully functional, but undergoing optimizations or refactoring to improve memory usage, modularity, documentation, demo usability, or test coverage. 它与主 Labs Project 下载分开,可以在 GitHub 上的
Lab-Project-FreeRTOS-LoRaWAN 存储库获取。
LoRaWAN API 引用
以下部分提供了 FreeRTOS 中 LoRaWAN API 的详细描述和使用示例。
设置
LoRaWAN_Init() 可用于初始化区域的 LoRaWAN 堆栈。它以区域参数作为输入,并使用该区域的默认参数初始化 LoRaMAC 堆栈。此 API 还会创建后台 LoRaMAC 任务。该任务会循环处理来自无线和 MAC 层的事件。此 API 不是可重入或线程安全的。
LoRaMacStatus_t status;
status = LoRaWAN_Init( LORAMAC_REGION_US915 );
if( status == LORAMAC_STATUS_OK )
{
}
else
{
}
配置 LoRaWAN 的网络参数
可以使用以下 API 配置 LoRAWAN 的网络参数。
LoRaWAN_SetAdaptiveDataRate()
可以打开或关闭终端设备的自适应数据速率。LoRaWAN 初始化后,可以随时调用此 API。启用自适应数据速率后,网络服务器会基于终端设备的位置和其他因素来为终端设备计算优化的数据速率。
API LoRaWAN_GetNetworkParams()
和 LoRaWAN_SetNetworkParams()
可修改设备的第二接收窗口和 TX 功率的其他网络参数,诸如信道频率和数据速率。如果正在使用 Over the Air 激活 (OTAA) ,则应启动连接以使新参数生效。
激活
有两种类型的激活受支持:Over The Air 激活 (OTAA) 或个性化激活 (ABP)。
LoRaWAN_Join()
API 用于 OTAA。
示例:
LoRaMacStatus_t status;
status = LoRaWAN_Join();
if( status == LORAMAC_STATUS_OK )
{
}
else
{
}
此 API 是一个阻塞调用,直到加入握手完成或用尽所有重试次数。
Over the Air 激活所需的凭据应使用下面的 getter 函数提供,或使用安全元素预设。
void getDeviceEUI( uint8_t * param )
{
}
void getJoinEUI( uint8_t * param )
{
}
void getAppKey( uint8_t * param )
{
}
此 API 在配置的次数内尝试加入。LoRaWAN 规范建议,在不同频带下以随机间隔进行重试。可以使用 demos/classA/Nordic_NRF52/config/LoRaWANConfig.h
中的以下配置来调整重试次数和重试间隔:
#define lorawanConfigMAX_JOIN_ATTEMPTS ( 1000 )
#define lorawanConfigJOIN_RETRY_INTERVAL_MS ( 2000 )
#define lorawanConfigMAX_JITTER_MS ( 500 )
(2) LoRaWAN_ActivateByPersonalization()
API 可使用 ABP 方法激活设备。
LoRaMacStatus_t status;
status = LoRaWAN_ActivateByPersonalization();
if( status == LORAMAC_STATUS_OK )
{
}
else
{
}
在 ABP 方法中,终端设备使用其预设的凭据,而不与网络服务器进行握手。可以使用以下 getter 函数提供 ABP 的凭据:
void getDeviceEUI( uint8_t * param )
{
}
void getJoinEUI( uint8_t * param )
{
}
uint32_t getDeviceAddress( void )
{
}
void getGetAppSessionKey( uint8_t * param )
{
}
void getGetNwkSessionKey( uint8_t * param )
{
发送上行数据
LoRaWAN_Send()
API 可发送上行链路数据到 LoRa 网络服务器。上行链路数据可以是确认的或未确认的。对于确认的消息,API 将阻塞,直到收到网络服务器的确认。此 API 还会以不同的数据速率,按配置的次数执行重试,直到收到确认。对于未经确认的消息,此 API 在无线发送消息后立即返回。
LoRaWANMessage_t uplink;
uplink.port = LORAWAN_APP_PORT;
memcpy( uplink.data, &data, bytesToSend );
uplink.length = bytesToSend;
uplink.dataRate = dataRateToSend;
status = LoRaWAN_Send( &uplink, IS_CONFIRMED );
if( status == LORAMAC_STATUS_OK )
{
}
else
{
}
接收下行数据
LoRaWAN_Receive()
API 可以在指定时间内阻塞,直到接收到数据。通过设置以毫秒为单位的超时参数,应用程序可以等待下行链路数据任意久。例如,对于 A 类用例,应用程序在发送上行链路消息之后,等待接收窗口的持续时间。根据应用需求,可以通过 demos/classA/Nordic_NRF52/config/LoRaWANConfig.h
中的 lorawanConfigDOWNLINK_QUEUE_SIZE
配置,调整下行队列大小。
LoRaWANMessage_t downlink;
status = LoRaWAN_Receive( &downlink, CLASSA_RECEIVE_WINDOW_DURATION_MS );
if( status == pdTRUE )
{
decodeData( &downlink.data, downlink.length; downlink.port );
}
else
{
}
LoRaWAN 事件轮询
LoRaWAN_PollEvent()
API 可轮询从 LoRaWAN 网络接收的任何事件。网络支持在应用程序层接收以下事件。
typedef enum LoRaWANEventType
{
LORAWAN_EVENT_UNKNOWN = 0,
LORAWAN_EVENT_DOWNLINK_PENDING,
LORAWAN_EVENT_TOO_MANY_FRAME_LOSS,
LORAWAN_EVENT_DEVICE_TIME_UPDATED,
LORAWAN_EVENT_LINK_CHECK_REPLY
Applications can poll for any events by optionally blocking for them and then take appropriate actions. The example below
应用程序可以通过阻塞事件对它们进行轮询,然后采取适当措施。下面的示例显示了应用程序针对两个此类事件的行为。
BaseType_t status;
LoRaWANEventInfo_t event;
for (;;)
{
status = LoRaWAN_PollEvent( &event, 0 );
if( status == pdTRUE )
{
switch( event.type)
{
case LORAWAN_EVENT_DOWNLINK_PENDING:
prvFetchDownlinkPacket();
break;
case LORAWAN_EVENT_TOO_MANY_FRAME_LOSS:
break;
....
....
default:
break;
}
}
else
{
break;
}
}
清理
LoRaWAN_Cleanup()
API 可停止和初始化 LoRaMac 堆栈,并删除 LoRaMac 任务并释放相关资源。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.