AliOS Things網絡適配框架 - SAL

摘要: 不少物聯網應用場景中,都須要使用主控MCU外接鏈接芯片(如WiFi、NB-IoT)的解決方案。爲方便這類場景的開發,AliOS Things提供了Socket Adapter Layer(SAL)框架和組件方案node

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組件能夠很大程度上提升應用層開發的效率,顯著下降應用層開發的難度。dom

此外,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鏈接方式。socket

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的訪問。ui

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或其餘具備網絡通訊能力的平臺。
點擊查看原文

相關文章
相關標籤/搜索