更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz关注承袭徐思维老师的脚步,这个小样是在徐大神的影响下诞生的。首先放上整个demo运行的演示视频,给大家看一个最终效果,视频链接(点击观看):基于TCP控制鸿蒙Hi3861三色灯板的灯。这东西简单就不简单,复杂了也不复杂。先说下demo源码的使用方法:这里我把整个demo源码作为附件上传了,大家可以解压文件放在源码目录:applications/sample/wifi-iot/app文件夹,然后修改这个文件夹下的BUILD.gn,修改其内容为:import("//build/lite/config/component/lite_component.gni")lite_component("app"){features=["iothardware:wifi_demo",]}这里我先按照老规矩说一下大概的思路:1、PC和Hi3861开发板通过无线连接到同一个局域网。2、Hi3861作为客户端,PC作为服务器建立TCP连接。3、Hi3861作为客户端,接收PC发送的相应指令,执行相应的操作,控制三色灯板。说完大概的思路,我们再来说说操作中需要注意的一点:Hi3861烧录后测试时,需要先启动服务器(这里我直接在linux下使用netcat,小伙伴们可以完全换成自己熟悉的就好),然后复位Hi3861开发板。下面按照大体思路分为三部分来讲解代码1.PC和Hi3861开发板使用无线连接连接到同一个局域网1.1首先定义两个监听事件OnWifiConnectionChanged和OnWifiScanStateChangedstaticvoidOnWifiConnectionChanged(intstate,WifiLinkedInfo*info){if(!info)return;printf("%s%d,state=%d,info=\r\n",__FUNCTION__,__LINE__,state);PrintLinkedInfo(info);if(state==WIFI_STATE_AVALIABLE){g_connected=1;}else{g_connected=0;}}staticvoidOnWifiScanStateChanged(intstate,intsize){printf("%s%d,state=%X,size=%d\r\n",__FUNCTION__,__LINE__,state,size);}1.2定义了一个辅助函数staticvoidPrintLinkedInfo(WifiLinkedInfo*info){if(!info)return;staticcharmacAddress[32]={0};unsignedchar*mac=info->bssid;snprintf(macAddress,sizeof(macAddress),"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);printf("bssid:%s,rssi:%d,connState:%d,reason:%d,ssid:%s\r\n",macAddress,info->rssi,info->connState,info->disconnectedReason,info->ssid);}1.3开始真正的wifi连接过程(void)arg;WifiErrorCodeerrCode;WifiEventeventListener={.OnWifiConnectionChanged=OnWifiConnectionChanged,.OnWifiScanStateChanged=OnWifiScanStateChanged};WifiDeviceConfigapConfig={0};intnetId=-1;osDelay(10);errCode=RegisterWifiEvent(&eventListener);printf("RegisterWifiEvent:%d\r\n",errCode);strcpy(apConfig.ssid,"helloworld");strcpy(apConfig.preSharedKey,"12345678");apConfig.securityType=WIFI_SEC_TYPE_PSK;errCode=EnableWifi();printf("EnableWifi:%d\r\n",errCode);osDelay(10);errCode=AddDeviceConfig(&apConfig,&netId);printf("AddDeviceConfig:%d\r\n",errCode);g_connected=0;errCode=ConnectTo(netId);printf("ConnectTo(%d):%d\r\n",netId,errCode);while(!g_connected){osDelay(10);}printf("g_connected:%d\r\n",g_connected);osDelay(50);structnetif*iface=netifapi_netif_find("wlan0");if(iface){err_tret=netifapi_dhcp_start(iface);printf("netifapi_dhcp_start:%d\r\n",ret);osDelay(200);//waitDHCPservergivemeIPret=netifapi_netif_common(iface,dhcp_clients_info_show,NULL);printf("netifapi_netif_common:%d\r\n",ret);}2.Hi3861作为client,PC作为server建立TCP连接2.1首先配置TCP协议ssize_tretval=0;intsockfd=socket(AF_INET,SOCK_STREAM,0);//TCPsocketunsignedshortport=5678;structsockaddr_inserverAddr={0};serverAddr.sin_family=AF_INET;//AF_INET表示IPv4协议serverAddr.sin_port=htons(port);//端口号,从主机字节序到网络字节序if(inet_pton(AF_INET,PARAM_SERVER_ADDR,&serverAddr.sin_addr)<=0){//将主机IP地址从“点分十进制”字符串转换为标准格式(32位整数)printf("inet_ptonfailed!\r\n");gotodo_cleanup;2.2调用connect函数进行连接,这里保证连接之前if(connect(sockfd,(structsockaddr*)&serverAddr,sizeof(serverAddr))<0){printf("connectfailed!\r\n");gototo_cleanup;}printf("connecttoserver%ssuccess!\r\n",PARAM_SERVER_ADDR);2.3调用recv接口接收来自PC服务器的消息retval=recv(sockfd,&response,sizeof(response),0);if(retval<=0){printf("sendresponsefromserverfailedordone,%ld!\r\n",retval);gototo_cleanup;}response[retval]='\0';printf("recvresponse{%s}%ldfromserverdone!\r\n",response,retval);3.Hi3861作为客户端,接收PC发送的相应指令,控制板子的三色灯进行相应的操作。3.1先进行Hi3861控制三色开发板的基础设置GpioInit();IoSetFunc(RED_LED_PIN_NAME,RED_LED_PIN_FUNCTION);IoSetFunc(GREEN_LED_PIN_NAME,GREEN_LED_PIN_FUNCTION);IoSetFunc(RELLOW_LED_PIN_NAME,RELLOW_LED_PIN_FUNCTION);GpioSetDir(RED_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT);GpioSetDir(GREEN_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT);GpioSetDir(RELLOW_LED_PIN_NAME,WIFI_IOT_GPIO_DIR_OUT);3.2根据TCP协议接收到的信息,判断后选择GpioSetOutputVal控制三色灯开关if(strncmp(RED_ON,response,5)==0){printf("redon--------------");GpioSetOutputVal(RED_LED_PIN_NAME,LED_BRIGHT);}elseif(strncmp(RED_OFF,response,6)==0){printf("redoff-------------");GpioSetOutputVal(RED_LED_PIN_NAME,LED_DARK);}elseif(strncmp(GREEN_ON,response,7)==0){printf("redon---------------");GpioSetOutputVal(GREEN_LED_PIN_NAME,LED_BRIGHT);}elseif(strncmp(GREEN_OFF,response,8)==0){printf("redoff------------");GpioSetOutputVal(GREEN_LED_PIN_NAME,LED_DARK);}elseif(strncmp(RELLOW_ON,response,8)==0){printf("redon----------------");GpioSetOutputVal(RELLOW_LED_PIN_NAME,LED_BRIGHT);}elseif(strncmp(RELLOW_OFF,response,9)==0){printf("redoff------------");GpioSetOutputVal(RELLOW_LED_PIN_NAME,LED_DARK);}else{printf("errorindex");}以上所有源码都在附件中,如有问题,请留言交流ps:分享一个调试困扰我很久的一个问题就是调试过程中Hi3861的无线很不稳定,连接后会掉一会,然后再连接。我有一次以为是代码的问题,苦苦寻找后发现问题根源是我公司同时用wifi太多,占满了所有的无线信道,导致我用的小破路由器只支持2.4G一点都不稳定,这个坑我分享给大家,遇到了就跳过吧,不要重蹈我的覆辙。。。更多内容请访问:鸿蒙科技有限公司与华为官方共建的mmunityhttps://harmonyos.51cto.com/#zz
