AliOS Things 網路適配框架
摘要: 很多物聯網應用場景中,都需要使用主控MCU外接連線晶片(如WiFi、NB-IoT)的解決方案。為方便這類場景的開發,AliOS Things提供了Socket Adapter Layer(SAL)框架和元件方案
AliOS Things中提供了豐富的SAL開發元件,來加速MCU+通訊連線晶片的應用場景開發和部署。在此類應用場景中,主控MCU晶片通過UART或SPI匯流排與WiFi、NB-IoT等通訊晶片相連,AliOS Things作業系統和使用者APP執行在主控MCU中,需要網路資料訪問時,通過外接的通訊晶片進行網路負載的接收和發射。主控MCU和外接通訊晶片之間的通訊,可以是AT Command通道,也可以是廠商私有協議通道。
AliOS Things SAL方案概述 目前,AliOS Things提供了atparser、at_adapter、SAL等開發元件。藉助這些元件,使用者可以方便地進行應用開發,同時這些元件也方便廠商在現有MCU產品基礎上通過外接通訊晶片方式擴充套件網路訪問能力。下圖展示了AliOS Things提供的SAL元件和方案架構:
其中,atparser元件提供了基礎的AT Command訪問介面和非同步收發機制。使用者可以直接訪問atparser元件提供的介面進行應用開發。上層應用直接通過atparser訪問網路是,需要自行處理AT命令細節。
基於atparser的基礎上,AliOS Things進一步提供了Socket Adapter Layer(SAL)元件(即上圖中的方案一)。SAL元件提供AT通道或廠商私有協議通道(如高通通訊模組的WMI)到Socket套接字(如socket、getaddrinfo、send、recvfrom等)介面的對接。通過SAL元件,應用層不需要關注通訊晶片底層操作的細節,只需要通過標準的Socket介面來達到訪問網路的目的。SAL元件支援大多數常用的Socket介面。SAL元件可以很大程度上提高應用層開發的效率,顯著降低應用層開發的難度。
此外,AliOS Things還提供了另外一種基於AT Command的網路訪問方案 - SAL LwIP模式(即上圖中的方案三)。SAL LwIP模式基於at_adapter元件工具。at_adapter元件提供AT底層到LwIP的對接,即AT通道作為LwIP的一個網路介面(netif)。使用該方案時,應用層通過標準的Socket介面訪問網路,不需要關注底層AT細節。該方案無縫對接LwIP協議棧,應用層可以使用所有LwIP提供的介面和服務。但該方案需要連線晶片韌體支援IP包收發模式,目前慶科的moc108已經支援該模式。
atparser元件 atparser元件是AliOS Things SAL框架的基礎元件之一,它提供統一和規範的AT命令訪問介面(如at.send、recv、write、read、oob等)和非同步收發機制(at_worker)。目前atparser元件僅支援了UART連線方式。
atparser有兩種工作模式,即NORMAL模式和ASYN模式。工作模式的選擇在atparser元件的初始化時進行。
NORMAL模式下,僅支援上層應用以單程序/執行緒方式訪問AT(同一時刻只有一個程序訪問AT)。由於AT底層通過序列方式(UART或其他)傳送和接收資料,在多程序情況下,多個AT讀寫可能會產生資料交叉,從而造成AT訪問的混亂及錯誤。下面是在NORMAL模式下,使用AT介面的示例(連線WiFi AP):
if (at.send("AT+WJAP=test_AP,test_passwd") == false) {
printf("at.send failed.\r\n");
return -1;
}
// Read AT cmd response right after a cmd is sent
if (at.recv("OK") == false) {
printf("Connecting AP failed.\r\n");
return -1
}
在ASYN模式下,支援AT命令的多程序訪問以及收據的非同步接收。系統中只有一個執行緒(at_worker)負責讀取AT資料,傳送執行緒傳送完AT命令後,等待at_worker執行緒喚醒;at_worker執行緒接收到對應AT命令的結果資料後,將結果傳遞給傳送執行緒,並喚醒傳送執行緒繼續執行。傳送執行緒確保一個AT命令傳送是原子操作。在ASYN模式下,可以支援多個程序對AT的訪問。
AT事件的處理(例如網路資料到達),通過註冊的oob回撥函式處理。at_worker執行緒負責識別AT事件並通過呼叫oob回撥函式處理AT事件和資料。
Socket Adapter Layer (SAL) SAL模組提供基於AT Command或廠商私有協議方案實現的標準Socket介面訪問。下圖是SAL(方案一)的架構圖。
SAL對上(應用層)提供標準Socket介面訪問。目前SAL支援多數常用的Socket介面,後續還將持續演進。以下是SAL目前支援的Socket介面:
int select(int maxfdp1, fd_set *readset, fd_set *writeset,
fd_set *exceptset, struct timeval *timeout);
int socket(int domain, int type, int protocol);
int write(int s, const void *data, size_t size);
int connect(int s, const struct sockaddr *name, socklen_t namelen);
int bind(int s, const struct sockaddr *name, socklen_t namelen);
int eventfd(unsigned int initval, int flags);
int setsockopt(int s, int level, int optname,
const void *optval, socklen_t optlen);
int getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen);
struct hostent* gethostbyname(const char *name);
int close(int s);
int sendto(int s, const void * data, size_t size, int flags,
const struct sockaddr * to, socklen_t tolen);
int send(int s, const void *data, size_t size, int flags);
int shutdown(int s, int how);
int recvfrom(int s, void *mem, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
int recv(int s, void *mem, size_t len, int flags);
int read(int s, void *mem, size_t len);
void freeaddrinfo(struct addrinfo *ai);
int getaddrinfo(const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
void freeaddrinfo(struct addrinfo *ai);
int shutdown(int s, int how);
int getaddrinfo(const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
int fcntl(int s, int cmd, int val);
SAL層對下抽象了通訊模組/晶片訪問控制層介面(如下),不同廠家的連線模組/晶片,可以通過對接底層控制訪問層介面來對接和支援SAL。
typedef struct sal_op_s {
char *version;
int (*init)(void);
int (*start)(at_conn_t *c);
int (*send)(int fd, uint8_t *data, uint32_t len,
char remote_ip[IP_LEN], int32_t remote_port);
int (*domain_to_ip)(char *domain, char ip[IP_LEN]);
int (*close)(int fd, int32_t remote_port);
int (*deinit)(void);
int (*register_netconn_evt_cb)(netconn_evt_cb_t cb);
} sal_op_t;
SAL LwIP模式 AliOS Things還提供了SAL LwIP模式(方案二)。該方案區別於方案一的地方在於,主控MCU上執行完整的LwIP協議棧,LwIP協議棧底層通過AT方式訪問網路;方案一中主控MCU側不執行協議棧。
該方案的執行方式類似於MCU行業常用的SLIP(Serial Line Internet Protocol)方案,區別在於底層使用廠商模組/晶片的AT Command命令和服務,廠商模組/晶片不需要額外再支援SLIP通訊。
at_adapter元件提供AT底層到LwIP網路介面(netif)的對接。通過netif的對接,AT通道可以無縫對接上LwIP。該模式下,SAL對上層應用提供完整的TCP/IP協議棧介面和服務。該方案的缺點是需要AT通訊模組韌體支援IP包傳輸,目前moc108已經支援該模式。
總結 綜上所述,AliOS Things提供了豐富的SAL元件和方案。AliOS Things提供的SAL框架和元件,具有以下優勢:
為主控MCU外接連線晶片場景提供完整解決方案; 可以降低上層應用開發基於外接連線晶片場景的應用的難度,提高開發效率,加速產品部署; 方便模組和裝置廠商在現有成熟的MCU產品和方案上,通過外接通訊晶片方式擴充套件網路連線能力,而不需要將先有的MCU晶片切換成WiFi或其他具有網路通訊能力的平臺。
轉自 --------------------- 作者:阿里云云棲社群 來源:CSDN 原文:https://blog.csdn.net/yunqiinsight/article/details/80133437 版權宣告:本文為博主原創文章,轉載請附上博文連結!