更多内容请访问:与华为共建的鸿蒙技术社区官方https://harmonyos.51cto.com1.介绍在#developmentboard漂移计划#小车控制基于简单和复杂的按钮控制,实现小车上电后自动连接指定WIFI,并建立一个UDPServer监听指定端口的数据。电脑作为UDPClient连接到小车的相应端口,通过发送字符串控制小车的状态。以下代码基于OpenHarmony-v3.0-LTS编译测试。2、WIFI连接wifi连接的实现代码使用了润和Gitee中的wifi_connecter.c和wifi_connecter.h。将这两个文件分别放到car目录下的src和include中,修改Car目录下的BUILD.gn和car_main在.c中加入如下代码,详细修改说明如下:2.1.添加并编译wifi_connecter.cstatic_library("car"){sources=[......"src/wifi_connecter.c",]}2.2。在applications\sample\wifi-iot\app\car\BUILD.gn的include_dirs中添加//applications/sample/wifi-iot/app/car/include这样就可以打包wifi_connecter.h了,因为wifi_device.h在wifi_connecter.h中很有用,需要添加//foundation/communication/wifi_lite/interfaces/wifiservice。“//device/hisilicon/hispark_pegasus/sdk_liteos/third_party/lwip_sack/include”中也需要wifi_connecter.h中的“lwip/netifapi.h”和“lwip/api_shell.h”,所以需要添加如下路径。include_dirs=[......"//applications/sample/wifi-iot/app/car/include","//foundation/communication/wifi_lite/interfaces/wifiservice","//device/hisilicon/hispark_pegasus/sdk_liteos/third_party/lwip_sack/include",]2.3car_main.c中参考如下修改,添加wifi_connecter.h包含,将“SSIDABCD”改为你要连接的WIFISSID,“MIMA1234”填写WIFI密码。#include"wifi_connecter.h"......staticvoidCarDemoTask(void*arg){...//setupyourAPparamsWifiDeviceConfigapConfig={0};strcpy(apConfig.ssid,"SSIDABCD");strcpy(apConfig.preSharedKey,"MIMA1234");apConfig.securityType=WIFI_SEC_TYPE_PSK;intnetId=ConnectToHotspot(&apConfig);printf("[CarDemo]ConnectToHotspotdonenetId=%d!\n",netId);}securityType枚举如下,根据你设置的加密WIFI方式选择,typedefenum{/**Invalidsecuritytype*/WIFI_SEC_TYPE_INVALID=-1,/**Open*/WIFI_SEC_TYPE_OPEN,/**WiredEquivalentPrivacy(WEP)*/WIFI_SEC_TYPE_WEP,/**Pre-sharedkey(PSK)*/WIFI_SEC_TYPE_PSK,/**SimultaneousAuthenticationofEquals(SAE)*/WIFI_SEC_TYPE_SAE,}WifiSecurityType;您可以通过ConnectToHotspot()轻松连接到指定的WIFI。3、UDPServer的实现3.1UDPServer的实现代码可以使用“lwip”在“//device/hisilicon/hispark_pegasus/sdk_liteos/third_party/lwip_sack/include”(WIFI连接的实现中已经加入该目录)中hispark_pegasus/sockets.h",代码如下#include"lwip/sockets.h"staticcharresponse[]="\nSucess.\n";staticcharmessage[128]="";voidUdpServer(unsignedshortport){ssize_tretval=0;intneedfb=0;intsockfd=socket(AF_INET,SOCK_DGRAM,0);//UDP套接字structsockaddr_inclientAddr={0};socklen_tclientAddrLen=sizeof(clientAddr);structsockaddr_inserverAddr={0};serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(port);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);retval=bind(sockfd,(structsockaddr*)&serverAddr,sizeof(serverAddr));if(retval<0){printf("bindfailed,%ld!\r\n",retval);gotodo_cleanup;}printf("bindtoport%dsuccess!\r\n",port);while(1){needfb=0;memset(message,0,sizeof(message));retval=recvfrom(sockfd,消息,sizeof(消息),0,(结构ckaddr*)&clientAddr,&clientAddrLen);if(retval>0){printf("recvmessage{%s}%lddone!\r\n",message,retval);printf("peerinfo:ipaddr=%s,port=%d\r\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));if(strncmp("forward",message,7)==0){needfb=1;car_go_forward();}if(strncmp("返回",消息,4)==0){needfb=1;car_go_back();}if(strncmp("left",message,4)==0){needfb=1;car_turn_left();}if(strncmp("right",message,5)==0){needfb=1;car_turn_right();}if(strncmp("stop",message,4)==0){needfb=1;car_stop();}if(needfb==1){retval=sendto(sockfd,response,strlen(response),0,(structsockaddr*)&clientAddr,sizeof(clientAddr));if(retval>0){printf("sendresponse{%s}%lddone!\r\n",response,retval);}else{printf("sendfailed,%ld!\r\n",retval);}}}}do_cleanup:printf("do_cleanup...\r\n");close(sockfd);}需要注意的是在每次检查数据recvfrom()前memset(message,0,sizeof(message))清一下其前的数据收到“前进”、“后退”、“左”、“右”、“停”后,执行相应的小车控制功能,回复“成功”。3.2调用UDPServer在Task的最后调用UdpServer()传入端口函数即可,这里端口使用62021staticvoidCarDemoTask(void*arg){......UdpServer(62021);printf([CarDemo]createCarDemoTask!\n");}4.编译4.1解压附件car.zip,放到applications\sample\wifi-iot\app\下,如图4.2修改applications/sample/wifi-iot/app/BUILD.gnimport("//build/lite/config/component/lite_component.gni")lite_component("app"){features=["car",]}4.3电机控制需要使用PWM,所以需要先开启PWM功能,开启方式为如下device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk#CONFIG_PWM_SUPPORTisnotset改为CONFIG_PWM_SUPPORT=y4.4进入代码根目录,执行hbsetinput。(当前目录)选择wifiiot_hispark_pegasus,执行hbbuild-brelease-fsoon@soon-u20:~/ohos300_iot$hbset[OHOSINFO]Inputcodepath:.OHOSWhichproductdoyouneed?wifiiot_hispark_pegasussoon@soon-u20:~/ohos300_iot$hbbuild-brelease-f4。5使用HiBurn或VisualStudioCode烧录,参考使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板5.功能测试5.1从串口日志中获取小车IP,如下图所示,成功连接WIFI获取IP并打印如下,例如此处获取的IP为192.168.123.2475.2电脑端测试软件为附件SocketTool2。压缩,解压缩然后直接运行下面的步骤创建一个UDPClient。建立连接后,可以在数据发送窗口发送文本数据“前进”、“后退”、“左转”、“右转”、“停止”来控制小车,小车接受成功后,回复Success为如图6所示。总结本例实现了一个简单的UDP控制小车demo,但是没有任何状态反馈,比如WIFI连接是否成功,连接成功后的IP显示等。这部分读者可以使用OLED屏来改善。本文相关设备来自鸿蒙科技社区【开发板漂移计划】https://harmonyos.51cto.com/resource/1289https://harmonyos.51cto.com/resource/1290更多信息请访问:和华为Harmonyos官方技术社区https://harmonyos.51cto.com
