一般涉及到协议栈、拨号网络等模组,会通过串口(UART)交互,然后通过AT指令操作,如蓝牙、3/4G模块等。用过AT指令都深有体会,AT指令的流程繁琐,不同厂家的模块AT指令也有差别,有些只能单条AT指令操作,以及相关超时处理、回调等,不同的模块可能很难做多统一。一直觉得串口是一个很鸡肋的通信,但市面上依然存在,甚至越来越多的外设通过串口交互,如果有一套针对串口AT指令的的封装,对于开发来进度说会大大提高效率。
  对于Alios 的SAL,初步看来就是为了解决底层差异,而且Alios就是为物联网而生,但目前Alios 支持的MCU还比较少。SAL是开源的,后期有机会可以将此组件单独移植到其他OS或者裸机上面尝试。
————————————————————————————————————————————————————
转自:http://aliosthings.io/#/zh-cn/yq-sal?id=alios-things-%e7%bd%91%e7%bb%9c%e9%80%82%e9%85%8d%e6%a1%86%e6%9e%b6-sal

AliOS Things 网络适配框架 - SAL

摘要:很多物联网应用场景中,都需要使用主控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套接字(如socketgetaddrinfosendrecvfrom等)接口的对接。通过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.sendrecvwritereadoob等)和异步收发机制(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提供了丰富的AT组件和方案。AliOS Things提供的AT框架和组件,具有以下优势:

  • 为主控MCU外接连接芯片场景提供完整解决方案;
  • 可以降低上层应用开发基于AT场景的应用的难度,提高开发效率,加速产品部署;
  • 方便模组和设备厂商在现有成熟的MCU产品和方案上,通过AT方式扩展网络连接能力,而不需要将先有的MCU芯片切换成WiFi或其他具有网络通信能力的平台。

Crafted with by AliOS Things Team.

AliOS Things 网络适配框架 - SAL相关推荐

  1. AliOS Things网络适配框架 - SAL

    摘要: 很多物联网应用场景中,都需要使用主控MCU外接连接芯片(如WiFi.NB-IoT)的解决方案.为方便这类场景的开发,AliOS Things提供了Socket Adapter Layer(SA ...

  2. 学习C++项目——一个基于C++11简单易用的轻量级网络编程框架 1

    一个基于C++11简单易用的轻量级网络编程框架 一.项目下载.导入.编译和运行   现在准备深入学习 C++ ,先肝一个项目,这个项目是<一个基于C++11简单易用的轻量级网络编程框架>, ...

  3. 网络调度框架Retrofit2的使用与原理解析

     Retrofit是squareup公司的开源力作,和同属squareup公司开源的OkHttp,一个负责网络调度,一个负责网络执行,为Android开发者提供了即方便又高效的网络访问框架.Retro ...

  4. 老牛知点所以然-两种安卓两种网络请求框架(ksoap2-android okhttp)配置https

    什么是HTTPS 关于https与http的区别,耳朵都快被磨出茧子了,但是除了知道这玩意比http更安全之外,SSL握手阶段,到底发生了什么,也说不出一个具体的所以然来.囫囵了几篇关于安卓客户端不同 ...

  5. 第五章 网络 之 Android网络知识框架(二)

    文章目录 一.Android实现网络请求的主流方法 1.1 HttpClient (1)简介 (2)实现 1.2 HttpURLConnection (1)简介 (2)实现 1.3 对比 二.主流网络 ...

  6. android post请求_Vue 网络请求框架 axios 使用教程

    点击上方"代码集中营",设为星标 优秀文章,第一时间送达! 前期回顾 1. Vue 学习入门指南 2. Vue 入门环境搭建 3. Visual Studio Code 使用指南 ...

  7. 如何独立开发一个网络请求框架

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 目录:   前言 准备工作  开发模式 开发原则 线程 高并发 TCP/UDP 本类介绍  开发选择 功能列表 ...

  8. android网络请求框架_2020,最新APP重构:网络请求框架

    在现在的app,网络请求是一个很重要的部分,app中很多部分都有或多或少的网络请求,所以在一个项目重构时,我会选择网络请求框架作为我重构的起点.在这篇文章中我所提出的架构,并不是所谓的 最好 的网络请 ...

  9. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路--如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

最新文章

  1. css3价格斜切_CSS3倾斜skew()方法_CSS3教程_绿叶学习网
  2. python傅里叶变换例子
  3. python爬虫吧-Python爬虫案例集合
  4. 带电可擦写可编程只读存储器(24LC08B)的基本原理
  5. 密码学基础知识(七)公钥密码
  6. “你要是有这个功能就好了!”
  7. 关于XP下OpenGL的配置
  8. java list转json
  9. python怎么加锁_Python开发【笔记】:加锁的最佳方案
  10. 考研英语 词根词缀单词1-10
  11. PowerMILL宏自动化编程视频教程
  12. Android_GitHub_xUtils之DbUtils、ViewUtils、HttpUtils、BitmapUtils
  13. 对不起 我追不上你了。
  14. 蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)
  15. Multiple keywords with name ‘Capture Page Screenshot‘ found. Give the full name of the keyword you w
  16. Redis——事务 锁机制
  17. 什么是深度学习?我们为何需要深度学习?
  18. 操作系统第九次部分作业题答案
  19. 深入学习sniffer
  20. jQuery元素列表遍历方法

热门文章

  1. 邂逅“命运之师”人生巨变
  2. R DT包 datatable()的使用
  3. [独家] 阎庆民将调任天津副市长
  4. 我看过《隐秘的角落》才知道,理科生有多可怕!
  5. 如何优雅的面对一坨翔~~感悟编程代码
  6. 一致性哈希算法的原理与实现
  7. android系统firefox,Android平台Firefox——Fennec编译手记
  8. [MicroPython]STM32F407开发板DIY声光控开关
  9. conda 深度学习 环境卸载 相关命令
  10. 谁在用Python弹奏一曲东风破 - 第二期 - 蜂鸣器版