【平头哥RVB2601开发板试用体验】AT 解析器和通过w800 AT命令接入阿里云生活物联网平台

简介: RISC-V RVB2601 Yoc 实现和测试验证阿里云平台接入的等相关功能,同时去了解YoC中网络设备和AT解析器框架。

作者 | niu


在RVB2601开发板上,CH2601主芯片通过SPI接口和W800 WIFi/BLE模块通信,W800芯片在此接口上提供AT命令的方式供主芯片使用W800的功能1.png

根据《W800模组AT指令集》中的描述,W800芯片中实现了WiFi配网、WiFi连接、TCP连接、阿里云飞燕生活物联网平台接入等功能。


2.png

接口详细说明

初始化一个AT指令解析器

atparser_uservice_t *atparser_init(utask_t *task, const char *name, uart_config_t *config)


根据指定的微服务任务,串口名以及串口配置信息创建一个AT 指令解析器,成功则返回atparser_uservice_t指针,失败返回NULL


参数:

  • task:微服务任务
  • name: 串口名
  • config: 串口配置信息


返回值:

成功则返回atparser_uservice_t指针,失败返回NULL


初始化一个用户自定义的AT指令解析器

atparser_uservice_t *atparser_channel_init(utask_t *task, const char *name, void *config, at_channel_t *channel);


根据指定的微服务任务,串口名以及串口配置信息创建一个AT 指令解析器,成功则返回atparser_uservice_t指针,失败返回NULL


参数:

  • task:微服务任务
  • name: 设备名
  • config: 设备配置信息
  • channel:at指令解析器的channel


返回值:

成功则返回atparser_uservice_t指针,失败返回NULL


at_channel是具体执行AT命令内容收发的通道,比如串口、SPI接口等,RVB2601开发板上使用SPI接口;atparse负责对命令内容的解析和格式化拼装。


带外数据处理函数的格式

typedef int (*oob_callback)(atparser_uservice_t *at, void *pive, oob_data_t *oob_data);


用户根据传入的数据,做相关的处理,若处理完成则返回0;若处理未完成则返回-1


参数:

  • at: AT 指令解析器
  • pive:用户自定义数据
  • oob_data: 带外数据结构体


返回值:

  • 0表示处理完成并退出本次OOB,-1表示处理未完成,需要继续执行OOB


创建一个带外数据服务

int atparser_oob_create(atparser_uservice_t *at, const char *prefix, oob_callback cb, void *context);


根据指定的AT 指令解析器,带外数据匹配字符串,带外数据处理函数,以及用户自定义的上下文创建一个带外数据处理服务,成功则返回0,失败则返回负值


代码实现

cli中注册一个命令去触发连接云等动作,在获取到IP后去给w800发AT命令,开始连接云。

//应用层,添加cli命令
extern int set_aliyun_key( );
extern int set_aliyun_smartconf( );
extern int cloud_connect();
static void do_yun_cmd(char *wbuf, int wbuf_len, int argc, char **argv)
{
    if (argc > 1) {
        if (0 == strcmp(argv[1], "config")) {
            printf("do smart confg\r\n");
            set_aliyun_smartconf( );
            return;
        } else if (0 == strcmp(argv[1], "conn")) {
            printf("do cloud_connect\r\n");
            cloud_connect();
            return;
        } else if (0 == strcmp(argv[1], "set")) {
            printf("do set_aliyun_key\r\n");
            set_aliyun_key( );
            return;
        }
    }
}
void cli_reg_cmd_user(void)
{
    static const struct cli_command cmd_yun = {
        "yun",
        "yun comand",
        do_yun_cmd,
    };
    aos_cli_register_command(&cmd_yun);
}


W800的AT解析器实现中增加对云连接状态和属性设置下发的处理

extern at_channel_t spi_channel;
int w800_module_init(utask_t *task, w800_wifi_param_t *param)
{
    if (w800_module_inited) {
        return 0;
    }
    if (task == NULL) {
        task = utask_new("w800", 7 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI + 4);
    }
    if (task == NULL) {
        return -1;
    }
    if (param->reset_pin) {
        csi_gpio_pin_init(&g_reset_pin, param->reset_pin);
        csi_gpio_pin_mode(&g_reset_pin,GPIO_MODE_PULLUP);
        csi_gpio_pin_dir(&g_reset_pin,GPIO_DIRECTION_OUTPUT);
        csi_gpio_pin_write(&g_reset_pin, GPIO_PIN_LOW);
        aos_msleep(200);
        csi_gpio_pin_write(&g_reset_pin, GPIO_PIN_HIGH);
        aos_msleep(1000);
        LOGD(TAG, "hard reset");
    }
    g_atparser_uservice_t = atparser_channel_init(task, NULL, param, &spi_channel);
    aos_mutex_new(&g_cmd_mutex);
    atparser_debug_control(g_atparser_uservice_t, 1);
    atparser_oob_create(g_atparser_uservice_t, "2,CLOSED", _closed2_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "1,CLOSED", _closed1_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "0,CLOSED", _closed0_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=NET,LINK_UP", _gotip_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=NET,LINK_DOWN", _disconnect_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=RECV,", _recv_data_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=DISCONNECT,0", _closed0_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=DISCONNECT,1", _closed1_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+EVENT=DISCONNECT,2", _closed2_handler, NULL);
    atparser_oob_create(g_atparser_uservice_t, "+IDMSTA:", cloud_connsta_handler, NULL);   //连接状态OOB注册
    atparser_oob_create(g_atparser_uservice_t, "+IDMPS:", cloud_recv_handler, NULL);       //属性设置OOB注册
    w800_module_inited = 1;
    return 0;
}
/* 接收到云端下发的属性设置 */
/* oob_data->buf和oob_data->len为AT通道上接收到的"+IDMPS:"之后的内容和长度 */
static int cloud_recv_handler(atparser_uservice_t *at, void *priv, oob_data_t *oob_data)
{
    //+IDMPS:<device_id>,<msg_len>,<message>  OK
    int id = 0;
    int len = 0;
    char data[128] = {0};
    LOGI(TAG,"%s(%d)",oob_data->buf,oob_data->len);
     char *str = strchr(oob_data->buf, ':');
        if (str  != NULL) {
            sscanf(oob_data->buf, "%d,%d,%s\r\n", &id, &len, data);
            LOGI(TAG,"==>cloud_recv %d(%d):%s\r\n",id, len, data);
            oob_data->used_len += (str - oob_data->buf+1);
        }
    /* recv data is not enough need recv more */
    return 0;
}
/*云连接状态上报OOB处理*/
static int cloud_connsta_handler(atparser_uservice_t *at, void *priv, oob_data_t *oob_data)
{
    LOGI(TAG,"==>cloud_conn: %s(%d)",oob_data->buf,oob_data->len);
    /* recv data is not enough need recv more */
    return 0;
}


3.png

4.png


实现云连接等功能的AT命令收发

int cloud_connect()
{
    int ret = -1;
    g_net_status = NET_STATUS_READY;
    aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER);
    atparser_set_timeout(g_atparser_uservice_t, 30 * 1000);
    atparser_clr_buf(g_atparser_uservice_t);
    if (atparser_send(g_atparser_uservice_t, "AT+IDMCON") == 0) {
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) {
            ret = 0;
            LOGI(TAG,"===>IDMCON OK");
        }
    }
    atparser_set_timeout(g_atparser_uservice_t, 8 * 1000);
    atparser_cmd_exit(g_atparser_uservice_t);
    aos_mutex_unlock(&g_cmd_mutex);
    return ret;
}
int set_aliyun_key( )
{
     int ret = -1;
    g_net_status = NET_STATUS_READY;
    aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER);
    atparser_set_timeout(g_atparser_uservice_t, 30 * 1000);
    atparser_clr_buf(g_atparser_uservice_t);
    if (atparser_send(g_atparser_uservice_t, "AT+IDMAU=\"%s\",\"%s\",\"%s\",\"%s\"", PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, PRODUCT_SECRET) == 0) {
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) {
            ret = 0;
            LOGI(TAG,"===>IDMAU OK");
        }
    }
    atparser_set_timeout(g_atparser_uservice_t, 30 * 1000);
    atparser_clr_buf(g_atparser_uservice_t);
    if (atparser_send(g_atparser_uservice_t, "AT+IDMPID=%ld", PRODUCT_ID) == 0) {
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) {
            ret = 0;
            LOGI(TAG,"===>IDMPID OK");
        }
    }
    atparser_set_timeout(g_atparser_uservice_t, 8 * 1000);
    atparser_cmd_exit(g_atparser_uservice_t);
    aos_mutex_unlock(&g_cmd_mutex);
    return ret;
}
int set_aliyun_smartconf( )
{
    int ret = -1;
    g_net_status = NET_STATUS_READY;
    aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER);
    atparser_set_timeout(g_atparser_uservice_t, 30 * 1000);
    atparser_clr_buf(g_atparser_uservice_t);
    if (atparser_send(g_atparser_uservice_t, "AT+IDMCLS") == 0) {
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) {
            ret = 0;
            LOGI(TAG,"===>IDMCLS OK");
        }
    }
    atparser_set_timeout(g_atparser_uservice_t, 30 * 1000);
    atparser_clr_buf(g_atparser_uservice_t);
    if (atparser_send(g_atparser_uservice_t, "AT+IWSSTART=0") == 0) {
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) {
            ret = 0;
            LOGI(TAG,"===>IWSSTART OK");
        }
    }
    atparser_set_timeout(g_atparser_uservice_t, 8 * 1000);
    atparser_cmd_exit(g_atparser_uservice_t);
    aos_mutex_unlock(&g_cmd_mutex);
    return ret;
}


阿里云物联网平台创建产品并定义功能

5.png


为w800模块配网和配置五元组

  • 手机app配网没有调通,后续再调,先用手动配网;
  • 调用set_aliyun_key( )配置五元组后,重启,w800将会自动连接路由器;
  • 在连上路由器获取到IP后,调用cloud_connect(),待手动连接状态OOB回调时,“+IDMSTA:2“”说明已经连上阿里云了,在阿里云后台可以看到设备已在线;

6.png


通过在阿里云后台的设备调试页面,可进行在线调试,对设备属性进行设置,开发板上将收到对应的属性值,如下图:

7.png


到此,阿里云接入和属性设置功能验证通过了,后续将继续完善功能,基于在阿里云上定义的产品功能,做进一步的开发实现更多的应用功能。


本文源自:平头哥芯片开放社区

欢迎关注公众号:芯片开放社区(ID:OCC_THEAD),查看更多应用实战文章。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
2月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
9天前
|
运维 监控 网络协议
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
32 11
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
|
23天前
|
数据采集 监控 网络协议
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
85 22
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
|
2月前
|
运维 API 开发工具
【阿里云】操作系统控制台操作体验与性能评测全解析
操作系统控制台是现代云计算环境中进行系统管理和运维的重要工具,提供系统概览、诊断、观测、管理等功能,支持API、SDK、CLI等管理方式。通过创建角色、系统配置和组件安装等操作,用户可以高效管理云端资源,提升操作系统的使用效率和稳定性。尤其适合需要高效管理操作系统的用户及学习云计算、网络管理的学生。建议增强自定义功能、优化性能报告和完善文档支持,以进一步提升用户体验。
116 21
【阿里云】操作系统控制台操作体验与性能评测全解析
|
2月前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
187 7
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
DeepSeek R1 是一款先进的大规模深度学习模型,专为自然语言处理等复杂任务设计。它具备高效的架构、强大的泛化能力和优化的参数管理,适用于文本生成、智能问答、代码生成和数据分析等领域。阿里云平台提供了高性能计算资源、合规与数据安全、低延迟覆盖和成本效益等优势,支持用户便捷部署和调用 DeepSeek R1 模型,确保快速响应和稳定服务。通过阿里云百炼模型服务,用户可以轻松体验满血版 DeepSeek R1,并享受免费试用和灵活的API调用方式。
306 12
|
3月前
|
云安全 人工智能 安全
阿里云网络安全体系解析:如何构建数字时代的"安全盾牌"
在数字经济时代,阿里云作为亚太地区最大的云服务提供商,构建了行业领先的网络安全体系。本文解析其网络安全架构的三大核心维度:基础架构安全、核心技术防护和安全管理体系。通过技术创新与体系化防御,阿里云为企业数字化转型提供坚实的安全屏障,确保数据安全与业务连续性。案例显示,某金融客户借助阿里云成功拦截3200万次攻击,降低运维成本40%,响应时间缩短至8分钟。未来,阿里云将继续推进自适应安全架构,助力企业提升核心竞争力。
|
3月前
|
存储 人工智能 并行计算
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
|
3月前
|
存储 弹性计算 人工智能
阿里云发票申请图文教程及常见问题解析
在购买完阿里云服务器或者其他云产品之后,如何申请发票成为了许多用户关注的焦点。尤其是对于初次购买阿里云服务器的用户来说,发票申请流程可能并不熟悉。本文将为大家详细介绍阿里云服务器购买之后如何申请发票,以及申请过程中可能遇到的常见问题,帮助大家轻松完成发票申请。
|
3月前
|
弹性计算 运维 网络安全
阿里云轻量应用服务器产品解析与搭建个人博客网站教程参考
轻量应用服务器(Simple Application Server)作为阿里云面向单机应用场景推出的云服务器产品,以其一键部署、一站式管理、高性价比等特性,深受个人开发者、中小企业及入门级用户的喜爱。本文将全面解析阿里云轻量应用服务器的产品优势、应用场景、使用须知,以及使用轻量应用服务器搭建个人博客网站的详细教程,帮助用户更好地了解和使用这一产品。

相关产品

  • 物联网平台
  • 推荐镜像

    更多