当前位置: 首页 > 科技观察

OpenHarmony的网管Socket模块的使用_0

时间:2023-03-20 18:44:32 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com一、简介Socket模块可用于数据传输,同时支持TCP和UDP协议。本期为大家介绍如何使用Socket模块实现DAYU200开发板与WindowsPC之间的数据传输(SocketTool工具)。演示环境:OpenHarmonySDKAPI版本8(3.1.5.5)。DevEcoStudio3.0Beta3。构建版本:3.0.0.900,构建于2022年3月30日。运行时版本:11.0.13+7-b1751.21amd64。二、开发步骤1、权限声明创建项目后,打开项目config.json配置文件,在模块中添加权限声明“reqPermissions”:[{"name":"ohos.permission.INTERNET"//socketpermission},{"name":"ohos.permission.GET_WIFI_INFO"//获取wifi地址权限}]2.通过TCP协议实现导入所需的socket模块和辅助模块。Logger是一个自定义的日志模块,方便快速记录和输出统一格式的日志。importsocketfrom'@ohos.net.socket';//wifi模块,用于获取当前IP地址importwififrom'@ohos.wifi';//log模块importloggerfrom'../common/Logger'to创建一个TCPSocket连接,返回一个TCPSocket对象。//tcp连接对象lettcp=socket.constructTCPSocketInstance();//目标地址和端口lettargetAddr={address:'192.168.0.168',family:1,port:0//7001/8001}(optional)subscribe订阅与TCPSocket相关的事件。订阅连接、消息、关闭事件。接收到的数据可以在message事件的回调中获取,但是需要通过resolveArrayBuffer函数进一步解析一个ArrayBuffer。aboutToAppear(){this.tcpInit()}tcpInit(){tcp.on('connect',()=>{this.status='已连接'logger.getInstance(this).debug("ontcpconnectsuccess");});tcp.on('message',value=>{this.message_recv=this.resolveArrayBuffer(value.message)logger.getInstance(this).debug(`ontcpmessage:${this.message_recv},remoteInfo:${JSON.stringify(value.remoteInfo)}`);});tcp.on('close',()=>{logger.getInstance(this).debug("ontcpclosesuccess");});}//解析ArrayBufferresolveArrayBuffer(message:ArrayBuffer):string{if(messageinstanceofArrayBuffer){letdataView=newDataView(message)logger.getInstance(this).debug(`length${dataView.byteLength}`)letstr=""for(leti=0;i{logger.getInstance(this).debug(`bindtcpsuccess`);}).catch(err=>{logger.getInstance(this).error(`bindtcpfailed${err}`);return});}连接到指定的IP地址和端口。Button('连接TCP').width('90%').height(80).margin({top:20}).type(ButtonType.Capsule).onClick(()=>{this.tcpConnect()})//连接TCPtcpConnect(){tcp.getState().then((data)=>{logger.getInstance(this).debug(`====${JSON.stringify(data)}`)if(data.isClose){this.tcpInit()}//开始连接tcp.connect({address:{address:targetAddr.address,port:8001,family:1},timeout:6000}).then(()=>{logger.getInstance(this).debug(`connectsuccess`);}).catch((error)=>{logger.getInstance(this).error(`connectfailed${JSON.stringify(error)}`);})})}发送数据。Button('发送TCP消息').width('90%').height(80).margin({top:20}).type(ButtonType.Capsule).onClick(()=>{this.tcpSend()})//发送TCP消息tcpSend(){//查看状态tcp.getState().then((data)=>{logger.getInstance(this).debug(`====${JSON.stringify(data)}`)//已连接,发送数据if(data.isConnected){//发送消息tcp.send({data:this.message_send,}).then(()=>{logger.getInstance(this).debug(`发送成功`);}).catch((error)=>{logger.getInstance(this).error(`发送失败${JSON.stringify(error)}`);})}else{logger.getInstance(this).error(`notconnect`);}})}Socket连接使用后,会主动关闭。Button('关闭TCP连接').width('90%').height(80).margin({top:20}).type(ButtonType.Capsule).onClick(()=>{this.tcpClose()})//关闭TCP连接tcpClose(){tcp.close().then(()=>{this.status='disconnected'logger.getInstance(this).debug(`tcp.closesuccess`)}).catch((err)=>{logger.getInstance(this).error(`tcp.closeerror:${JSON.stringify(err)}`)})tcp.off('close');tcp.off('消息');tcp.off('connect');}3.通过UDP协议实现导入所需的socket模块和辅助模块。Logger是一个自定义的日志模块,方便快速记录和输出统一格式的日志。importsocketfrom'@ohos.net.socket';//wifi模块,用于获取当前IP地址importwififrom'@ohos.wifi';//log模块importloggerfrom'../common/Logger'to创建一个UDPSocket连接,返回一个UDPSocket对象。//udp连接对象letudp=socket.constructUDPSocketInstance();//目标地址和端口lettargetAddr={address:'192.168.0.168',family:1,port:0//7001/8001}(可选)订阅UDPSocket-相关的订阅事件。订阅监听、消息、关闭事件。接收到的数据可以在message事件的回调中获取,但是需要通过resolveArrayBuffer函数进一步解析一个ArrayBuffer。aboutToAppear(){this.udpInit()}udpInit(){udp.on('listening',()=>{logger.getInstance(this).debug("onudplisteningsuccess");});udp.on('message',value=>{this.message_recv=this.resolveArrayBuffer(value.message)logger.getInstance(this).debug(`onudpmessage:${this.message_recv},remoteInfo:${JSON.stringify(value.remoteInfo)}`);});udp.on('close',()=>{logger.getInstance(this).debug(`onudpclosesuccess`);});}//解析ArrayBufferresolveArrayBuffer(message:ArrayBuffer):string{if(messageinstanceofArrayBuffer){letdataView=newDataView(message)logger.getInstance(this).debug(`length${dataView.byteLength}`)letstr=""for(leti=0;i{logger.getInstance(this).debug(`bindupdsuccess`);}).catch((err)=>{logger.getInstance(this).error(`bindupdfailed${JSON.stringify(err)}`);})}发送数据。Button('SendUDPmessage').width('90%').height(80).margin({top:50}).type(ButtonType.Capsule).onClick(()=>{this.udpSend()})//发送UDP消息udpSend(){//查看状态udp.getState().then((data)=>{logger.getInstance(this).debug(`====${JSON.stringify(data)}`)//如果关闭,重新初始化if(data.isClose){this.udpInit()}//如果绑定,发送数据if(data.isBound){udp.send({data:this.message_send,address:{address:targetAddr.address,port:7001,family:1}}).then(()=>{logger.getInstance(this).debug(`发送成功`);}).catch((error)=>{logger.getInstance(this).error(`sendfailed${typeoferror.code}`);})}})}Socket连接使用后,会主动关闭。Button('CloseUDP').width('90%').height(80).margin({top:20}).type(ButtonType.Capsule).onClick(()=>{this.udpClose()})udpClose(){udp.close().then(()=>{logger.getInstance(this).debug("udp.closesuccess");}).catch((err)=>{logger.getInstance(this).error(`udp.closeerror:${JSON.stringify(err)}`)})udp.off('message');udp.off('监听');udp.off('close');}三、效果展示打开windows系统的SocketTool工具,分别创建TCPServer和UDPServer,监听端口分别为8001和7001。点击DAYU200开发板应用程序上的“连接”按钮,Socket工具会显示已连接。点击DAYU200开发板应用程序上的“发送TCP消息”按钮,Socket工具会显示接收到的消息。在套接字工具上输入要回复的信息,点击“发送数据”按钮。点击DAYU200开发板应用程序上的“发送UDP消息”按钮,Socket工具的UDPServer栏会显示收到的消息。在套接字工具上输入要回复的信息,点击“发送数据”按钮。4、思考总结TCP是面向连接的协议。在发送和接收数据之前,必须与对方建立可靠的连接。UDP是一种无连接协议。数据传输前,源端与终端不建立连接,因此TCP方式优于UDP方式。又一个连接过程。getState接口有3个状态值,isBound和isClose都是udp/tcp使用的,isConnected是tcp使用的。{“isBound”:true,“isClose”:false,“isConnected”:true}使用Socket工具回复消息后,DAYU200端如果要显示收到的消息,需要重新发送消息。五、参考资料1、HarmonyOSAPI参考。https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-net-socket-0000001144636978。2.OpenHarmonyGitee示例指南。https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/connectivity/socket-connection.md。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。