天天看點

RISC-V生态全景解析(十二):YoC元件介紹系列二: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 網絡架構

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

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 透傳模組

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

YoC支援WiFi透傳模組的開發,除了AT元件外,我們還需要有ERS、LWIP元件和WIFI驅動元件。其中:

  • ERS元件負責注冊所有支援的AT指令,一旦AT Server收到AT指令後,馬上進行命名解析,從注冊的AT指令裡找到對應的指令處理函數開始執行,如果是聯網的Socket指令,就會通過調用LWIP元件擷取相應的指令資料。
  • LwIP元件主要負責接收和發送Wi-Fi TCPIP資料包。
  • WiFi資料驅動主要為上層元件提供硬體能力。
  • AT元件負責從主要接受指令和傳回指令結果資料給主要。

03 工作原理

3.1 基本架構

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

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

繼續閱讀