BabyOS Netif功能模块设计

第二版

目前master分支的代码,b_srv_tcpip 基于 b_module_netif 的接口实现了ntp同步时间。代码结构上存在问题,影响后续的扩展:b_mod_netif里的代码过度依赖lwip,如果后续TCP/UDP的传输不需要LWIP,换做uip或者WIFI模组,那么b_mod_netif里面的代码用不了,或者改动非常大。

那么重写netif这部分,达到两个目的:

① 不过度依赖任何协议栈,定义相对标准的接口,用lwip实现或者用uIP实现或者at指令驱动WIFI模组实现都可以,实现方式之间互不影响,对上层的应用也不影响。

② 能基于虚拟机调试网络功能,不依赖具体硬件方便开发者扩展b_srv_tcpip的内容。

net_2_level

将原先的1个文件b_mod_netif进行拆分:

net_2_level

重新划分后,重点是在传输层的接口定义和实现。

接口定义(见 bos/modules/inc/b_mod_netif/b_mod_trans.h):

int     bSocket(bTransType_t type, pbTransCb_t cb, void *user_data);
int     bConnect(int sockfd, char *remote, uint16_t port);
int     bBind(int sockfd, uint16_t port);
int     bListen(int sockfd, int backlog);
int     bRecv(int sockfd, uint8_t *pbuf, uint16_t buf_len, uint16_t *rlen);
int     bSend(int sockfd, uint8_t *pbuf, uint16_t buf_len, uint16_t *wlen);
int     bShutdown(int sockfd);
uint8_t bSockIsReadable(int sockfd);
uint8_t bSockIsWriteable(int sockfd);
int     bDnsParse(char *remote, pbTransDnsCb_t cb, void *user_data);
int     bPing(char *remote, uint32_t timeout_ms, pbTransPingCb_t cb, void *user_data);

当要使用LWIP时,则将b_mod_lwip加入工程。 当在虚拟机上运行时,则将b_mod_socket加入工程。

这样下面接口统一,具体的实现发生变化也不影响b_srv_tcpip的代码。

目前代码合并到了dev分支,需要各位开发者一起验一下,测试一段时间后再合入master。

基于stm32:例程仓库stm32f107_hal分支

虚拟机上运行:主仓库dev分支。BabyOS/test/netif/

net_2_level

第一版

Client和Server核心是连接,Client只包含1个连接,而Server可以存在多个连接。因此存在三个名词:客户端、服务端、网络连接。分别对应如下数据结构:

netif_struct

客户端与服务端基于网络连接,网络连接基于lwip

客户端代码运行流程:

netif_client

服务端代码运行流程:

netif_server

例子:https://gitee.com/notrynohigh/BabyOS_Example/tree/stm32f107_hal/

体验BabyOS提供的便利,快速实现TCP客户和TCP服务