“晶片開放社群“電子發燒友小組已上線~即日起各位使用者也能在電子發燒友找到我們了,複制如下連結到浏覽器打開,即可回帖,提問,參與有獎互動,還有機會參與我們的線上線下活動,歡迎各位使用者及開發者加入小組~ 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章節。
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> | |
此指令需重新開機後生效(AT+RST) | ||
查詢指令 | AT+CWMODE? | +CWMODE:<mode>OK |
目前處于哪種模式? | ||
測試指令 | +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> | 加密方式 | OPEN | |
WEP | |||
WPA_PSK | |||
WPA2_PSK | |||
4 | WPA_WPA2_PSK | ||
<ssid> | 接入點名稱 | 字元串參數 | |
<rssi> | 信号強度 | ||
連接配接模式 | 手動連接配接 | ||
自動連接配接 |
5.2.3 加入接入點
AT+CWJAP文法規則:
AT+CWJAP=<ssid>,<pwd> | OK或ERROR | |
加入該AP成功則傳回OK,失敗則傳回ERROR | ||
AT+CWJAP? | +CWJAP:<ssid>OK | |
傳回目前選擇的AP |
字元串型 | |||
<pwd> | 密碼 | 字元串型,最長64位元組,ASCII編碼 |
5.2.4 退出接入點
AT+CWQAP文法規則:
AT+CWQAP | ||
表示成功退出該AP | ||
AT+CWQAP=? | ||
查詢該指令是否支援 |
5.2.5 設定AP模式下的參數
AT+CWSAP文法規則:
AT+CWSAP=<ssid>,<pwd>,<chl>, <ecn> | ||
設定參數成功 | ||
AT+CWSAP? | ||
查詢目前AP參數 |
<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> | 多連結狀态 | ||
<sid> | 伺服器 id | 0~1 | 取值為0和1 |
<server state> | 伺服器狀态 | OPENING | 正在打開 |
LISTENING | 正在監聽 | ||
CLOSING | 正在關閉 | ||
<cid> | 用戶端 | 取值為0,1,2,3,4 | |
<IP address> | IP位址 | - | 字元串參數(字元串需要加引号) |
伺服器監聽端口号 | 整數型 | ||
<client state> | 用戶端狀态 | CONNECTED | 已連接配接 |
CLOSED | 已關閉 |
5.2.8 啟動多連接配接
AT+CIPMUX文法規則:
AT+CIPMUX=<mode> | OK如果已經處于多連接配接模式,則傳回Link is builded | |
啟動多連接配接成功 | ||
AT+CIPMUX? | +CIPMUX:<mode>OK | |
查詢目前是否處在多連接配接模式 |
是否處在多連接配接模式 | 單連接配接模式 | ||
多連接配接模式 |
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> | 資料長度 | 機關:位元組 | |
連接配接序号 |
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? | ||
注意事項 | l 執行指令隻對單連結有效,多連結模式下傳回 ERROR |
- 執行指令AT+CIPCLOSE隻有在TCP/UDP CONNECTING或CONNECT OK狀态下才會關閉連接配接,否則會認為關閉失敗傳回ERROR
- 單路連接配接模式下,關閉後的狀态為IP CLOSE
關閉模式 | 慢關(預設值) | ||
快關 | |||
<n> | 0~7 | 整數型,表示連接配接序号 |
5.2.11 擷取本地IP位址
AT+CIFSR文法規則:
響應和說明 | |||
AT+CIFSR | + CIFSR:<IP address>OK或者ERROR | ||
AT+CIFSR=? |
本機目前的IP位址(station) |
5.2.12 選擇TCPIP應用模式
AT+CIPMODE文法規則:
傳回 | ||
AT+CIPMODE=<mode> | ||
AT+CIPMODE? | +CIPMODE: <mode>OK |
TCPIP應用模式 | 非透明傳輸模式,預設模式 | ||
透明傳輸模式 |
5.2.13 設定伺服器主動斷開的逾時時間
AT+CIPSTO文法規則:
[size=9.5000pt] | [size=9.5000pt]文法 | |
AT+CIPSTO=<server timeout> | ||
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 | 自适應波特率 | |
110 | |||
300 | |||
1200 | |||
2400 | |||
4800 | |||
9600 | |||
14400 | |||
19200 | |||
28800 | |||
38400 | |||
57600 | |||
115200 | |||
230400 | |||
460800 | |||
921600 |
06 下期預告
AT元件對AT指令的接收和發送進行了有效封裝,為上層的應用提供提供了統一的調用接口,對下層的實體通道接口适配封裝,保證上層的應用不用關心底層實體通道的通訊實作,大大減少了使用者應用代碼開發。
以上即為AT元件的全部介紹,下期内容我們将帶來YoC的AV(多媒體)元件介紹,歡迎大家持續關注RISC-V系列内容。