“芯片开放社区“电子发烧友小组已上线~即日起各位用户也能在电子发烧友找到我们了,复制如下链接到浏览器打开,即可回帖,提问,参与有奖互动,还有机会参与我们的线上线下活动,欢迎各位用户及开发者加入小组~https://bbs.elecfans.com/group_1398
自上期开始,我们开启了YoC组件系列内容的介绍,并带大家了解了YoC的CSI组件。本期将为大家介绍的是YoC的AT组件。本文将详细阐述AT组件的使用原理,开发所需要的其他依赖组件资源,以及在网络方面的应用,以帮助广大开发者熟悉AT组件的使用。
01 简介
1.1 AT命令
AT 即Attention,AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter, TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。
通过TA,TE发送AT指令来控制移动台(Mobile Station,MS)的功能,与GSM 网络业务进行交互。用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。
AT指令是以AT作首,字符结束的字符串,AT指令的响应数据包在中。每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,接收端可做相应的处理。
1.2 AT优点
-
命令简单易懂,并且采用标准串口来收发AT命令,这样对设备控制大大简化了,转换成简单串口编程了。
-
AT命令提供了一组标准的硬件接口--串口。这个简化的硬件设计.较新的电信网络模块,几乎都采用串口硬件接口。
-
AT命令功能较全,可以通过一组命令完成设备的控制,完成呼叫、短信、电话本、数据业务、传真。
1.3 AT应用
基于AT自身具备的优点,使用起来简单直接,功能简洁,命令齐全,已经被应用到物联网领域,比如提供完整的AT命令联网功能和设备生产需要的AT命令产测功能等。
02 YoC网络设计
2.1 网络框架
YoC的网络框架支持以下两种方式上网:
-
支持SoC 集成WiFi进行联网。
-
支持AT指令访问外部的WiFi透传模组进行联网。
通过访问外部的WiFi透传模组进行联网除了需AT组件外,还需要有SAL, NEGMGR和WIFI驱动组件。各个组件负责的功能描述如下:
-
AT组件负责将上层调用的网络功能以AT命令发送给WiFi透传模组,同时接受WiFi透传模组的返回结果和数据返回给上层。
-
WiFi驱动为上层组件Netmgr和SAL提供硬件能力支持
-
Netmgr为上层提供完整网络管理功能。
-
SAL(Socket Abstract Layer)给网络应用程序提供准备的Socket APIs.
2.2 透传模组
YoC支持WiFi透传模组的开发,除了AT组件外,我们还需要有ERS、LWIP组件和WIFI驱动组件。其中:
-
ERS组件负责注册所有支持的AT命令,一旦AT Server收到AT命令后,马上进行命名解析,从注册的AT命令里找到对应的命令处理函数开始执行,如果是联网的Socket命令,就会通过调用LWIP组件获取相应的命令数据。
-
LwIP组件主要负责接收和发送Wi-Fi TCPIP数据包。
-
WiFi数据驱动主要为上层组件提供硬件能力。
-
AT组件负责从主控接受指令和返回命令结果数据给主控。
03 工作原理
3.1 基本框架
AT命令使用的场景必须存在AT Server和AT Client两个角色。AT Client负责发送AT命令请求给AT Server, AT Server处理完后,返回响应数据和结果给AT Client。通常的工作原理如下:
-
AT Client发送AT命令请求给AT Server。
-
AT Server接收到命令后,解析AT命令进行处理。
-
AT Server返回处理后AT命令和结果数据。
-
AT Client接收到返回AT命令后,解析AT命令后,按解析结果继续接受数据。
AT组件完成 AT 命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析、OOB 数据处理等整个 AT 命令数据交互流程。
3.2 AT Server
设备利用AT组件的Server 角色功能可以为其他设备提供自身功能, 其他的设备或上位机通过发送AT Server支持的AT命令来间接调用该设备的能力。比如,上位机通过发送AT命令获取该设备的状态和其他信息以及调用相关功能。
通常具有AT Server的能力的设备会支持一系列的AT命令集,这些命令集可以是标准的也可以扩展的。AT Client只有发送AT Server支持的AT命令才能被正确的接收处理。
3.3 AT Client
设备利用AT组件的Client角色功能可以访问其他具有AT Server功能的设备或模组,从而利用该类的设备或模组的功能实现联网或其他的功能。比如,设备通过发送AT指令给WiFi模组实现联网功能。
04 WiFi透传模组进行联网
本章节我们讲解如何通过访问外部的WiFi透传模组进行联网。
4.1 通道初始化
4.1.1 使用默认串口通道
在默认的情况下,AT组件使用UART串口来作为AT数据传输通道,可以使用一下接口进行通道的初始化。
atparser_uservice_t *atparser_init(utask_t *task, const char *name, uart_config_t *config)
4.1.2 使用自定义通道
如果实际用的数据通道不是UART串口,比如是SPI, 则可以利用以下的接口来重新进行通道的初始化。
atparser_uservice_t *atparser_channel_init(utask_t *task, const char *name, void *config, at_channel_t *channel);
通道的基本操作主要包括:通道初始化、事件回调、数据发送和数据收发。所以开发者用户需要自己移植这四个接口。
#define AT_CHANNEL_EVENT_READ (1UL << 0) #define AT_CHANNEL_EVENT_WRITE (1UL << 1) #define AT_CHANNEL_OVERFLOW (1UL << 2) typedef void (*channel_event_t)(int event_id, void *priv); typedef struct { void* (*init)(const char *name, void *config); //通道初始化 int (*set_event)(void *hdl, channel_event_t evt_cb, void *priv); //设置通道事件回调,包含数据到达,数据发送完成、数据溢出 int (*send)(void *hdl, const char *data, int size); //数据发送 int (*recv)(void *hdl, const char *data, int size, int timeout); //数据接收 } at_channel_t;
具体可以参考at/port/uart_aos.c里的串口实现。
4.2 命令收发
4.2.1 命令发送
AT Client通过atparser_send发送使用AT指令,发送的命令以ASCII码的子串且"AT"字符打头。
int atparser_send(atparser_uservice_t *at, const char *command, ...)
4.2.2 命名接收
AT Client通过atparser_recv接收指令,接受的数据以ASCII码的子串且"OK"字符结尾。
int atparser_recv(atparser_uservice_t *at, const char *response, ...)
4.3 AT指令实现
4.3.1 Wi-Fi功能接口实现
我们采用ESP8266的Wi-Fi模组,需要支持ESP8266 WiFi驱动接口,主要包括以下接口,用于初始化Wi-Fi模组,启动Wi-Fi功能,获取和设置工作模式以及获取当前联网状态等。具体ESP8266 AT指令说明参考第7章节。
static wifi_driver_t esp8266_wifi_driver = { .init = esp8266_init, .deinit = esp8266_deinit, .start = esp8266_start, .stop = esp8266_stop, .reset = esp8266_reset, .set_mode = esp8266_set_mode, .get_mode = esp8266_get_mode, .sta_get_link_status = esp8266_drv_get_link_status, .set_smartcfg = esp8266_smartconfig, };
4.3.2 网络管理接口实现
网络管理模块需要获取设备的网络IP地址,MAC地址, DNS服务地址等信息,通过以下接口实现。具体ESP8266 AT指令说明参考第7章节。
static net_ops_t esp8266_net_driver = { .set_mac_addr = esp8266_set_mac_addr, .start_dhcp = NULL,/*esp8266_start_dhcp*/ .stop_dhcp = NULL,/*esp8266_stop_dhcp*/ .set_ipaddr = esp8266_set_ipaddr, .get_ipaddr = esp8266_get_ipaddr, .get_mac_addr = esp8266_get_mac_addr, .set_dns_server = esp8266_set_dns_server, .get_dns_server = esp8266_get_dns_server, .ping = esp8266_ping_remote, .subscribe = esp8266_subscribe, };
4.3.3 SAL接口实现
SAL接口主要用于网络TCPIP通讯,包括数据传输,数据发送,连接管理等,通过以下接口实现。具体ESP8266 AT指令说明参考第7章节。
05 ESP8266 WiFi AT指令
5.1 测试AT语法规则:
命令类型 | 语法 | 返回和说明 |
执行命令 | AT | OK |
5.2 WiFi功能AT指令
5.2.1 选择WiFi应用模式
AT+CWMODE语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | AT+CWMODE = <mode> | OK |
此指令需重启后生效(AT+RST) | ||
查询命令 | AT+CWMODE? | +CWMODE:<mode>OK |
当前处于哪种模式? | ||
测试命令 | AT+CWMODE? | +CWMODE:(<mode>取值列表)OK |
当前可支持哪些模式? |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<mode> | WiFi应用模式 | 1 |
Station模式 |
2 | AP模式 | ||
3 | AP+Station模式 |
5.2.2 列出当前可用接入点
AT+CWLAP语法规则:
命令类型 |
语法 |
返回和说明 |
执行命令 | AT+CWLAP | +CWLAP: <ecn>,<ssid>,<rssi>[,<mode>]OK |
此指令返回AP列表 |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<ecn> | 加密方式 | 0 |
OPEN |
1 |
WEP | ||
2 | WPA_PSK | ||
3 | WPA2_PSK | ||
4 | WPA_WPA2_PSK | ||
<ssid> | 接入点名称 | 字符串参数 | |
<rssi> | 信号强度 | ||
<mode> | 连接模式 | 0 |
手动连接 |
1 | 自动连接 |
5.2.3 加入接入点
AT+CWJAP语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | AT+CWJAP=<ssid>,<pwd> | OK或ERROR |
加入该AP成功则返回OK,失败则返回ERROR | ||
查询命令 | AT+CWJAP? | +CWJAP:<ssid>OK |
返回当前选择的AP |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<ssid> | 接入点名称 | 字符串型 | |
<pwd> | 密码 | 字符串型,最长64字节,ASCII编码 |
5.2.4 退出接入点
AT+CWQAP语法规则:
命令类型 | 语法 | 返回和说明 |
执行命令 | AT+CWQAP | OK |
表示成功退出该AP | ||
测试命令 | AT+CWQAP=? | OK |
查询该命令是否支持 |
5.2.5 设置AP模式下的参数
AT+CWSAP语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | AT+CWSAP=<ssid>,<pwd>,<chl>, <ecn> | OK |
设置参数成功 | ||
查询命令 | AT+CWSAP? | OK |
查询当前AP参数 |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<ecn> | 加密方式 | 0 |
OPEN |
1 | WEP | ||
2 | WPA_PSK | ||
3 | WPA2_PSK | ||
4 | WPA_WPA2_PSK | ||
<ssid> | 接入点名称 | 字符串参数 | |
<pwd> | 密码 | 字符串型,最长64字节,ASCII编码 | |
<chl> | 通道号 |
5.2.6 建立TCP/UDP连接
AT+CIPSTART语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | 单 路 连 接(+CIPMUX=0)时:AT+CIPSTART=<type>,<addr>,<port>多路连接(+CIPMUX=1)时:AT+CIPSTART=<id>,<type>,<addr>,<port> | 如果格式正确,返回:OK否则返回:+CME ERROR: invalid input value连接成功,返回:CONNECT OK (CPIMUX=0)<id>,CONNECT OK (CIPMUX=1)如果连接已经存在,返回:ALREADY CONNECT连接失败返回:CONNECT FAIL (CIPMUX=0)<id>,CONNECT FAIL (CIPMUX=1) |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<id> | LinkNo. | 0~4 | 表示连接序号0号连接可client或server连接,其他id只能用于连接远程server |
<type> | 连接类型 | “TCP”/”UDP” | |
<addr> | 远程服务器IP地址 | 字符串型 | |
<port> | 远程服务器端口号 |
5.2.7 连接状态
AT+CIPSTATUS语法规则:
命令类型 | 语法 | 返回和说明 |
执行命令 | AT+CIPSTATUS | 如果是单路连接(AT+CIPMUX=0),返回:OKSTATE: <sl_state> |
如果是多路连接(AT+CIPMUX=1),返回:OKSTATE:<ml_state> | ||
如果配置为服务器:STATE:IP STATUSS:<sid>,<port>,<server state>C:<cid>, <TCP/UDP>, <IP address>, <port>, <client state> | ||
测试命令 | AT+CIPSTATUS=? | 返回:OK |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<sl_state> | 单连接状态 | IP INITIAL | 初始化 |
IP STATUS | 获得本地IP状态 | ||
TCP CONNECTING/ UDP CONNECTING |
TCP连接中/ UDP端口注册中 |
||
CONNECT OK | 连接建立成功 | ||
TCP CLOSING/ UDP CLOSING |
正在关闭TCP连接,正在注销UDP端口 | ||
<ml_state> | 多链接状态 | IP INITIAL | 初始化 |
IP STATUS | 获得本地IP状态 | ||
<sid> | 服务器 id |
0~1 | 取值为0和1 |
<server state> | 服务器状态 | OPENING | 正在打开 |
LISTENING | 正在监听 | ||
CLOSING | 正在关闭 | ||
<cid> | 客户端 id |
0~4 | 取值为0,1,2,3,4 |
<IP address> | IP地址 | - | 字符串参数(字符串需要加引号) |
<port> | 服务器监听端口号 | - | 整数型 |
<client state> | 客户端状态 | CONNECTED | 已连接 |
CLOSED | 已关闭 |
5.2.8 启动多连接
AT+CIPMUX语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | AT+CIPMUX=<mode> | OK如果已经处于多连接模式,则返回Link is builded |
启动多连接成功 | ||
查询命令 | AT+CIPMUX? | +CIPMUX:<mode>OK |
查询当前是否处在多连接模式 |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<mode> | 是否处在多连接模式 | 0 |
单连接模式 |
1 | 多连接模式 |
5.2.9 发送数据
AT+CIPSEND语法规则:
命令类型 | 语法 | 返回和说明 | |
设置命令 | 单 路 连 接(+CIPMUX=0)时:AT+CIPSEND=<length>多路连接(+CIPMUX=1)时:AT+CIPSEND=<id>,<length> | 响应 | 模块收到指令后先换行返回”>”,然后开始接收串口数据,当数据长度满length时发送数据如果未建立连接或连接被断开,返回ERROR如果数据发送成功,返回SEND OK |
说明 | 发送指定长度的数据 | ||
测试指令 | AT+CIPSEND? | 响应 | 单路连接(AT+CIPMUX=0)返回:+CIPSEND: <length>OK |
多路连接(AT+CIPMUX=1)返回:+CIPSEND: <0-7>,<length>OK | |||
执行命令 | AT+CIPSEND | 说明 | AT+CIPMODE=1并且作为客户端模式下,进入透传模式(需要支持硬件流控,否则大量数据情况下会丢数据)模块收到指令后先换行返回”>”,然后会发送串口接收到的数据。 |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<length> | 数据长度 | 单位:字节 | |
<id> | LinkNo. | 0~4 | 连接序号 |
5.2.10 关闭TCP/UDP连接
AT+CIPCLOSE语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | 单路连接时AT+CIPCLOSE=<id> | 返回:CLOSE OK |
多路连接时AT+CIPCLOSE=<n>[,<id>] | 返回:<n>,CLOSE OK | |
执行命令 | AT+CIPCLOSE | 如果关闭成功,返回:CLOSE OK如果关闭失败,返回:ERROR |
测试命令 | AT+CIPCLOSE? | 返回:OK |
注意事项 | l 执行命令只对单链接有效,多链接模式下返回 ERROR |
-
执行命令AT+CIPCLOSE只有在TCP/UDP CONNECTING或CONNECT OK状态下才会关闭连接,否则会认为关闭失败返回ERROR
-
单路连接模式下,关闭后的状态为IP CLOSE
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<id> | 关闭模式 | 0 | 慢关(缺省值) |
1 |
快关 | ||
<n> | LinkNo. | 0~7 | 整数型,表示连接序号 |
5.2.11 获取本地IP地址
AT+CIFSR语法规则:
命令类型 | 语法 | 响应和说明 | |
执行命令 | AT+CIFSR | 响应 | + CIFSR:<IP address>OK或者ERROR |
测试命令 | AT+CIFSR=? | 响应 | OK |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<IP address> | 本机目前的IP地址(station) |
5.2.12 选择TCPIP应用模式
AT+CIPMODE语法规则:
命令类型 | 语法 | 返回 |
设置命令 | AT+CIPMODE=<mode> | OK |
查询命令 | AT+CIPMODE? | +CIPMODE: <mode>OK |
参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<mode> | TCPIP应用模式 | 0 |
非透明传输模式,缺省模式 |
1 |
透明传输模式 |
5.2.13 设置服务器主动断开的超时时间
AT+CIPSTO语法规则:
[size=9.5000pt] 命令类型 |
[size=9.5000pt]语法 | [size=9.5000pt] 返回和说明 |
设置命令 | AT+CIPSTO=<server timeout> |
OK |
查询命令 | AT+CIPSTO? | +CIPSTO:<server timeout>OK |
[size=9.5000pt][size=9.5000pt]参数定义:
[size=9.5000pt]参数 | [size=9.5000pt]定义 | [size=9.5000pt]取值 | 对取值的说明 |
<server timeout> | 用来设置服务器主动断开连接的超时时间 | 0~28800(s) | 用本命令设置好超时时间后,服务器到时间就断开连接。 |
5.2.14 设置波特率
AT+CIOBAUD语法规则:
命令类型 | 语法 | 返回和说明 |
设置命令 | AT+CIOBAUD=<rate> | 返回: |
OK 默认波特率是9600参数定义:
参数 | 定义 | 取值 | 对取值的说明 |
<rate> | 波特率,单位bps | 0 | 自适应波特率 |
110 | |||
300 | |||
1200 | |||
2400 | |||
4800 | |||
9600 | |||
14400 | |||
19200 | |||
28800 | |||
38400 | |||
57600 | |||
115200 | |||
230400 | |||
460800 | |||
921600 |
06 下期预告
AT组件对AT指令的接收和发送进行了有效封装,为上层的应用提供提供了统一的调用接口,对下层的物理通道接口适配封装,保证上层的应用不用关心底层物理通道的通讯实现,大大减少了用户应用代码开发。
以上即为AT组件的全部介绍,下期内容我们将带来YoC的AV(多媒体)组件介绍,欢迎大家持续关注RISC-V系列内容。