1. 程式人生 > >AliOS Things 網路適配框架

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  版權宣告:本文為博主原創文章,轉載請附上博文連結!