OpenHarmony設(shè)備開(kāi)發(fā)(七)- LWIP
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
前言
LWIP全稱為LIght Weight IP,本意便是輕量化的小型TCP協(xié)議,旨在保留TCP的功能下盡量減少對(duì)系統(tǒng)資源的占用,LWIP多用于輕量化的設(shè)備上.當(dāng)然LWIP功能不只是支持TCP協(xié)議傳輸,還支持了DHCP協(xié)議動(dòng)態(tài)分配IP地址,IP協(xié)議等等。
OpenHarmony輕量化系統(tǒng)連接WIFI便多數(shù)都為L(zhǎng)WIP協(xié)議,本文便主要介紹輕量化系統(tǒng)連接WIFI的分配IP步驟。
對(duì)于小熊派nano而言,lwip的主要頭文件都保存在了該地址下:
netif網(wǎng)絡(luò)接口
首先我們要認(rèn)識(shí)到netif結(jié)構(gòu)體,該結(jié)構(gòu)體是LWIP從硬件中抽象出來(lái)的網(wǎng)卡(網(wǎng)絡(luò)接口),并且該結(jié)構(gòu)體還是個(gè)鏈表結(jié)構(gòu),即支持多個(gè)網(wǎng)卡配置.我們使用LWIP進(jìn)行配置IP時(shí),netif結(jié)構(gòu)體必不可少。
netif結(jié)構(gòu)體的定義存放在:
介紹一些主要的變量:
struct netif *next;該變量便表示了netif是鏈表結(jié)構(gòu),提供了配置多個(gè)網(wǎng)卡的接口,當(dāng)需要配置第二個(gè)網(wǎng)絡(luò)接口時(shí),便指向該指針便可配置第二網(wǎng)絡(luò)接口,第三第四如上原理。
本文主要介紹ipv4的相關(guān)變量(因?yàn)閕pv4用的比較多)。
這三個(gè)數(shù)據(jù)分別存放了主機(jī)的IP,子網(wǎng)掩碼,網(wǎng)關(guān).(但經(jīng)過(guò)查看此數(shù)據(jù),好像小熊派nano的IP地址和子網(wǎng)掩碼反了(有可能存放相關(guān)地址的時(shí)候傳遞的變量反了?)。
進(jìn)一步查看IP,子網(wǎng)掩碼,網(wǎng)關(guān)的ip_addr_t結(jié)構(gòu)體,我們便能從里面看到了存放了ip4和ip6的地址,其中ip4變量是以無(wú)符號(hào)整數(shù)類型保存,ip4_addr_t結(jié)構(gòu)體里面只有一個(gè)unsigned int的addr變量。
我們想獲取IP,子網(wǎng)掩碼,網(wǎng)關(guān)的數(shù)據(jù)方法如下:
**char hostname[NETIF_HOSTNAME_MAX_LEN];**netif主機(jī)名稱。
**u8_t hwaddr[NETIF_MAX_HWADDR_LEN];**該設(shè)備MAC地址。
DHCP動(dòng)態(tài)分配IP
DHCP全稱為Dynamic Host Configuration Protocol,動(dòng)態(tài)主機(jī)配置協(xié)議.顧名思義,其作用便是可以動(dòng)態(tài)分配IP地址,提高IP地址的使用效率。
主要介紹小熊派nano的實(shí)現(xiàn):
- 創(chuàng)建netif結(jié)構(gòu)體,并對(duì)此初始化。
- 啟動(dòng)dhcp。
一些相關(guān)的API接口:
- err_t dhcp_is_bound(struct netif *netif);?獲取網(wǎng)絡(luò)接口的DHCP協(xié)商狀態(tài),可以使用該api循環(huán)判斷dhcp是否正常使用,判斷成功再進(jìn)行下一步工作.返回值為0即是成功。
- err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,netifapi_errt_fn errtfunc);?打印主機(jī)以及設(shè)備的IP等相關(guān)信息,debug以及了解相關(guān)信息.樣例: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內(nèi)保存的設(shè)備的IP,子網(wǎng)掩碼,網(wǎng)關(guān)信息,將ip保存到ipaddr,子網(wǎng)掩碼保存到netmask,網(wǎng)關(guān)保存到gw。
- struct netif *netifapi_netif_find(const char *name);尋找一個(gè)名為name的網(wǎng)絡(luò)接口,并將此網(wǎng)絡(luò)接口作為返回值返回。
- err_t netifapi_dhcps_start(struct netif *netif, char *start_ip, u16_t ip_num);?啟動(dòng)DHCP服務(wù)端,提供客戶端連接,常用于設(shè)備作為熱點(diǎn)時(shí)所選擇的DHCP啟動(dòng)方式。
參數(shù)一:網(wǎng)絡(luò)接口
參數(shù)二:起始IP地址
參數(shù)三:IP地址數(shù)量
其中如果DHCPv4使用默認(rèn)配置,參數(shù)二和三都需要為NULL。
- 更多的api接口可以參考netifapi.h和dhcp.h。
存放地址:device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/lwip_sack/include/lwip。
靜態(tài)分配IP
關(guān)鍵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)。
前文中有了一個(gè)獲取IP信息,這便有一個(gè)設(shè)置IP地址,我們可以通過(guò)這一個(gè)API便完成了對(duì)IP地址的分配,十分的便捷!
- 創(chuàng)建netif結(jié)構(gòu)體,并對(duì)此初始化。
- 設(shè)置IP,子網(wǎng)掩碼,網(wǎng)關(guān)。
- 調(diào)用API完成分配IP。
ip地址打印
- 直接打印IPv4地址。
- IPv4十進(jìn)制轉(zhuǎn)字符串。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??