更多开源请访问:51CTO开源基础软件社区https://ost.51cto.comOH系统版本说明:OpenHarmony3.1ReleaseIDE:3.0.0.900实现语言:JS1、TCPJS接口(一)接口分析参考地址:Socket连接TCP通信过程:初始TCP————>BindIP————>ConnectTargetIP————>发送/接收初始化IP相关配置:-参考模块:importsocketfrom'@ohos.net.socket'-添加权限:ohos.permission.INTERNET,ohos.permission.GET_WIFI_INFO-创建对象:lettcp=socket.constructTCPSocketInstance();绑定IP和端口号bind(address:NetAddress,callback:AsyncCallback):void绑定IP地址和端口,端口可以指定也可以由系统随机分配。使用回调方法作为异步方法。所需权限:ohos.permission.INTERNET系统能力:SystemCapability.Communication.NetStack示例:lettcp=socket.constructTCPSocketInstance();tcp.bind({address:'192.168.xx.xxx',port:xxxx,family:1},err=>{if(err){console.log('bindfail');return;}console.log('bindsuccess');})连接目标IPconnect(options:TCPConnectOptions,callback:AsyncCallback):void连接到指定的IP地址和端口。使用回调方法作为异步方法。所需权限:ohos.permission.INTERNET系统能力:SystemCapability.Communication.NetStack示例:lettcp=socket.constructTCPSocketInstance();tcp.connect({地址:{地址:'192.168.xx.xxx',端口:xxxx,family:1},timeout:6000},err=>{if(err){console.log('connectfail');return;}console.log('connectsuccess');})发送/接收数据//发送Datasend(options:TCPSendOptions,callback:AsyncCallback):void通过TCPSocket连接发送数据。使用回调方法作为异步方法。注意:只有调用connect方法成功后才能调用该方法。所需权限:ohos.permission.INTERNET系统能力:SystemCapability.Communication.NetStack示例:tcpSend(){tcp.send({data:this.app_msg,},err=>{if(err){console.log('send失败');返回;}});},//接收数据并将数据解析为Stringon(type:'message',callback:Callback<{message:ArrayBuffer,remoteInfo:SocketRemoteInfo}>):void订阅接收TCPSocket连接消息事件。使用回调方法作为异步方法。系统能力:SystemCapability.Communication.NetStacktcp.on('message',value=>{console.log("onmessage")letbuffer=value.messageletdataView=newDataView(buffer)letstr=""for(leti=0;i{console.log("onmessage")letbuffer=value.messageletdataView=newDataView(buffer)letstr=""for(leti=0;i{console.log("onconnect")});tcp.on('close',()=>{console.log("onclose")});//绑定IP地址和端口。让bindAddress={地址:wifi.getIpInfo().ipAddress,端口:1234,家庭:1};tcp.bind(bindAddress,err=>{if(err){console.log('绑定失败');return;}console.log('绑定成功');prompt.showToast({message:"绑定成功",})});},第二个按钮用于连接Hi3861:tcpConnect(){prompt.showToast({message:'wifiAddr'+wifi.isConnected()+wifi.getIpInfo().ipAddress,});//letpromise=tcp.connect({address:{address:'192.168.137.92',port:8888,family:1},timeout:6000});//promise.then(()=>{//console.log('连接成功')//prompt.showToast({//message:"连接成功",//});//}).catch(err=>{//prompt.showToast({//message:"连接失败",//});//console.log('连接失败');//});tcp.connect({address:{address:'192.168.137.92',port:8888,family:1},timeout:6000},err=>{if(err){console.log('connectfail');提示.showToast({message:"connectfail",});return;}console.log('connectsuccess');prompt.showToast({message:"connectsuccess",});})},第三个按钮实现发送数据:tcpSend(){tcp.send({data:this.app_msg,},err=>{if(err){console.log('sendfail');prompt.showToast({message:"sendfail",});返回;}prompt.showToast({message:"发送成功"})});},2、Hi3861TCP(1)初始化参考熊派开发板TCP服务器案例主要任务是开启wifi,获取周边wifi列表。#defineSELECT_WLAN_PORT"wlan0"intWifiConnect(constchar*ssid,constchar*psk){WifiScanInfo*info=NULL;无符号整数大小=WIFI_SCAN_HOTSPOT_LIMIT;静态结构netif*g_lwip_netif=NULL;操作系统延迟(200);printf("-系统初始化-->\r\n");//初始化WIFIWiFiInit();//开启WIFIif(EnableWifi()!=WIFI_SUCCESS){printf("EnableWififailed,error=%d\r\n",error);返回-1;}//判断WIFI是否激活if(IsWifiActive()==0){printf("Wifi站点未激活.\r\n");返回-1;}//分配空间,保存WiFi信息info=malloc(sizeof(WifiScanInfo)*WIFI_SCAN_HOTSPOT_LIMIT);如果(信息==NULL){返回-1;}//轮询查找WiFi列表do{//重置标志ssid_count=0;g_staScanSuccess=0;//开始扫描Scan();//等待扫描结果WaitSacnResult();//获取扫描列表error=GetScanInfoList(info,&size);}while(g_staScanSuccess!=1);//连接指定的WiFi热点for(uint8_ti=0;i\r\n");//打印获取到的IP信息netifapi_netif_common(g_lwip_netif,dhcp_clients_info_show,NULL);休息;}printf("<--DHCP状态:进行中-->\r\n");操作系统延迟(100);}osDelay(100);return0;}(2)连接指定wifi作为TCPServer,创建socketserver,监听指定IP端口char*buf="Hello!I'mBearPi-HM_NanoTCPServer!";staticvoidTCPServerTask(void){//服务器地址信息structsockaddr_inserver_sock;//客户端地址信息structsockaddr_inclient_sock;intsin_size;结构sockaddr_in*cli_addr;//连接WifiWifiConnect("r1","88888889");//创建套接字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函数绑定socket和addressif(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");//从队列中调用accept函数while(1){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");如果(cli_addr!=NULL){memcpy(cli_addr,&client_sock,sizeof(structsockaddr));}//处理目标ssize_tret;while(1){if((ret=recv(new_fd,recvbuf,sizeof(recvbuf),0))==-1){printf("接收错误\r\n");}printf("接收:%s\r\n",recvbuf);睡觉(2);if((ret=send(new_fd,buf,strlen(buf)+1,0))==-1){perror("发送:");}睡眠(2);}关闭(new_fd);}}3.测试Hi3861和大鱼200连接同一个wifi,并提前匹配好IP地址和端口:连接后Hi3861只要收到数据就会返回一个字符串,Hi3861收到的数据可以通过串口:想了解更多开源内容请访问:51CTO开源基础软件社区https://ost.51cto.com