(圖片侵刪)api
年末這段時間相信你們都和我同樣挺忙的,最近稍得空閒,趕忙來更新咱的FlappyBird。上次說到要加一個聯機對戰的功能,想一想這個小鳥也不適合改爲對戰類,不過不要緊,這也不妨礙我們來研究一下開發板聯網的方法。因此本文主要介紹我是如何讓開發板具有鏈接wifi並開啓socket server,而後開發基於HarmonyOS的手機遙控器,或者也能夠說成是虛擬手柄的雛形吧。提及來,這但是鴻蒙OS手機和鴻蒙Hi3861開發板之間的故事哦。網絡
我們這個Harmony Hi3861 Wifi IoT開發板原本就是爲Wifi智能家居量身定作,因此Wifi的支持必定少不了,在閱讀了各類官方文檔、代碼,又拜讀了連志安老師的幾篇文章(連接),總算是有了眉目。架構
通常來講,wifi相關的接口都在「\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\netifapi.h」頭文件中,仔細閱讀代碼中的註釋會頗有幫助。此次沒有把手機配網功能放進來,由於以爲每次運行還得手機一頓操做好麻煩,用的是直接STA模式鏈接指定AP的方式,之後能夠改進成碰一碰組網的方式,留待後續研究。併發
話很少說,上圖:app
這是整體架構圖,路由器作AP,手機和開發板分別鏈接到同一個Wifi。socket
這是開發板啓動server的流程圖:ide
在啓動socket server後,就是接受客戶端的鏈接請求,而後循環接收數據,根據指令執行動做。還有一點須要注意,那就是網絡相關的操做函數放到單獨的一個thread中執行,即後臺鏈接網絡,避免阻塞程序主線程。這裏socket server偵聽端口設置爲8888。函數
很快我就發現,不知道開發板的IP地址啊。雖然我能夠在路由器管理頁面上查看到全部設備IP,但老是不方便,總不能去哪都得找路由器管理員吧。因而我又加入了一鍵顯示IP地址的功能。具體就是調用netifapi_netif_get_addr函數(netifapi.h),函數的聲明以下:post
/* * Func Name: netifapi_netif_get_addr */ /** * @ingroup Threadsafe_Network_Interfaces * * @brief * * This is a thread safe API, used to get IP_add configuration for a network interface * (including netmask and default gateway). * It is recommended to use this API instead of netif_get_addr() * * @param[in] netif Indicates the network interface to get. * @param[in] ipaddr Indicates the IP address. * @param[in] netmask Indicates the network mask. * @param[in] gw Indicates the default gateway IP address. * * @returns * 0 : On success \n * Negative value : On failure \n * * @par Related Topics * netif_get_addr() * * @note * - netmask and/or gw can be passed NULL, if these details about the netif are not needed */ err_t netifapi_netif_get_addr(struct netif *netif, ip4_addr_t *ipaddr, ip4_addr_t *netmask, ip4_addr_t *gw);
第一個參數netif,即以前鏈接wifi用到的netif結構體指針,其餘三個分別是用來返回的ip地址、子網掩碼、網關。學習
那麼如何把返回的ip4_addr_t結構體轉換爲通用的數字加句點的字符串格式(例如192.168.1.1)呢?答案就是ip4addr_ntoa函數。
char *ip = ip4addr_ntoa(ipAddr); printf("ip: %s\n", ip); free(ip)//用完記得釋放
其實在\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\ip4_addr.h頭文件中定義好了一系列的轉換函數,他們的定義以下,咱們能夠按需使用:
u32_t ipaddr_addr(const char *cp); int ip4addr_aton(const char *cp, ip4_addr_t *addr); /** returns ptr to static buffer; not reentrant! */ char *ip4addr_ntoa(const ip4_addr_t *addr); char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); int inet_pton4(const char *src, unsigned char *dst); const char *lwip_inet_ntop4(const unsigned char *src, char *dst, u32_t size);
手機控制器方面,我在DevEcoStudio中基於鴻蒙OS作了一版App,主要實現Tcp方式鏈接到指定IP,併發送指令。但因爲手上沒有真機,故沒法調試,只能另外作了一個Android版本App代替調試,有些遺憾,但願也能借此機會拿到P40,完成這個夢想,也一睹鴻蒙OS的芳容。
文章後續內容和相關附件能夠點擊下面的原文連接前往學習
原文連接:https://harmonyos.51cto.com/posts/2675#bkwz