了解更多开源请访问:开源基础软件社区https://ost.51cto.com前言LWIP代表LIghtWeightIP,本意是做一个轻量级的小型TCP协议,目的是在保留TCP功能的同时,尽量减少对系统资源的占用。LWIP主要用于轻量级设备。当然,LWIP的功能不仅支持TCP协议传输,还支持DHCP协议动态分配IP地址、IP协议等。大多数连接WIFI的OpenHarmony轻量级系统都使用LWIP协议。本文主要介绍轻量级系统连接WIFI的IP分配步骤。对于小熊派nano,lwip的主要头文件存放在这个地址下://vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/lwipnetifnetworkinterface首先我们要认识netif结构,也就是网卡(网络接口)由LWIP从硬件抽象出来,结构也是链表结构,支持多种网卡配置。当我们使用LWIP配置IP时,netif结构是必不可少的。netif结构的定义存放在:vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/lwip/netif.h引入一些主要的变量:structnetif*next;这个变量表示netif是一个链表结构,提供了配置多个网卡的接口。当需要配置第二个网络接口时,指向这个指针来配置第二个网络接口。第三、四原则同上。本文主要介绍ipv4的相关变量(因为ipv4用的比较多)。这三个数据分别存储主机的IP、子网掩码和网关。(但是查了这个数据,好像熊派nano的IP地址和子网掩码是反的(有可能是存储相关地址时传递的变量反了)?)。进一步查看IP、子网掩码、网关的ip_addr_t结构,我们可以从中看出存放ip4和ip6的地址。ip4变量是以unsignedinteger类型存储的,ip4_addr_t结构中只包含一个unsignedint的addr变量。我们要获取IP、子网掩码和网关的数据如下:staticstructnetif*g_lwip_netif=NULL;//创建结构体g_lwip_netif->ip_addr.u_addr.ip4.addrg_lwip_netif->netmask.u_addr.ip4.addrg_lwip_netif->gw.u_addr.ip4.addr**charhostname[NETIF_HOSTNAME_MAX_LEN];**netifhostname.**u8_thwaddr[NETIF_MAX_HWADDR_LEN];**设备的MAC地址。DHCP动态分配IPDHCP全称为DynamicHostConfigurationProtocol,动态主机配置协议。顾名思义,它的作用就是动态分配IP地址,提高IP地址的使用效率。主要介绍BearPiNano的实现:创建netif结构体并初始化。启动DHCP。静态结构netif*g_lwip_netif=NULL;//创建结构体g_lwip_netif=netifapi_netif_find("wlan1");if(g_lwip_netif)//判断dhcp是否初始化成功{dhcp_start(g_lwip_netif);//启动DHCPprintf("开始dhcp");}一些相关的API接口:err_tdhcp_is_bound(structnetif*netif);获取网络接口的DHCP协商状态,可以通过这个api循环判断dhcp是否正常使用,判断成功后再进行下一步。返回值为0表示成功。err_tnetifapi_netif_common(structnetif*netif,netifapi_void_fnvoidfunc,netifapi_errt_fnerrtfunc);打印主机和设备IP等相关信息,调试了解相关信息。示例:netifapi_netif_common(g_lwip_netif、dhcp_clients_info_show、NULL)。err_tnetifapi_netif_get_addr(structnetif*netif,ip4_addr_t*ipaddr,ip4_addr_t*netmask,ip4_addr_t*gw);获取netif中保存的设备的IP、子网掩码和网关信息,ip保存到ipaddr,子网掩码保存到netmask,网关保存到gw。structnetif*netifapi_netif_find(constchar*name);找到一个名为name的网络接口,并将这个网络接口作为返回值返回。err_tnetifapi_dhcps_start(structnetif*netif,char*start_ip,u16_tip_num);启动DHCP服务器并提供客户端连接。它通常用作设备用作热点时选择的DHCP启动方法。参数1:网络接口参数2:起始IP地址参数3:IP地址个数其中,如果DHCPv4使用默认配置,参数2和3都需要为NULL。netifapi_dhcps_start(g_lwip_netif,0,0);更多api接口请参考netifapi.h和dhcp.h。存储地址:device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/lwip_sack/include/lwip。静态IP分配的关键API接口是:err_tnetifapi_netif_set_addr(structnetif*netif,constip4_addr_t*ipaddr,constip4_addr_t*netmask,constip4_addr_t*gw)。上一篇文章中有IP信息的获取,有IP地址的设置。我们可以通过这个API完成IP地址的分配,非常方便!创建一个netif结构并初始化它。设置IP、子网掩码、网关。调用API完成IP分配。静态结构netif*g_lwip_netif=NULL;//创建应该结构g_lwip_netif=netifapi_netif_find("wlan1");ip4_addr_tbp_gw;ip4_addr_tbp_ipaddr;ip4_addr_tbp_netmask;IP4_ADDR(&bp_ipaddr,192,168,1,110);IP4_ADDR(&bp_gw,192,168,1,1);IP4_ADDR(&bp_netmask,255,255,255,0);netifapi_netif_set_addr(g_lwip_netif,&bp_ipaddr,&bp_netmask,&bp_gw);ipaddressprint直接打印IPv4地址。ip4_addr_tIpv4_Addr;unsignedchar*read=(unsignedchar*)&Ipv4_Addr.addr;for(inti=0;i<4;i++){printf("%d",*(read+i));如果(i!=3)printf(".");否则printf("\n");}IPv4十进制转换字符串。ip4_addr_tIpv4_Addr;constunsignedintnum=Ipv4_Addr.addr;charstrTemp[20];//存储IPV4地址sprintf(strTemp,"%d.%d.%d.%d",(num&0x000000ff),(num&0x0000ff00)>>8,(num&0x00ff0000)>>16,(num&0xff000000)>>24);要了解更多关于开源的信息,请访问:https://ost.51cto.com。
