RISC-V生态全景解析(十二):YoC组件介绍系列二:AT组件

简介: 自上期开始,我们开启了YoC组件系列内容的介绍,并带大家了解了YoC的CSI组件。本期将为大家介绍的是YoC的AT组件。本文将详细阐述AT组件的使用原理,开发所需要的其他依赖组件资源,以及在网络方面的应用,以帮助广大开发者熟悉AT组件的使用。

“芯片开放社区“电子发烧友小组已上线~即日起各位用户也能在电子发烧友找到我们了,复制如下链接到浏览器打开,即可回帖,提问,参与有奖互动,还有机会参与我们的线上线下活动,欢迎各位用户及开发者加入小组~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 网络框架

截屏2021-11-22 下午8.09.58.png

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 透传模组

截屏2021-11-22 下午8.10.06.png

YoC支持WiFi透传模组的开发,除了AT组件外,我们还需要有ERS、LWIP组件和WIFI驱动组件。其中:

  • ERS组件负责注册所有支持的AT命令,一旦AT Server收到AT命令后,马上进行命名解析,从注册的AT命令里找到对应的命令处理函数开始执行,如果是联网的Socket命令,就会通过调用LWIP组件获取相应的命令数据。
  • LwIP组件主要负责接收和发送Wi-Fi TCPIP数据包。
  • WiFi数据驱动主要为上层组件提供硬件能力。
  • AT组件负责从主控接受指令和返回命令结果数据给主控。

03 工作原理

3.1 基本框架

截屏2021-11-22 下午8.10.12.png

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章节。

static sal_op_t esp8266_sal_driver = {
    .version                        = "1.0.0",
    .init                           = esp8266_wifi_module_init,
    .start                          = esp8266_wifi_module_conn_start,
    .send                           = esp8266_wifi_module_send,
    .domain_to_ip                   = esp8266_wifi_module_domain_to_ip,
    .close                          = esp8266_wifi_module_conn_close,
    .deinit                         = esp8266_wifi_module_deinit,
    .register_netconn_data_input_cb = esp8266_wifi_packet_input_cb_register,
    .register_netconn_close_cb      = esp8266_wifi_close_cb_register,
};

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系列内容。

相关文章
|
18天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
19天前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
39 0
|
7天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
21天前
|
存储 安全 虚拟化
深入解析:Docker的架构与组件
【8月更文挑战第27天】
111 2
|
17天前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
28 0
|
24天前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
29天前
|
存储 Kubernetes 网络协议
在K8s中,提供的DNS组件是什么?有什么特性?
在K8s中,提供的DNS组件是什么?有什么特性?
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
53 6
|
3天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
3天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。

热门文章

最新文章

推荐镜像

更多