• 欢迎大家分享资料!前往留言板评论即可!

17、RDA8910(4GCAT1)CSDK二次开发:一个简易的AT框架—可以实现自定义AT指令了

合宙 模组资料网 8个月前 (05-15) 169次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

目录

点击这里查看所有博文

  本系列博客所述资料均来自合宙官方,并不是本人原创(只有博客是自己写的),csdk只是得到了口头的允许公开授权。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。

  本系列博客基于紫光展锐的RDA8910 LTE Cat 1 bis芯片平台开发。理论上适用于合宙的Air720U、Air724U、广和通L610以及安信可的cat-01模块。

  各个厂家的部分配置文件可能不一样,也许会导致设备出现奇怪的问题,其他的模块我也不确定能不能用,自行测试。但是有一点编译下载和监视流程基本一样,可供参考。

  先不管支不支持,如果你用的模块是是紫光展锐的RDA8910,那都不妨一试,也许会有意外收获(也有可能变砖,慎重!!!)。

  我使用的是Air724UG开发板,如果在其他模块上不能用,那也不要强怼,也许是开发包不兼容吧。这里的代码是没有问题的。例程仅供参考!

一、前言

  很累啊,最近太忙了。一直没时间折腾CSDK,回头一看足足有三个月没写新东西了。太长时间不写感觉都有点手生,拿起键盘都不知道怎么才能下手。

  这几天在CSDK上又折腾了下,搞了一个简易的AT引擎。合宙的CSDK默认也是支持一部分AT指令的,不是全部都支持,具体哪些不支持我也不是很清楚。

  除了合宙现有的一些AT指令外,有的小伙伴可能还希望在AT版本上面实现其他更复杂的操作,实现自定义的一些功能。而一般平台商提供的AT指令都是通用的,一般不会提供定制功能。直接让模块厂家去添加特定的AT指令可能性不大。甚至可以说基本不可能。

  比如有的小伙伴可能想要AT指令能够支持连接阿里云、腾讯云、百度云等等。而这些云平台一般都会有自己的鉴权算法,这些算法五花八门,并且还有可能会经常变动。合宙标准的AT指令也仅仅是提供了MQTT的连接命令,并没有针对这些平台提供具体的连接指令。这一类指令还好一点,受众挺广。以后可能会有,至于是什么时候谁都不知道,至少现在是没有的。

  现在没有的情况下,需要使用自定义的AT指令进行交互怎么办?
17、RDA8910(4GCAT1)CSDK二次开发:一个简易的AT框架---可以实现自定义AT指令了
  看到这个表情应该知道是什么意思了吧,不急的话继续往下看↓。

二、简介

  今天带来的文章带来了一个简易的AT引擎。该AT引擎可以实现自定义AT指令、可以实现对固件自带的AT指令实现重定向、可以直接使用固件自带的AT指令。
在这里插入图片描述

  第一类用法自定义AT:顾名思义自定义AT就是添加属于自己的AT。这个用法和底层的AT没关系。一般情况下AT指令会有四种用法,分别是测试(test)、查询(query)、设置(setup)、执行(exe)。上述是通用用法,但是有些AT指令只具备其中的一个或多个,并不是每个AT指令都会有上述四种用法。

    AT+TEST=?           //测试指令。这一般情况下会返回该AT可以输入的参数取值范围
    AT+TEST?            //查询指令。一般会返回AT指令之前设置的结果或者默认值
    AT+TEST=123456      //设置指令。设置参数,设置的值可以被查询指令查询
    AT+TEST             //执行指令。根据设置的结果执行相应的动作

  第二类用法重定向AT:相当于给底层自带的AT起一个别名。本例中我将对+WIMEI命令进行重定向,使用+REPWIMEI命令来代替+WIMEI,用法是一摸一样的只是名字变了。不要担心,这个并不会影响到原来的AT,原来的AT还是可以正常使用的。

  第三类用法转发AT,由于该模块默认串口1是AT口。我们实现自定义AT也是使用的串口1,这就会导致原来的AT通道不能正常使用。只能在AT引擎中将不匹配的AT通过VAT虚拟AT通道转发到底层处理。

二、编写程序

2.1、main.c

  demo非常简单,只需要调用at_task_init();我们的AT引擎就可以跑起来了。

/***************
    demo_at_engine
****************/


#include "iot_debug.h"
#include "iot_os.h"


int appimg_enter(void *param)
{
    iot_debug_print("[hello]appimg_enter");

    iot_debug_set_fault_mode(OPENAT_FAULT_HANG);

    iot_vat_send_cmd("AT^TRACECTRL=0,1,1\r\n", sizeof("AT^TRACECTRL=0,1,1\r\n"));
    at_task_init();//初始化AT引擎
    return 0;
}

void appimg_exit(void)
{
    iot_debug_print("[hello]appimg_exit");
}


  我们需要修改的内容在app\at_engine目录下,想要自定义命令需要修改三个文件,如果不修改的话默认也是可以跑的。
在这里插入图片描述

2.2、at_baseTable.h

  at_baseTable.h文件存放的是用户自定义AT以及重定向AT的一个表。At引擎运行的时候会到这个表中进行匹配。这个表实际上是一个结构体数组,一个结构体元素代表一个AT命令。每个AT都有7个成员,从左到右依次是旧的AT指令新的AT指令新的AT指令长度测试回调函数查询回调函数设置回调函数执行回调函数

#ifndef __AT_BASETABLE_H
#define __AT_BASETABLE_H

#include "at.h"
#include "at_baseCmd.h"

at_funcationType at_fun[] = {
    {NULL, "+NEW", 4, at_NEW_Cmdtest, at_NEW_Cmdquery, at_NEW_Cmdsetup, at_NEW_Cmdexe},
    {"I", "+REPI", 5, NULL, NULL, NULL, NULL},
    {"+WIMEI", "+REPWIMEI", 9, NULL, NULL, NULL, NULL},
    {NULL, NULL, 0, NULL, NULL, NULL, NULL}};
#endif

  如果旧的AT指令存在,说明该条目是对底层AT进行重定向。这时候只需要在填入新的AT指令新的AT指令长度即可,后面的四个回调都可以填NULL。实际填了也没用这并不会进入到这个回调中处理。

  如果旧的AT指令不存在,说明该条目是一条自定义指令,那就需要填入后面的回调,按需填写。用到哪个就填哪个。简介中有介绍到AT的四种用法。

  表中第1条:添加了一条AT+NEW指令,该条目是一个自定义指令,接下来还需要添加四个回调函数。at_NEW_Cmdtest, at_NEW_Cmdquery, at_NEW_Cmdsetup, at_NEW_Cmdexe
  表中第2条:使用AT+REPI指令完成对ATI的重定向。原始命令仍可正常使用。
  表中第3条:使用AT+REPWIMEI指令完成对AT+WIMEI的重定向。原始命令仍可正常使用。

2.3、at_baseCmd.h

  at_baseCmd.h文件存放的是回调函数声明。

#ifndef __AT_BASECMD_H
#define __AT_BASECMD_H


at_cmdResult at_NEW_Cmdtest(uint8_t id);

at_cmdResult at_NEW_Cmdquery(uint8_t id);

at_cmdResult at_NEW_Cmdsetup(uint8_t id, char *pPara);

at_cmdResult at_NEW_Cmdexe(uint8_t id);

#endif

2.4、at_baseCmd.c

  at_baseCmd.c文件存放的是回调函数的具体实现。

#include "at.h"
#include "at_baseCmd.h"
//#include "gsm.h"
//执行AT命令
//存储数据
//上传
at_cmdResult at_NEW_Cmdtest(uint8_t id)
{
    char buf[] = "AT+NEW TEST";
    at_uart_send(buf, sizeof(buf) - 1);
    return cmdResultOk;
}
at_cmdResult at_NEW_Cmdquery(uint8_t id)
{
    char buf[] = "AT+NEW QUERY";
    at_uart_send(buf, sizeof(buf) - 1);
    return cmdResultOk;
}
at_cmdResult at_NEW_Cmdsetup(uint8_t id, char *pPara)
{
    char *data = pPara + 1;
    char buf[] = "AT+NEW SETUP pPara is: ";
    at_uart_send(buf, sizeof(buf) - 1);
    at_uart_send(data, strlen(data) - 2);
    return cmdResultOk;
}
at_cmdResult at_NEW_Cmdexe(uint8_t id)
{
    char buf[] = "AT+NEW EXE";
    at_uart_send(buf, sizeof(buf) - 1);
    return cmdResultOk;
}

三、下载验证

  ATIAT+REPI测试,可以看到两条命令返回一样的结果。

[2020-12-10 11:52:45.110]# SEND ASCII>
ATI


[2020-12-10 11:52:45.233]# RECV ASCII>

CSDK_V301736_RDA8910

OK


[2020-12-10 11:52:51.295]# SEND ASCII>
AT+REPI


[2020-12-10 11:52:51.426]# RECV ASCII>
AT+REPI

CSDK_V301736_RDA8910

OK

  AT+REPWIMEIAT+WIMEI测试,分别查询结果都是一样的。使用AT+WIMEI设置的新IMEI也能被AT+REPWIMEI查询到。

[2020-12-10 11:56:18.597]# SEND ASCII>
AT+REPWIMEI?


[2020-12-10 11:56:18.736]# RECV ASCII>
AT+REPWIMEI?

+WIMEI: 866714049398888

OK


[2020-12-10 11:56:19.395]# SEND ASCII>
AT+WIMEI?


[2020-12-10 11:56:19.526]# RECV ASCII>

+WIMEI: 866714049398888

OK


[2020-12-10 11:56:24.068]# SEND ASCII>
AT+WIMEI=123456789123456


[2020-12-10 11:56:24.257]# RECV ASCII>

OK


[2020-12-10 11:56:26.975]# SEND ASCII>
AT+REPWIMEI?


[2020-12-10 11:56:27.110]# RECV ASCII>
AT+REPWIMEI?

+WIMEI: 123456789123456

OK

  AT+NEW测试,通过串口一日志看到AT的四种使用形式,测试(test)、查询(query)、设置(setup)、执行(exe)都被正常识别。

[2020-12-10 11:58:12.083]# SEND ASCII>
AT+NEW=?


[2020-12-10 11:58:12.201]# RECV ASCII>
AT+NEW=?

AT+NEW TEST

OK


[2020-12-10 11:58:16.403]# SEND ASCII>
AT+NEW?


[2020-12-10 11:58:16.525]# RECV ASCII>
AT+NEW?

AT+NEW QUERY

OK


[2020-12-10 11:58:23.541]# SEND ASCII>
AT+NEW=123456


[2020-12-10 11:58:23.697]# RECV ASCII>
AT+NEW=123456

AT+NEW SETUP pPara is: 123456

OK


[2020-12-10 11:58:27.065]# SEND ASCII>
AT+NEW


[2020-12-10 11:58:27.179]# RECV ASCII>
AT+NEW

AT+NEW EXE

OK

不会下载的点击这里,进去查看我的RDA8910 CSDK二次开发入门教程专题第一篇博文1、RDA8910CSDK二次开发:环境搭建里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址