LoRaWAN传感数据上云例程
1. 概述
本文介绍传感数据上云的功能演示。通过本文的指引,开发者使用YoC SDK将获取到的RS485传感数据传送至阿里云物联网络管理平台。阿里云物联网络管理平台(LinkWAN),符合LoRaWAN协议,支持网关管理、凭证管理、终端管理、数据安全等。用户可使用平台维护网络组网,也能与阿里云物联网平台搭配,组合成解决方案。
2. 开发板支持
该例程适用于CB6502M开发板。
3. 工作流程
如上图所示,使用YoC SDK来实现传感数据上云,APP需要实现:
- 应用初始化
- LoRaWAN协议栈初始化、数据的发送和接收
3.1. 应用初始化
应用入口函数app_main(),主要实现如下功能:
- 创建APP Task
- AT Server初始化
代码分析:
int app_main(int argc, char *argv[])
{
......
/* 板级初始化,各业务模块初始化 */
board_yoc_init();
......
/* 创建APP Task,用于定时轮询RS485从设备,并将数据发送至LinKWAN平台 */
aos_task_new_ext(&task_handle, "app_task", app_task_entry,
NULL, 2048, AOS_DEFAULT_APP_PRI);
......
/* AT Server初始化,用于解析AT命令 */
at_server_init(NULL);
return;
}
3.2. APP Task
APP Task主要实现了:
- 创建LoRaWAN协议栈任务,并注册协议栈事件处理函数
- 数据发送至LinkWAN平台
代码分析:
/* LoRaWAN APP data size is limited, max size is 51 */
static uint8_t report_data[] = {
0x00,0x00,0x00,0x00, /* first 4 bytes means data length */
0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x39,0xaa,0xbb,
};
void lorawan_data_push(void)
{
......
/* 准备数据,数据格式 length(4 Bytes) + data */
appdata.buffsize = data_len;
bd_data_len = reverse_uint32((uint8_t *)&data_len);
memcpy(report_data, &bd_data_len, sizeof(uint32_t));
appdata.buff = report_data;
/* 发送端口号设置为10 */
appdata.port = 10;
/* 数据发送 */
ret = lorawan_send(&appdata);
if (ret != LORAWAN_API_EVENT_INFO_STATUS_OK) {
LOGE(TAG, "Fail to send, Err %d.\n", ret);
}
return;
}
void app_task_entry(void *arg)
{
......
/* create lorawan task */
lorawan_task_entry();
/* join */
ret = lorawan_open();
......
while (1) {
......
/* data push */
lorawan_data_push();
......
/* 休眠 */
if (time_enter > 0) {
aos_msleep(time_enter);
}
}
}
3.3. LoRaWAN协议栈事件
LoRaWAN API通过YoC SDK中的uService服务,封装了LoRaWAN协议栈的数据发送和接收事件,应用程序需要对这些事件进行相应的处理:
- 数据发送成功或失败事件
- 数据接收事件
代码分析:
void lorawan_api_handle_event(uint32_t event_id, const void *param, void *context)
{
lorawan_event_param_t *event_param = (lorawan_event_param_t *)param;
int len = 0;
switch (event_id) {
case EVENT_LORAWAN_SEND:
if (event_param == NULL) {
return;
}
/* 数据发送成功或失败状态,
LORAWAN_API_EVENT_INFO_STATUS_OK: 成功
其他: 失败
*/
if (event_param->status == LORAWAN_API_EVENT_INFO_STATUS_OK)
......
else
......
aos_free((void *)param);
/* 此时消息类型为unconfirmed,没有回应数据,通知APP数据发送完成 */
if (sendparams.msgtype == LORAWAN_UNCONFIRMED_MSG) {
/* For Sync model, we use semphore to notify app */
if (g_lorawan_tx_sem.hdl != NULL) {
/* notify tx done */
aos_sem_signal(&g_lorawan_tx_sem);
}
}
break;
case EVENT_LORAWAN_RECV:
if (event_param == NULL) {
return;
}
/* 数据接收,
event_param->BufferSize: 接收数据的size
event_param->Buffer: 接收数据存放的地址
其他: 失败
*/
......
aos_free((void *)param);
/* 此时消息类型为confirmed,RX窗口接收数据完成,通知APP数据发送完成 */
if (sendparams.msgtype == LORAWAN_CONFIRMED_MSG) {
/* For Sync model, we use semphore to notify app */
if (g_lorawan_tx_sem.hdl != NULL) {
/* notify tx done */
aos_sem_signal(&g_lorawan_tx_sem);
}
}
break;
default:
break;
}
}
void lorawan_task_entry(void)
{
/* 订阅LoRaWAN事件 */
event_subscribe(EVENT_LORAWAN_SEND, lorawan_api_handle_event, NULL);
event_subscribe(EVENT_LORAWAN_RECV, lorawan_api_handle_event, NULL);
if (lora_task_handle.hdl == NULL) {
lora_system_init(LORA_MODE_LORAWAN);
/* 创建LoRaWAN任务 */
aos_task_new_ext(&lora_task_handle, "lorawan_task", lorawan_system_run,
NULL, 2048, AOS_DEFAULT_APP_PRI);
}
}
4. 设备入网
未使用过的模组,第一次上电需要设置节点入网参数,用户可登录阿里云物联网络平台申请。
4.1. 阿里云物联网络平台操作
4.1.1. 网关资源申请
4.1.2. 节点资源申请
4.1.3. 网关绑定
4.2. 入网参数烧录
将申请到的DevEUI、JoinEUI、AppKEY信息复制下来,通过设备AT串口输入如下指令即可完成设备入网信息的烧录。烧录完成后,需重启生效。
设置三元组信息
AT+CDEVEUI=DevEUI
AT+CAPPEUI=JoinEUI
AT+CAPPKEY=AppKey
设置同频异频信息,示例中设置的是同频网关,因此设备需配置为同频。
AT+CULDLMODE=1
保存设置
AT+CSAVE
重启设备
AT+IREBOOT=0
4.3. 节点调试
节点入网参数需要通过AT命令通过AT串口烧写至设备,重启生效后,即可开始设备调试。
Join参数配置
节点下行参数配置
下行业务指令
下行MAC指令
5. 数据展示
5.1. 设备调试信息
CB6502M开发板将通过打印口输出入网及数据发送过程。
- 连接打印串口、AT串口和调试口
- 打印串口以及AT串口的串口调试工具配置为: 波特率: 115200, 数据位: 8, 校验位: None, 停止位: 1, 流控: None
- 使用集成开发环境CDK编译工程文件,然后下载至CB6502M开发板
- 按RESET按键,复位开发板,串口将打印如下信息
[ 0.372686][I][init ]OS version: 7.0.2
[ 0.402091][D][lorawan_upload_demo]Enter APP mode
[0S110]Start Join 1,8,3
[0S110]OTAA
[0S110]DevEui= D8-96-E0-FF-FF-01-1A-D6
[0S110]AppEui= D8-96-E0-E0-00-00-7C-3D
[0S120]AppKey= 4A-8C-24-AF-16-28-4B-70-89-01-B6-D1-21-6C-28-E4
[0S120]class type :class_A
[0S120]freq mode :inter
[0S130]scan chn mask :0xff00
[0S130]join method :default join
[0S130]autojoin:1, joininterval:8, jointrails: 3
- 入网成功打印
[7S170]Current Join param - Datarate: 5
[7S170]g_next_tx_flag:1 g_rejoin_flag:0
[15S170]Current Join param - Datarate: 5
[15S170]g_next_tx_flag:1 g_rejoin_flag:1
[15S180]TX freq:473300000
[15S180]Start to Join, method 1
[15S240]radio on dio irq : 1
[15S240]PHY txDone
[20S250]radio on dio irq : 4
[20S260]radio on dio irq : 10
[20S290]radio on dio irq : 2
[20S290]PHY rxDone
[20S320]lora_mlmeconfirm status: OK
- 数据发送成功打印
[21S180]start send frame ...
[21S180]Send frame confirmed pkg port:10 NbTrails:3
[21S190]TX freq:473300000
[21S260]radio on dio irq : 1
[21S260]PHY txDone
[22S260]radio on dio irq : 4
[22S280]radio on dio irq : 10
[22S300]radio on dio irq : 2
[22S300]PHY rxDone
[22S330]lora_mcpsconfirm status: OK
[22S330]#= U/L FRAME 1 =# Class A, Channel 15, TxDR 5, port 10, data size 14
[22S330]lora_mcpsindication status: OK
[22S330]#= D/L FRAME 1 =# RxWin 1, port 0, data size 0, rssi -50, snr 14, RxDR 5
[ 22.730901][D][lorawan_api]OK+SENT:01
[ 22.734931][D][lorawan_api]OK+RECV:02,00,00
5.2. 云平台数据展示
LinkWAN平台的数据展示如下图