当前位置: 首页 > 文档资料 > YoC 编程基础 >

LoRaWAN传感数据上云例程开发指南

优质
小牛编辑
113浏览
2023-12-01

本文介绍传感数据上云的功能演示。通过本文的指引,开发者使用YoC SDK将获取到的RS485传感数据传送至阿里云物联网络管理平台。阿里云物联网络管理平台(LinkWAN),符合LoRaWAN协议,支持网关管理、凭证管理、终端管理、数据安全等。用户可使用平台维护网络组网,也能与阿里云物联网平台搭配,组合成解决方案。

该例程适用于CB6502M开发板。

流程图

如上图所示,使用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协议栈的数据发送和接收事件,应用程序需要对这些事件进行相应的处理:

  • 数据发送成功或失败事件
  • 数据接收事件 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.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.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平台的数据展示如下图 RS485子板连接