前言
LWIP全称为LIght Weight IP,本意便是轻量化的小型TCP协议,旨在保留TCP的功能下尽量减少对系统资源的占用,LWIP多用于轻量化的设备上.当然LWIP功能不只是支持TCP协议传输,还支持了DHCP协议动态分配IP地址,IP协议等等。
OpenHarmony轻量化系统连接WIFI便多数都为LWIP协议,本文便主要介绍轻量化系统连接WIFI的分配IP步骤。
对于小熊派nano而言,lwip的主要头文件都保存在了该地址下:
netif网络接口
首先我们要认识到netif结构体,该结构体是LWIP从硬件中抽象出来的网卡(网络接口),并且该结构体还是个链表结构,即支持多个网卡配置.我们使用LWIP进行配置IP时,netif结构体必不可少。
netif结构体的定义存放在:
介绍一些主要的变量:
struct netif *next;该变量便表示了netif是链表结构,提供了配置多个网卡的接口,当需要配置第二个网络接口时,便指向该指针便可配置第二网络接口,第三第四如上原理。
本文主要介绍ipv4的相关变量(因为ipv4用的比较多)。
这三个数据分别存放了主机的IP,子网掩码,网关.(但经过查看此数据,好像小熊派nano的IP地址和子网掩码反了(有可能存放相关地址的时候传递的变量反了?)。
进一步查看IP,子网掩码,网关的ip_addr_t结构体,我们便能从里面看到了存放了ip4和ip6的地址,其中ip4变量是以无符号整数类型保存,ip4_addr_t结构体里面只有一个unsigned int的addr变量。
我们想获取IP,子网掩码,网关的数据方法如下:
**char hostname[NETIF_HOSTNAME_MAX_LEN];**netif主机名称。
**u8_t hwaddr[NETIF_MAX_HWADDR_LEN];**该设备MAC地址。
DHCP动态分配IP
DHCP全称为Dynamic Host Configuration Protocol,动态主机配置协议.顾名思义,其作用便是可以动态分配IP地址,提高IP地址的使用效率。
主要介绍小熊派nano的实现:
- 创建netif结构体,并对此初始化。
- 启动dhcp。
一些相关的API接口:
- err_t dhcp_is_bound(struct netif *netif);获取网络接口的DHCP协商状态,可以使用该api循环判断dhcp是否正常使用,判断成功再进行下一步工作.返回值为0即是成功。
- err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,netifapi_errt_fn errtfunc);打印主机以及设备的IP等相关信息,debug以及了解相关信息.样例:netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL)。
- err_t netifapi_netif_get_addr(struct netif *netif, ip4_addr_t *ipaddr, ip4_addr_t *netmask, ip4_addr_t *gw);获取netif内保存的设备的IP,子网掩码,网关信息,将ip保存到ipaddr,子网掩码保存到netmask,网关保存到gw。
- struct netif *netifapi_netif_find(const char *name);寻找一个名为name的网络接口,并将此网络接口作为返回值返回。
- err_t netifapi_dhcps_start(struct netif *netif, char *start_ip, u16_t ip_num);启动DHCP服务端,提供客户端连接,常用于设备作为热点时所选择的DHCP启动方式。
参数一:网络接口
参数二:起始IP地址
参数三:IP地址数量
其中如果DHCPv4使用默认配置,参数二和三都需要为NULL。
- 更多的api接口可以参考netifapi.h和dhcp.h。
存放地址:device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/lwip_sack/include/lwip。
静态分配IP
关键API接口为:err_t netifapi_netif_set_addr(struct netif *netif,const ip4_addr_t *ipaddr,const ip4_addr_t *netmask,const ip4_addr_t *gw)。
前文中有了一个获取IP信息,这便有一个设置IP地址,我们可以通过这一个API便完成了对IP地址的分配,十分的便捷!
- 创建netif结构体,并对此初始化。
- 设置IP,子网掩码,网关。
- 调用API完成分配IP。
ip地址打印
- 直接打印IPv4地址。
- IPv4十进制转字符串。