1. 简介

本文介绍如何使用YoC的AT组件,快速实现模组的开发,YoC已经提供了socket指令及上云指令,主控可以通过串口与CB2201开发板进行通讯。

2. 应用开发

本章节介绍了数据上云例程的开发流程,包括应用初始化、网络初始化、模拟传感器、上云通道初及其相关事件的处理。

2.1 应用初始化

应用入口函数为main,主要实现了板级的初始化及系统事件、通道事件的订阅。

void main()
{
    board_yoc_init();
    /* 订阅网络连接事件 */
    event_subscribe(EVENT_NETMGR_GOT_IP, user_local_event_cb, NULL);
    event_subscribe(EVENT_NETMGR_NET_DISCON, user_local_event_cb, NULL);

    /* 订阅IoT事件 */
    event_subscribe(EVENT_IOT_CONNECT_SUCCESS, user_local_event_cb, NULL);
    event_subscribe(EVENT_IOT_DISCONNECTED, user_local_event_cb, NULL);
    event_subscribe(EVENT_IOT_PUSH_SUCCESS, user_local_event_cb, NULL);
    event_subscribe(EVENT_IOT_PUSH_FAILED, user_local_event_cb, NULL);
    event_subscribe(EVENT_IOT_CONNECT_FAILED, user_local_event_cb, NULL);
}

2.2 板级初始化

板级初始化的入口为board_yoc_init,主要完成硬件初始化以及OS组件的初始化,由app_main函数调用。

void board_yoc_init(void)
{
    /* 初始化console驱动 */
#ifdef CONSOLE_ID
    console_init(CONSOLE_ID, 115200, 128);
#else
    console_init(0, 115200, 128);
#endif

    /* 初始化出厂配置Flash分区 */
    nvram_init("factory");

    /* 创建CLI任务 */
    utask_t *task = utask_new("at&cli", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);

    /* AT服务的初始化 */
#if defined(CONFIG_AT) && CONFIG_AT
    at_server_init(task);
#endif

    /* CLI初始化及系统命令注册 */
    board_cli_init(task);

    /* 网络驱动初始化 */
    network_init();
}

2.3 AT服务的初始化

AT服务的初始化入口为 at_server_init,主要完成AT服务任务的创建、AT命令的注册,由board_yoc_init函数调用。

void at_server_init(utask_t *task)
{
    /* 串口参数初始化 */
    uart_config_t config;
    uart_config_default(&config);

    /* AT任务的创建 */
    if (task == NULL)
        task = utask_new("at_srv", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);

    if (task) {
        /* AT服务绑定串口 */
        atserver_init(task, "uart1", &config);
        atserver_set_output_terminator("");

        /* 注册AT指令,at_cmd为指令列表 */
        atserver_add_command(at_cmd);
    }
    at_net_event_sub_init();
}

2.4 网络驱动初始化

网络初始化的入口为network_init,主要完成网络设备和网络管理模块的初始化,由board_yoc_init函数调用。

static void network_init(void)
{
    esp_wifi_param_t esp_param;

    /* 与ESP8266模组通讯的串口参数配置 */
    esp_param.device_name    = "uart2";
    esp_param.baud           = 115200;
    esp_param.buf_size       = 4096;
    esp_param.enable_flowctl = 0; 

    /* 复位引脚配置 */
    esp_param.reset_pin      = WIFI_ESP8266_RESET;
    esp_param.smartcfg_pin   = WIFI_ESP8266_SMARTCFG;

    /* 注册esp8266驱动 */
    wifi_esp8266_register(NULL, &esp_param);

    /* 初始化网络管理模块 */
    app_netmgr_hdl = netmgr_dev_wifi_init();
    if (app_netmgr_hdl) {
        netmgr_service_init(NULL);
        netmgr_start(app_netmgr_hdl);
    }
}

2.3 AT指令实现

  • 指令数组

at_cmd.c定义了变量at_cmd,该数组变量定义系统所有支持的命令,系统默认已经初始化了所有支持的指令,用户可以选择和扩展。

/* AT指令结构体声明 */
typedef struct atserver_cmd {
    const char        *cmd;
    const cmd_callback cb;
} atserver_cmd_t;

/* 定义指令及其对应的处理函数 */
#define AT              {"AT", at_cmd_at}
#define AT_HELP         {"AT+HELP", at_cmd_help}
#define AT_CGMR         {"AT+CGMR", at_cmd_cgmr}
#define AT_FWVER        {"AT+FWVER", at_cmd_fwver}
#define AT_SYSTIME      {"AT+SYSTIME", at_cmd_systime}
...
#define AT_ECHO         {"AT+ECHO", at_cmd_echo}

/* 定义指令集数组 */
const atserver_cmd_t at_cmd[] = {
    AT,
    AT_HELP,
    AT_CGMR,
    AT_FWVER,
    AT_SYSTIME,
    ...
    AT_ECHO,
  • 指令的实现,以AT+ECHO回显查询和配置指令为例
void at_cmd_event_and_echo(char *cmd, int type, char *data, uint8_t *flag)
{
    if (type == READ_CMD) {
        /* 如果是 AT+ECHO?,表示查询当前配置,根据当前状态返回ON/OFF结果 */
        AT_BACK_RET_OK(cmd, *flag ? "ON" : "OFF");
    } else if (type == WRITE_CMD) {
        /* 如果是 AT+ECHO=ON|OFF,表示设置状态,根据配置值保存标记 */
        if (strncmp((const char *)data, "ON", 2) == 0 || strncmp((const char *)data, "OFF", 3) == 0) {
            *flag = (data[1] == 'N') ? 1 : 0;
            AT_BACK_OK();
        } else {
            /* 错误参数,返回错误信息 */
            AT_BACK_RET_ERR(cmd, AT_ERR);
        }
    }
}

void at_cmd_echo(char *cmd, int type, char *data)
{
    /* 获取当前回显状态 */
    uint8_t echo_flag = atserver_get_echo();

    /* 回显指令处理 */
    at_cmd_event_and_echo(cmd, type, data, &echo_flag);

    /* 设置当前回显状态 */
    atserver_set_echo(echo_flag);
}

3. 例程运行

例程默认配置了网络和上云指令,运行前需要对开发板及上云参数进行配置准备,具体见阿里云MQTT传感数据上云例程

  • 烧写编译好的例程
  • 连接串口调试工具,AT串口对应是TX1,RX1引脚,配置为 波特率: 115200,数据位: 8,校验位: None,停止位: 1,流控: None
  • 按RESET按键,复位开发板

results matching ""

    No results matching ""