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的内容。
将原先的1个文件b_mod_netif进行拆分:
重新划分后,重点是在传输层的接口定义和实现。
接口定义(见 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/
第一版
Client和Server核心是连接,Client只包含1个连接,而Server可以存在多个连接。因此存在三个名词:客户端、服务端、网络连接。分别对应如下数据结构:
客户端与服务端基于网络连接,网络连接基于lwip
客户端代码运行流程:
服务端代码运行流程:
例子:https://gitee.com/notrynohigh/BabyOS_Example/tree/stm32f107_hal/
体验BabyOS提供的便利,快速实现TCP客户和TCP服务