了解更多开源请访问:开源基础软件社区https://ost.51cto.com手机通过手机完成对汽车的控制。智能小车还实现了无感连接。无论是哪种智能车机设备,手机只需轻触智能车上的标签,即可连接到小车,并自动打开相应的操作软件,实现对小车的控制。操作简单易懂,使用方便。实现方法3861鸿蒙小车控制两个电机,开启一个热点进行手机连接。在NFC标签中写入鸿蒙小车的SSID、PSK、IP地址。用手机触碰汽车上的NFC标签与汽车建立TCP连接,同时拉起汽车控制软件,最终完成对汽车的控制。工程版系统版本/API版本:OpenHarmony3.1发布。IDE版本:DevEcoDeviceToolReleasev3.1.200。源码头文件对于下面要用到的API接口,我们要引用的头文件如下:#include#include#include//os#include"cmsis_os2.h"#include"ohos_init.h"//wifi和tcp#include"wifi_device.h"#include"wifi_hotspot.h"#include"wifi_error_code.h"#include"lwip/netifapi.h"#include"lwip/sockets.h"//io#include"iot_gpio.h"#include#include控制小轮控制:GPIO0和GPIO1控制左轮,GPIO9和GPIO10控制右轮.GPIO0和GPIO9正向使能,GPIO1和GPIO10反向使能,同时使能即停止。#defineGPIO00#defineGPIO11#defineGPIO99#defineGPIO1010voidmy_car_init(void){//初始化IoTGpioInit(GPIO0);IoTGpioInit(GPIO1);IoTGpioInit(GPIO10);IoTGpioInit(GPIO9);//IO模式hi_io_set_func(GPIO0,0);hi_io_set_func(GPIO1,0);hi_io_set_func(GPIO10,0);hi_io_set_func(GPIO9,0);//输出模式IoTGpioSetDir(GPIO0,1);IoTGpioSetDir(GPIO1,1);IoTGpioSetDir(GPIO10,1);IoTGpioSetDir(GPIO9,1);car_stop();}voidcar_backward(void){IoTGpioSetOutputVal(GPIO0,IOT_GPIO_VALUE0);//左IoTGpioSetOutputVal(GPIO1,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO9,IOT_GPIO_VALUE0);//右轮IoTGpioSetOutputVal(GPIO10,IOT_GPIO_VALUE1);}voidcar_forward(void){IoTGpioSetOutputVal(GPIO0,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO1,IOT_GPIO_VALUE0);IoTGpioSetOutputVal(GPIO9,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO10,IOT_GPIO_VALUE0);}voidcar_left(void){IoTGpioSetOutputVal(GPIO0,IOT_GPIO_VALUE0);物联网GpioSetOutputVal(GPIO1,IOT_GPIO_VALUE0);IoTGpioSetOutputVal(GPIO9,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO10,IOT_GPIO_VALUE0);}voidcar_right(void){IoTGpioSetOutputVal(GPIO0,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO1,IOT_GPIO_VALUE0);IoTGpioSetOutputVal(GPIO9,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO10,IOT_GPIO_VALUE1);}voidcar_stop(void){IoTGpioSetOutputVal(GPIO0,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO1,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO9,IOT_GPIO_VALUE1);IoTGpioSetOutputVal(GPIO10,IOT_GPIO_VALUE1);}通信WIFI回调函数配置WIFI_AP配置。注册netif结构。配置netif(配置DHCP)。关闭并打开DHCP(必须关闭并重新打开)。#defineAP_SSID"FSR"#defineAP_PSK"12345678"#define_PROT_8888#defineTCP_BACKLOG10staticstructnetif*g_lwip_netif=NULL;staticintg_apEnableSuccess=0;WifiEventg_wifiEventHandler={0};WifiError事件回调代码=OnHotspotStaJoinHandler;g_wifiEventHandler.OnHotspotStaLeave=OnHotspotStaLeaveHandler;g_wifiEventHandler.OnHotspotStateChanged=OnHotspotStateChangedHandler;//指定WiFi回调函数error=RegisterWifiEvent(&g_wifiEventHandler);//设置指定的热点配置HotspotConfigconfig={0};//初始化热点相关配置strcpy(config.ssid,AP_SSID);strcpy(config.preSharedKey,AP_PSK);config.securityType=WIFI_SEC_TYPE_PSK;config.band=HOTSPOT_BAND_TYPE_2G;//2.4GHzconfig.channelNum=7;//配置wifi热点error=SetHotspotConfig(&config);错误=启用热点();//启动dhcpg_lwip_netif=netifapi_netif_find("ap0");如果(g_lwip_netif){ip4_addr_tbp_gw;ip4_addr_tbp_ipaddr;ip4_addr_tbp_netmask;IP4_ADDR(&bp_gw,192,168,1,1);/*输入您的网关,例如:192.168.1.1*/IP4_ADDR(&bp_ipaddr,192,168,1,input1);/你的IP例如:192.168.1.1*/IP4_ADDR(&bp_netmask,255,255,255,0);/*输入您的网络掩码,例如:255.255.255.0*/netifapi_netif_set_addr(g_lwip_netif,&bp_ipaddr,&bp_netmask,off)netifapi_dhcps_stop(g_lwip_netif);netifapi_dhcps_start(g_lwip_netif,0,0);}TCP//在sock_fd监听,在new_fd接收新链接intsock_fd,new_fd;charrecvbuf[10];/******************下面是TCP服务器代码****************/structsockaddr_inserver_sock;//客户端地址信息structsockaddr_inclient_sock;intsin_size;结构sockaddr_in*cli_addr;//创建套接字if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socketiserror\r\n");退出(1);}bzero(&server_sock,sizeof(server_sock));server_sock.sin_family=AF_INET;server_sock.sin_addr.s_addr=htonl(INADDR_ANY);server_sock.sin_port=htons(_PROT_);//调用bind函数绑定套接字和地址if(bind(sock_fd,(structsockaddr*)&server_sock,sizeof(structsockaddr))==-1){perror("bindiserror\r\n");退出(1);}//调用listen函数监听(指定监听端口)if(listen(sock_fd,TCP_BACKLOG)==-1){perror("listeniserror\r\n");退出(1);}printf("开始接受\n");//从while(1)调用accept函数{sin_size=sizeof(structsockaddr_in);如果((new_fd=accept(sock_fd,(structsockaddr*)&client_sock,(socklen_t*)&sin_size))==-1){perror("accept");继续;}cli_addr=malloc(sizeof(structsockaddr));printf("接受地址\r\n");if(cli_addr!=NULL){memcpy(cli_addr,&client_sock,sizeof(s构造sockaddr));}//处理目标ssize_tret;while(1){//连接成功,接收客户端发送的数据//清空接收缓存(void)memset_s(recvbuf,sizeof(recvbuf),0,sizeof(recvbuf));//接收if((ret=recv(new_fd,recvbuf,sizeof(recvbuf),0))==-1){printf("recverror\r\n");}else{printf("服务器:%d!\n",recvbuf[0]);}if(recvbuf[0]=='1'){car??_forward();printf("car_forward!\n");}elseif(recvbuf[0]=='2'){car??_backward();printf("车回来了!");}elseif(recvbuf[0]=='3'){car??_left();}elseif(recvbuf[0]=='4'){car??_right();}elseif(recvbuf[0]=='0'){汽车停止();}}关闭(new_fd);}/**********************END***********************/线程创建和WIFI连接的WiFi回调函数/线程staticvoidHotspotStaJoinTask(void){staticcharmacAddress[32]={0};StationInfostaininfo[WIFI_MAX_STA_NUM]={0};StationInfo*sta_list_node=NULL;无符号整数大小=WIFI_MAX_STA_NUM;//获取当前连接到该AP的所有STA站信息error=GetStationList(stainfo,&size);if(error!=WIFI_SUCCESS){printf("HotspotStaJoin:getlistfail,erroris%d.\r\n",error);返回;}sta_list_node=staininfo;//打印出每个STA站的MAC地址for(uint32_ti=0;imacAddress;snprintf(macAddress,sizeof(macAddress),"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);printf("HotspotSta[%d]:macAddress=%s.\r\n",i,macAddress);}g_apEnableSuccess++;}//绑定STA站点加输入返回调函数staticvoidOnHotspotStaJoinHandler(StationInfo*info){if(info==NULL){printf("HotspotStaJoin:infoisnull.\r\n");}else{//创建连接线程序printf("NewStaJoin\n");osThreadAttr_t属性;attr.name="HotspotStaJoinTask";属性.attr_bits=0U;属性.cb_mem=NULL;属性.cb_size=0U;属性.stack_mem=NULL;attr.stack_size=2048;属性优先级=24;if(osThreadNew((osThreadFunc_t)HotspotStaJoinTask,NULL,&attr)==NULL){printf("HotspotStaJoin:创建任务失败!\r\n");}}return;}//STA退回调函数staticvoidOnHotspotStaLeaveHandler(StationInfo*info){if(info==NULL){printf("HotspotStaLeave:infoisnull.\r\n");}else{staticcharmacAddress[32]={0};unsignedchar*mac=info->macAddress;snprintf(macAddress,sizeof(macAddress),"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);printf("HotspotStaLeave:macAddress=%s,reason=%d.\r\n",macAddress,info->disconnectedReason);g_apEnableSuccess--;}return;}//状态改变回调函数staticvoidOnHotspotStateChangedHandler(intstate){printf("HotspotStateChanged:stateis%d.\r\n",state);if(state==WIFI_HOTSPOT_ACTIVE)//state=1表示启用WIFIAP模式{printf("wifihotspotactive.\r\n");}else//state=0表示禁用WIFIAP模式{printf("wifihotspotnoactive.\r\n");}}staticvoidWifi_AP_Demo(void){osThreadAttr_t属性;attr.name="WifiAPTask";属性.attr_bits=0U;属性.cb_mem=NULL;属性.cb_size=0U;属性.stack_mem=NULL;attr.stack_size=10240;属性优先级=25;if(osThreadNew((osThreadFunc_t)WifiAPTask,NULL,&attr)==NULL){printf("创建WifiAPTask失败!\r\n");}}SYS_RUN(Wifi_AP_Demo);大意是API8还没有开启NFC读取,所以NFC模块还没有写,目前只能在软件中固定连接wifi和ip,开启软件可以控制汽车了解更多开源,请访问:开源基础软件社区https://ost.51cto.com。