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按键,复位开发板