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

相关文章
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
163 2
|
22天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
28 1
|
1月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
112 2
|
1月前
|
机器学习/深度学习 编解码 算法
深入解析MaxFrame:关键技术组件及其对视频体验的影响
【10月更文挑战第12天】随着流媒体服务和高清视频内容的普及,用户对于视频质量的要求越来越高。为了满足这些需求,许多技术被开发出来以提升视频播放的质量。其中,MaxFrame是一种旨在通过一系列先进的图像处理算法来优化视频帧的技术。本文将深入探讨构成MaxFrame的核心组件,包括运动估计、超分辨率重建以及时间插值算法,并讨论这些技术如何协同工作以改善视频播放效果。
40 1
|
17天前
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
40 0
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
182 5
|
6天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
20 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
54 0

推荐镜像

更多