#2020征文-开发板# 用OLED板实现FlappyBird小游戏(下)

#2020征文-开发板# 用OLED板实现FlappyBird小游戏(下)(图片侵删)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

#2020征文-开发板# 用OLED板实现FlappyBird小游戏(下)

        这是开发板启动server的流程图:ide

#2020征文-开发板# 用OLED板实现FlappyBird小游戏(下)        在启动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


想了解更多关于鸿蒙的内容,请访问:

51CTO和华为官方战略合做共建的鸿蒙技术社区

https://harmonyos.51cto.com/#bkwz

相关文章
相关标签/搜索