av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

鴻蒙用OLED板實(shí)現(xiàn)FlappyBird小游戲(下)

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos./#zz

年底這段時(shí)間相信大家都和我一樣挺忙的,最近稍得空閑,趕緊來(lái)更新咱的FlappyBird。上次說(shuō)到要加一個(gè)聯(lián)機(jī)對(duì)戰(zhàn)的功能,想想這個(gè)小鳥(niǎo)也不適合改成對(duì)戰(zhàn)類,不過(guò)沒(méi)關(guān)系,這也不妨礙咱們來(lái)研究一下開(kāi)發(fā)板聯(lián)網(wǎng)的方法。所以本文主要介紹我是如何讓開(kāi)發(fā)板具備連接wifi并開(kāi)啟socket server,然后開(kāi)發(fā)基于HarmonyOS的手機(jī)遙控器,或者也可以說(shuō)成是虛擬手柄的雛形吧。說(shuō)起來(lái),這可是鴻蒙OS手機(jī)和鴻蒙Hi3861開(kāi)發(fā)板之間的故事哦。

咱們這個(gè)Harmony Hi3861 Wifi IoT開(kāi)發(fā)板本來(lái)就是為Wifi智能家居量身定做,所以Wifi的支持一定少不了,在閱讀了各種官方文檔、代碼,又拜讀了連志安老師的幾篇文章(鏈接),總算是有了眉目。

一般來(lái)說(shuō),wifi相關(guān)的接口都在“\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\netifapi.h”頭文件中,仔細(xì)閱讀代碼中的注釋會(huì)很有幫助。這次沒(méi)有把手機(jī)配網(wǎng)功能放進(jìn)來(lái),因?yàn)橛X(jué)得每次運(yùn)行還得手機(jī)一頓操作好麻煩,用的是直接STA模式連接指定AP的方式,以后可以改進(jìn)成碰一碰組網(wǎng)的方式,留待后續(xù)研究。

話不多說(shuō),上圖:

這是總體架構(gòu)圖,路由器做AP,手機(jī)和開(kāi)發(fā)板分別連接到同一個(gè)Wifi。

這是開(kāi)發(fā)板啟動(dòng)server的流程圖:

在啟動(dòng)socket server后,就是接受客戶端的連接請(qǐng)求,然后循環(huán)接收數(shù)據(jù),根據(jù)指令執(zhí)行動(dòng)作。還有一點(diǎn)需要注意,那就是網(wǎng)絡(luò)相關(guān)的操作函數(shù)放到單獨(dú)的一個(gè)thread中執(zhí)行,即后臺(tái)連接網(wǎng)絡(luò),避免阻塞程序主線程。這里socket server偵聽(tīng)端口設(shè)置為8888。

很快我就發(fā)現(xiàn),不知道開(kāi)發(fā)板的IP地址啊。雖然我可以在路由器管理頁(yè)面上查看到所有設(shè)備IP,但總是不方便,總不能去哪都得找路由器管理員吧。于是我又加入了一鍵顯示IP地址的功能。具體就是調(diào)用netifapi_netif_get_addr函數(shù)(netifapi.h),函數(shù)的聲明如下:

 
 
 
 
  1. /*
  2. * Func Name: netifapi_netif_get_addr
  3. */
  4. /**
  5. * @ingroup Threadsafe_Network_Interfaces
  6. *
  7. * @brief
  8. *
  9. * This is a thread safe API, used to get IP_add configuration for a network interface
  10. * (including netmask and default gateway).
  11. * It is recommended to use this API instead of netif_get_addr()
  12. *
  13. * @param[in] netif Indicates the network interface to get.
  14. * @param[in] ipaddr Indicates the IP address.
  15. * @param[in] netmask Indicates the network mask.
  16. * @param[in] gw Indicates the default gateway IP address.
  17. *
  18. * @returns
  19. * 0 : On success \n
  20. * Negative value : On failure \n
  21. *
  22. * @par Related Topics
  23. * netif_get_addr()
  24. *
  25. * @note
  26. * - netmask and/or gw can be passed NULL, if these details about the netif are not needed
  27. */
  28. err_t netifapi_netif_get_addr(struct netif *netif,
  29. ip4_addr_t *ipaddr,
  30. ip4_addr_t *netmask,
  31. ip4_addr_t *gw);

 第一個(gè)參數(shù)netif,即之前連接wifi用到的netif結(jié)構(gòu)體指針,其他三個(gè)分別是用來(lái)返回的ip地址、子網(wǎng)掩碼、網(wǎng)關(guān)。

那么如何把返回的ip4_addr_t結(jié)構(gòu)體轉(zhuǎn)換為通用的數(shù)字加句點(diǎn)的字符串格式(例如192.168.1.1)呢?答案就是ip4addr_ntoa函數(shù)。

 
 
 
 
  1. char *ip = ip4addr_ntoa(ipAddr);
  2. printf("ip: %s\n", ip);
  3. free(ip)//用完記得釋放

 其實(shí)在\vendor\hisi\hi3861\hi3861\third_party\lwip_sack\include\lwip\ip4_addr.h頭文件中定義好了一系列的轉(zhuǎn)換函數(shù),他們的定義如下,我們可以按需使用:

 
 
 
 
  1. u32_t ipaddr_addr(const char *cp);
  2. int ip4addr_aton(const char *cp, ip4_addr_t *addr);
  3. /** returns ptr to static buffer; not reentrant! */
  4. char *ip4addr_ntoa(const ip4_addr_t *addr);
  5. char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen);
  6. int inet_pton4(const char *src, unsigned char *dst);
  7. const char *lwip_inet_ntop4(const unsigned char *src, char *dst, u32_t size);

 手機(jī)控制器方面,我在DevEcoStudio中基于鴻蒙OS做了一版App,主要實(shí)現(xiàn)Tcp方式連接到指定IP,并發(fā)送指令。但由于手上沒(méi)有真機(jī),故無(wú)法調(diào)試,只能另外做了一個(gè)Android版本App代替調(diào)試,有些遺憾,希望也能借此機(jī)會(huì)拿到P40,完成這個(gè)夢(mèng)想,也一睹鴻蒙OS的芳容。

這是在DevEcoStudio中的工程截圖:

模擬器運(yùn)行起來(lái)長(zhǎng)這樣:

就是模擬器沒(méi)法聯(lián)網(wǎng),比較無(wú)奈。不過(guò)這不妨礙做一個(gè)Android版本用來(lái)測(cè)試,核心代碼如下:

 
 
 
 
  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. //添加按鈕事件回調(diào)
  7. this.findViewById(R.id.btn_go).setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View view) {
  10. new Thread(new Runnable() {
  11. @Override
  12. public void run() {
  13. EditText editIp = findViewById(R.id.edit_ip);//界面添加了一個(gè)IP地址輸入框
  14. String ip = editIp.getText().toString();
  15. sendCmd(ip);//向指定IP發(fā)送指令
  16. }
  17. }).start();
  18. }
  19. });
  20. }
  21. private Socket socket;
  22. private void sendCmd(String ipAddr){
  23. int port = 8888;//開(kāi)發(fā)板socket server監(jiān)聽(tīng)端口號(hào)8888
  24. try {
  25. if(socket == null){
  26. socket = new Socket(ipAddr, port);//創(chuàng)建socket客戶端
  27. Log.i("JoyStick", "Create socket!!");
  28. }
  29. String cmdData = "A";//發(fā)送一個(gè)A
  30. byte data[] = cmdData.getBytes();
  31. socket.getOutputStream().write(data);
  32. Log.i("JoyStick", "Send success!!");
  33. showMessage("Send success!", Toast.LENGTH_SHORT);
  34. }
  35. catch (Exception e)
  36. {
  37. e.printStackTrace();
  38. Log.e("JoyStick", e.toString());
  39. showMessage("Send Error!\n" + e.toString(), Toast.LENGTH_SHORT);
  40. }
  41. }
  42. }

 APP在我的mate20上運(yùn)行界面如下:

這里只是發(fā)送了一種指令“A",因?yàn)镕lappyBird只用到了一個(gè)控制按鈕,如果考慮通用性的話,可以制定一套協(xié)議,實(shí)現(xiàn)手柄所有按鍵的指令發(fā)送。

例如:左L,右R,上U,下D,按鍵A/B/P/Q等,留待以后完善。

好了,編譯、燒板、運(yùn)行。實(shí)際操作起來(lái),手感還是不錯(cuò)的,上圖:

這是按S2顯示IP演示:

這是手機(jī)控制演示:

這是演示視頻:

https://harmonyos./show/2767

代碼奉上:

https://gitee.com/pleiades/harmonyos_flappy_bird

感謝大家的支持~

后續(xù)打算將一些套件沒(méi)有的外設(shè)納入進(jìn)來(lái),比如GPS模塊,攝像頭,藍(lán)牙之類的,應(yīng)該能碰撞出更多的創(chuàng)意火花,大家覺(jué)得如何呢?

?著作權(quán)歸作者和HarmonyOS技術(shù)社區(qū)共同所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos./#zz


網(wǎng)頁(yè)名稱:鴻蒙用OLED板實(shí)現(xiàn)FlappyBird小游戲(下)
本文鏈接:http://uogjgqi.cn/article/dpjogdd.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流