# ers **Repository Path**: w800_sdk/ers ## Basic Information - **Project Name**: ers - **Description**: 基于at命令服务的一种远程服务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: v7.3.3 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-09 - **Last Updated**: 2021-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 概述 at ERS 是基于at命令服务的一种远程服务。 # 接口定义 ## 指令接口配置 指令的接口全都放在init目录的at_cmd.c中,通过配置`atserver_cmd_t at_cmd[]`数组来配置可执行的AT命令。 ## 指令接口 ```c typedef struct atserver_cmd { const char *cmd; cmd_callback cb; void *priv; char use_heap; slist_t next; } atserver_cmd_t; ``` AT的所有命令格式都制定在 atserver_cmd_t 这个结构体里。 * 参数: * cmd: 命令字符串 * cb: 命令执行函数 * priv: 其他参数指针 * use_heap: 堆标记 * next: 命令链表指针 ## 指令示意 ```c const atserver_cmd_t at_cmd[] = { {"AT", at_cmd_at, NULL}, {"AT+HELP", at_cmd_help, NULL}, {"AT+CGMR", at_cmd_cgmr, NULL}, {"AT+FWVER", at_cmd_fwver, NULL}, {"AT+SYSTIME", at_cmd_systime, NULL}, {"AT+SAVE", at_cmd_save, NULL}, {"AT+FACTORY", at_cmd_factory, NULL}, {"AT+REBOOT", at_cmd_reboot, NULL}, {"AT+EVENT", at_cmd_event, NULL}, {"AT+ECHO", at_cmd_echo, NULL}, {NULL, NULL, NULL}, }; ``` 其中`{"AT", at_cmd_at, NULL}`,`"AT"`为指令名称,`at_cmd_at`为指令回调函数,`priv`参数为`NULL`。 # 指令定义 ## 指令类型 AT指令包括四种类型的指令,测试指令,查询指令,设置指令,执行指令。 | 类型 | 指令格式 | 描述 | | -------- | -------------- | ---------------------------------------------------------- | | 测试指令 | AT+[x]=? | 该命令用于查询设置指令的参数以及取值范围。 | | 查询指令 | AT+[x]? | 该命令用于返回参数的当前值。 | | 设置指令 | AT+[x]=[...] | 该命令用于设置用户⾃自定义的参数值。 | | 执行指令 | AT+[x] | 该命令用于执⾏行行受模块内部程序控制的变参数不不可变的功能。 | 所有指令以[CR]结尾 ## 指令回应 | 格式 | 格式描述 | | --------------------------- | -------------------- | | \r\nOK\r\n | 执行成功 | | \r\n+CMD:[x]\r\nOK\r\n | 执行成功并返回结果 | | \r\n+CMD:-[x]\r\nERROR\r\n | 执行失败并返回错误码 | 所有响应以[CR][LF]结尾 ## 异步事件 | 格式 | 格式描述 | | ---------------- | ------------------------ | | +EVENT=NAME,[x] | 返回某项事件,并携带参数 | 所有事件以[CR][LF]结尾 # AT指令集 ## 基础AT指令 ### 测试AT启动 命令字符串:AT | 执行指令 | 响应 | 参数说明 | |---------|--------|----------| | AT | \r\nOK | AT | ### 显示AT帮助指令 命令字符串:AT+HELP | 执行指令 | 响应 | 参数说明 | |---------|---------------------------------------|-------------------| | AT+HELP | \r\nAT+HELP:[command list]\r\nOK\r\n | command list:指令列表 | ### 查询模块版本 命令字符串:AT+CGMR | 执行指令 | 响应 | 参数说明 | |---------|-----------------------------------------|-----------------------| | AT+CGMR | \r\nAT+CGMR:[module version]\r\nOK\r\n | module version:AT模块版本 | ### 查询系统运行时间 命令字符串:AT+SYSTIME | 执行指令 | 响应 | 参数说明 | |------------|--------------------------------|-----------------------| | AT+SYSTIME | \r\n+SYSTIME:[time]\r\nOK\r\n | time:系统运行时间,s为单位 | ### 查询三要素 命令字符串:AT+FACTORYR | 执行指令 | 响应 | 参数说明 | |----------------------------|----------------------------------------|-------------------------------------------------------------------------| | AT+FACTORYR? | \r\n+FACTORYR:[factory info]\r\nOK\r\n | factory info: 出厂信息,包括设备名称和产品密钥 | ### 设置三要素 命令字符串:AT+FACTORYW | 执行指令 | 响应 | 参数说明 | |----------------------------|----------------------------------------|-------------------------------------------------------------------------| | AT+FACTORYW=[key],[value] | \r\nOK\r\n | key: 暂时只支持PRODUCTKEY, DEVICENAME, DEVICESECRET 之一
value: key的值 | ### 重启模块 命令字符串:AT+REBOOT | 执行指令 | 响应 | 参数说明 | |-----------|------------|----------| | AT+REBOOT | \r\nOK\r\n | | ### 查询/设置是否开启事件通知功能 命令字符串:AT+EVENT | 执行指令 | 响应 | 参数说明 | |-------------------|-------------------------------|--------------------------------------| | AT+EVENT? | \r\n+EVENT:[state]\r\nOK\r\n | OFF:关闭事件通知功能 ON:开启事件通知功能 | | AT+EVENT=[state] | \r\nOK\r\n | OFF:关闭事件通知功能 ON:开启事件通知功能 | ### 查询/设置是否回显发送指令 命令字符串:AT+ECHO | 执行指令 | 响应 | 参数说明 | |------------------|------------------------------|----------------------| | AT+ECHO? | \r\n+ECHO:[state]\r\nOK\r\n | OFF:关闭回显 ON:开启回显 | | AT+ECHO=[state] | \r\nOK\r\n | OFF:关闭回显 ON:开启回显 | 存储服务AT指令 ### 获取键值(字符串) 命令字符串:AT+KVGET | 执行指令 | 响应 | 参数说明 | |-----------------|-------------------------------|---------| | AT+KVGET=[key] | \r\n+KVGET:[value]\r\nOK\r\n | key:键 | ### 设置键值(字符串) 命令字符串:AT+KVSET | 执行指令 | 响应 | 参数说明 | |-----------------------|------------|---------------------------------------------------------| | AT+KVSET=[key,value] | \r\nOK\r\n | key:键[长度不超过 32 字节]
value:值[长度不超过 32 字节] | ### 删除键值(字符串) 命令字符串:AT+KVDEL | 执行指令 | 响应 | 参数说明 | |-----------------|------------|---------------------------| | AT+KVDEL=[key] | \r\nOK\r\n | key:键[删除 key 对应的键值对] | ### 获取键值(整数型) 命令字符串:AT+KVGETINT | 执行指令 | 响应 | 参数说明 | |-----------------|-------------------------------|---------| | AT+KVGETINT=[key] | \r\n+KVGET:[value]\r\nOK\r\n | key:键 value: INT型值 | ### 设置键值(整数型) 命令字符串:AT+KVSETINT | 执行指令 | 响应 | 参数说明 | |-----------------------|------------|---------------------------------------------------------| | AT+KVSETINT=[key,value] | \r\nOK\r\n | key:键[长度不超过 32 字节]
value:值范围(-2147483648~2147483647) | ### 删除键值(整数型) 命令字符串:AT+KVDELINT | 执行指令 | 响应 | 参数说明 | |-----------------|------------|---------------------------| | AT+KVDELINT=[key] | \r\nOK\r\n | key:键[删除 key 对应的键值对] | ## socket管理AT指令 ### 启动一个连接 命令字符串:AT+CIPSTART | 执行指令 | 响应 | 参数说明 | | - | - | - | | AT+CIPSTART=[id],[type][,ip][,remote_port][,local_port] | \r\nOK\r\n | [id]:指定连接的 id 号,范围:0 - 2
[type]:连接类型,包括:
tcp_server,tcp_client, udp_unicast。分别如下:
- 当type为tcp_server时,参数为:
id,tcp_server,local_port
- 当type为tcp_client时,参数为:
id,tcp_client,ip,remote_port[,local_port]
- 当type为udp_unicast时,参数为:
id,udp_unicast,ip,remote_port,local_port
[ip]:目标服务器的 IP。当 type 为 tcp_server 时,不需要该参数。
[remote_port]:远程端口。
[local_port]:本地端口。 | 注意: * 当前 id 的连接,如果不是关闭状态,再次设置并连接时,将无法成功执行并返回错误。 * 更改任何一个 id 的参数前,必须要手动关闭,即执行指令:AT+CIPSTOP=id\r,才能正确设置并连接。 * 连接结果通过CONNECT事件返回 * 当前tcp_server仅支持一个 client 连接 * 无线环境下有如下限制: * local_port 不起作用 * 不能设置连接类型为 tcp_server ### 断开一个指定 id 的连接 命令字符串:AT+CIPSTOP | 执行指令 | 响应 | 参数说明 | |------------------|------------|----------------------------------------------------------------| | AT+CIPSTOP=[id] | \r\nOK\r\n | [id]:指定连接的 id 号 | 1. 网络指定3时,断开所有连接的 id 2. 断开结果通过 DISCONNECT 事件返回 ### 查询/设置WiFi 数据发送至用户串口的配置参数 命令字符串:AT+CIPRECVCFG | 执行指令 | 响应 | 参数说明 | | - | - | - | | AT+CIPRECVCFG? | \r\n+CIPRECVCFG:[recv mode]\r\n | [recv mode]:
0.表示raw透传模式,表示自动接收
1.表示cmd指令模式,需通过指令 AT+CIPRECV 接收 | | AT+CIPRECVCFG=[recv mode] | \r\nOK\r\n | [recv mode]:
0.表示raw透传模式,表示自动接收
1.表示cmd指令模式,需通过指令 AT+CIPRECV 接收 | 默认是 cmd 指令模式 两种模式相比: 1.透传模式:简单,数据可及时接收 2.指令模式:符合一般编程习惯 ### 查询&设置ID 命令字符串:AT+CIPID | 执行指令 | 响应 | 参数说明 | |----------------|----------------------------|-------------------------------| | AT+CIPID=? | \r\n+CIPID:0-2\r\nOK\r\n | [id]:指定连接的 id 号,范围:0 - 2 | | AT+CIPID? | \r\n+CIPID:[id]\r\nOK\r\n | [id]:指定连接的 id 号,范围:0 - 2 | | AT+CIPID=[id] | \r\nOK\r\n | [id]:指定连接的 id 号,范围:0 - 2 | 1. 默认值是0 2. 除了 CIPSTART / CIPSTOP / CIPRECVCFG指令,其他 AT 指令执行前,如果连接 id 号不为0的话,需要执行该指令 ### 查询连接状态 命令字符串:AT+CIPSTATUS | 执行指令 | 响应 | 参数说明 | | - | - | - | | AT+CIPSTATUS | \r\n+CIPSTATUS:[type],[status]\r\nOK\r\n | type:
- 指定 id 的连接类型,包括:
tcp_server,tcp_client,udp_unicast
status:
- start: 启动连接
- connect: 已连接 | ### 发送数据 命令字符串:AT+CIPSEND | 执行指令 | 响应 | 参数说明 | | - | - | - | | AT+CIPSEND=[length],[data] | \r\n+CIPSEND:[len]\r\n | Length:发送的数据长度 最大数据长度为128
Data:发送数据
Len:返回当前发送的数据长度 | ### 接收数据 命令字符串:AT+CIPRECV | 执行指令 | 响应 | 参数说明 | |------------|---------------------------------------------|------------------------------------------------------------| | AT+CIPRECV | \r\n+CIPRECV:[id],[len],[data]\r\nOK\r\n | Id:当前的socket通道号
Len:接收的数据长度
Data:当前数据域 | 1. 同步接收数据 2. 返回实际接收的数据长度和数据(长度最大为 128) ## 数据上云服务AT指令 ### 发布数据 命令字符串:AT+PUB | 执行指令 | 响应 | 参数说明 | |-----------------------|------------|--------------------------------------------| | AT+PUB=[length,data] | \r\nOK\r\n | [length]:发布数据的长度
[data]:发布的数据 | 数据发送到云端 数据长度不能超过 128字节 ### 查询 &&连接云通道 命令字符串:AT+ALIYUNCONN | 执行指令 | 响应 | 参数说明 | | - | - | - | | AT+ALIYUNCONN | \r\nOK\r\n | 无 | | AT+ALIYUNCONN? | \r\n+ALIYUNCONN=[sta]\r\n | [sta]:
connected = 0 (未连接)
connecting = 1 (已连接) | 建立连接 ### 断开云通道 命令字符串:AT+ALIYUNDISCONN | 执行指令 | 响应 | 参数说明 | |------------------|------------|---------| | AT+ALIYUNDISCONN | \r\nOK\r\n | 无 | 断开连接 ## 事件通知 ### 接收⽹络数据 命令字符串:+EVENT=RECV | 执行指令 | 响应 | 参数说明 | |--------------------------------------|------|---------------------------------------------------------------| | +EVENT=RECV,[id],[len],[data]\r\n | | [id]:连接的 id 号
[len]:接收的数据长度
[data]:接收的数据 | 工作在透传模式下 ### 连接状态 命令字符串:+EVENT=CONNECT | 执行指令 | 响应 | 参数说明 | |--------------------------|------|------------------| | +EVENT=CONNECT,[id]\r\n | | [id]:连接上的 id 号 | ### 断开连接状态 命令字符串:+EVENT=DISCONNECT | 执行指令 | 响应 | 参数说明 | |-----------------------------|------|--------------------| | +EVENT=DISCONNECT,[id]\r\n | | [id]:断开连接的 id 号 | ### 上云推送结果 命令字符串:+EVENT=PUB | 执行指令 | 响应 | 参数说明 | |-----------------------|------|-------------------------------------------| | +EVENT=PUB,[res]\r\n | | [res]:返回上云推送结果,SUCC-成功 FAILED-失败 | # 错误代码表 ```c #define AT_OK 0 /*!< No error */ #define AT_ERR -1 /*!< General fail code */ #define AT_ERR_NO_KEY -2 /*!< Key not set */ #define AT_ERR_INVAL -3 /*!< Invalid argument */ #define AT_ERR_STATUS -4 /*!< Invalid status */ #define AT_ERR_RECV -5 /*!< socket API: Fail to recv data */ #define AT_ERR_SEND -6 /*!< socket API: Fail to send data */ #define AT_ERR_START -7 /*!< socket API: Fail to start */ #define AT_ERR_CHECK -8 /*!< data check error*/ #define AT_ERR_FOTA_NOVER -9 /* !< no version */ #define AT_ERR_FOTA_MDVER -10 /* !< version for module */ ```