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

相关文章
|
15天前
|
缓存 安全 PHP
【PHP开发专栏】Symfony框架核心组件解析
【4月更文挑战第30天】本文介绍了Symfony框架,一个模块化且高性能的PHP框架,以其可扩展性和灵活性备受开发者青睐。文章分为三部分,首先概述了Symfony的历史、特点和版本。接着,详细解析了HttpFoundation(处理HTTP请求和响应)、Routing(映射HTTP请求到控制器)、DependencyInjection(管理依赖关系)、EventDispatcher(实现事件驱动编程)以及Security(处理安全和认证)等核心组件。
|
1月前
|
消息中间件 存储 运维
王者归位:Kafka控制器组件解析
王者归位:Kafka控制器组件解析
36 0
|
15天前
|
缓存 Java 开发者
10个点介绍SpringBoot3工作流程与核心组件源码解析
Spring Boot 是Java开发中100%会使用到的框架,开发者不仅要熟练使用,对其中的核心源码也要了解,正所谓知其然知其所以然,V 哥建议小伙伴们在学习的过程中,一定要去研读一下源码,这有助于你在开发中游刃有余。欢迎一起交流学习心得,一起成长。
|
19天前
|
存储 JavaScript 开发者
Vue3中的组件间通信:多种方法解析
【4月更文挑战第20天】
9 1
|
20天前
|
存储 前端开发 JavaScript
React的表单处理:受控组件与非受控组件深入解析
【4月更文挑战第25天】React表单处理涉及受控和非受控组件。受控组件通过状态管理表单数据,每次用户输入都触发状态更新,确保数据同步,适合实时交互但可能影响性能。非受控组件不直接管理状态,数据存储在DOM中,简化代码,适用于更新不频繁的场景,但在数据验证和同步上存在挑战。开发者应根据需求灵活选择。
|
1月前
|
Linux SDN 网络虚拟化
Linux虚拟网络设备全景解析:定义、工作模式与实践应用
在深入探索Linux操作系统的强大功能时,我们不可避免地会遇到虚拟网络设备的概念。这些设备扮演着构建和维护虚拟化环境中网络通信的关键角色。本文旨在详细介绍Linux虚拟网络设备的定义、工作模式以及它们的多样化用途。
Linux虚拟网络设备全景解析:定义、工作模式与实践应用
|
2月前
|
存储 安全 编译器
【Qt 底层之属性系统】Qt 属性系统全景:深入解析 Q_PROPERTY 宏的核心作用
【Qt 底层之属性系统】Qt 属性系统全景:深入解析 Q_PROPERTY 宏的核心作用
103 2
|
2月前
|
存储 安全 Linux
嵌入式Linux系统bringup 启动全景解析
嵌入式Linux系统bringup 启动全景解析
74 0
|
2月前
|
存储 传感器 网络协议
通信协议缓冲区管理全景:TCP、UDP、ZMQ、DBus、SSL、SOME/IP通讯协议的缓冲区解析...
通信协议缓冲区管理全景:TCP、UDP、ZMQ、DBus、SSL、SOME/IP通讯协议的缓冲区解析...
79 0
|
2月前
|
Web App开发 存储 网络协议
C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析
C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析
94 3

推荐镜像

更多