优化udp
This commit is contained in:
parent
34f77cac8d
commit
bb893dcc6e
@ -1,237 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2022 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import socket from '@ohos.net.socket';
|
||||
import { Array2Byte } from '../utils/tools'
|
||||
import {getChuankouFn} from '../../common/service/indexService'
|
||||
import {getUDP} from './GlobalUdp'
|
||||
const TAG = 'socketTag[PLC.UdpClient]'
|
||||
import prompt from '@ohos.prompt'
|
||||
|
||||
import hilog from '@ohos.hilog';
|
||||
let num=0
|
||||
export default class UdpClient {
|
||||
private localIp: string = ''
|
||||
private localIpPort: string = ''
|
||||
private oppositeIp: string = ''
|
||||
private oppositeIpPort: string = ''
|
||||
|
||||
private udp: any = null
|
||||
// private stashFn:StashFuncotionon
|
||||
|
||||
constructor(udplocalIp: string, udplocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
|
||||
this.localIp = udplocalIp
|
||||
this.oppositeIp = udpOppositeIp
|
||||
this.localIpPort = udplocalIpPort
|
||||
this.oppositeIpPort = udpOppositeIpPort
|
||||
getChuankouFn()
|
||||
console.log(TAG,'newUdp')
|
||||
// this.stashFn=()=>{}
|
||||
this.udp = socket.constructUDPSocketInstance();
|
||||
}
|
||||
|
||||
rebindUdp(localIp: string, localIpPort: string, oppositeIp: string, oppositeIpPort: string) {
|
||||
console.log(TAG,'rebindUdp',this.localIp,this.localIpPort)
|
||||
|
||||
this.localIp = localIp
|
||||
this.oppositeIp = oppositeIp
|
||||
this.localIpPort = localIpPort
|
||||
this.oppositeIpPort = oppositeIpPort
|
||||
let promise = this.udp.bind({
|
||||
address: this.localIp, port: parseInt(this.localIpPort), family: 1
|
||||
});
|
||||
promise.then(() => {
|
||||
globalThis.closeUDPSocket=false
|
||||
|
||||
console.log(`${TAG},udpCLient udp rebind success`);
|
||||
}).catch(err => {
|
||||
globalThis.closeUDPSocket=true
|
||||
console.log(`${TAG},udpCLient udp rebind failed:${JSON.stringify(err)}`);
|
||||
});
|
||||
}
|
||||
|
||||
bindUdp() {
|
||||
console.log(TAG,'udpbind',this.localIp,this.localIpPort)
|
||||
let promise = this.udp.bind({
|
||||
// address: '192.168.7.170', port: 20122, family: 1
|
||||
// address: '192.168.7.170', port: 31013, family: 1
|
||||
address: this.localIp, port: parseInt(this.localIpPort), family: 1
|
||||
});
|
||||
promise.then(() => {
|
||||
globalThis.closeUDPSocket=false
|
||||
console.log(`${TAG}udpCLient udp bind success`);
|
||||
}).catch(err => {
|
||||
globalThis.closeUDPSocket=true
|
||||
console.log(`${TAG}udpCLient udp bind failed:${JSON.stringify(err)}`);
|
||||
});
|
||||
}
|
||||
setMsgCallBack(callback){
|
||||
// this.stashFn=callback?callback:()=>{}
|
||||
}
|
||||
sendMsg(msg) {
|
||||
console.log(TAG,'UdpSend1111',this.oppositeIp,this.oppositeIpPort)
|
||||
this.udp.getState((err, data) => {
|
||||
if (err) {
|
||||
|
||||
console.log('getState fail');
|
||||
return;
|
||||
} else {
|
||||
let promise = this.udp.send({
|
||||
data: msg,
|
||||
address: {
|
||||
// address: '192.168.7.124',
|
||||
// port: 30013,
|
||||
// address: '192.168.7.124',
|
||||
// port: 20022,
|
||||
address: this.oppositeIp,
|
||||
port: parseInt(this.oppositeIpPort),
|
||||
family: 1
|
||||
}
|
||||
});
|
||||
promise.then(() => {
|
||||
console.log(`${TAG}udpCLient udp send success:oppositeIp${this.oppositeIp},oppositeIpPort:${this.oppositeIpPort},localIp:${this.localIp},localIpPort,${this.localIpPort}`);
|
||||
}).catch(err => {
|
||||
console.log(`${TAG}udpCLient udp send fail:oppositeIp${this.oppositeIp},oppositeIpPort:${this.oppositeIpPort},localIp:${this.localIp},localIpPort,${this.localIpPort}`);
|
||||
});
|
||||
}
|
||||
console.log('getState success:' + JSON.stringify(data));
|
||||
})
|
||||
|
||||
}
|
||||
onError(callback?){
|
||||
this.udp.on('error',async err => {
|
||||
globalThis.closeUDPSocket=true
|
||||
console.log(TAG,'udpError',JSON.stringify(err))
|
||||
await this.bindUdp()
|
||||
await this.sendMsg('111')
|
||||
await this.onMessage(callback)
|
||||
// callback&&callback()
|
||||
// this.closeUdp(()=>{
|
||||
// this.bindUdp()
|
||||
// })
|
||||
});
|
||||
}
|
||||
|
||||
onMessage(callback?) {
|
||||
console.info(TAG, '注册udp message监听事件')
|
||||
this.udp.on('message', value => {
|
||||
console.log(TAG,'udponmessage')
|
||||
// 收到的是ArrayBuffer 需要进行转换解析
|
||||
globalThis.plcUdpError = false
|
||||
if (value) {
|
||||
|
||||
let dataView = new DataView(value.message)
|
||||
// console.log(`${TAG} udp message length:${dataView?.byteLength}`);
|
||||
let str = ""
|
||||
for (let i = 0; i < dataView?.byteLength; ++i) {
|
||||
let c = String.fromCharCode(dataView?.getUint8(i))
|
||||
if (c !== "\n") {
|
||||
str += c
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`${TAG} udp on message array buffer:${str}`);
|
||||
let strachArr = str.split(',')
|
||||
if (strachArr[0] != '#DN_GD') {
|
||||
return
|
||||
}
|
||||
console.log(`${TAG} udp222 on message array buffer:${str}`);
|
||||
|
||||
strachArr[28]=globalThis.chuankoMsg||'0'
|
||||
// this.stashFn(str)
|
||||
const newArr=JSON.parse(JSON.stringify(strachArr))
|
||||
// this.stashFn=()=>{}
|
||||
callback&&callback(newArr.toString())
|
||||
|
||||
} else {
|
||||
callback&&callback('')
|
||||
}
|
||||
|
||||
});
|
||||
const arrRed = [0x55, 0xaa, 0x01, 0x01, 0x02, 0x00, 0x03, 0x00];
|
||||
const arrBlue = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00];
|
||||
const arrGreen = [0x55, 0xaa, 0x01, 0x00, 0x02, 0x00, 0x03, 0x01];
|
||||
const arrBlueBuffer = Array2Byte(arrBlue).buffer
|
||||
const arrRedBuffer = Array2Byte(arrRed).buffer
|
||||
const arrGreenBugger = Array2Byte(arrGreen).buffer
|
||||
//监听udp是否断开
|
||||
clearInterval(globalThis.messageTimer)
|
||||
globalThis.messageTimer = setInterval(() => {
|
||||
const lightLineUdp = globalThis.lightLineUdp
|
||||
const isJudge = globalThis.isJudge
|
||||
setTimeout(async () => {
|
||||
//程序断开
|
||||
lightLineUdp?.send(globalThis.plcUdpError ? arrRedBuffer : (isJudge ? arrGreenBugger : arrBlueBuffer));
|
||||
if (globalThis.plcUdpError) {
|
||||
// num++
|
||||
console.log(TAG,'plc udp信号丢失')
|
||||
// if(num==3){
|
||||
getUDP(globalThis.context,true)
|
||||
// await this.bindUdp()
|
||||
// await this.sendMsg('111')
|
||||
// await this.onMessage(callback)
|
||||
// num=0
|
||||
// }
|
||||
prompt.showToast({
|
||||
message: 'plc udp信号丢失',
|
||||
duration: 2000
|
||||
});
|
||||
}
|
||||
globalThis.plcUdpError = true;
|
||||
}, 2000)
|
||||
}, 3000)
|
||||
}
|
||||
|
||||
closeUdp(callback) {
|
||||
this.udp.close(err => {
|
||||
hilog.info(0x0000,TAG, 'udpCLient', 'close');
|
||||
|
||||
if (err) {
|
||||
hilog.info(0x0000,TAG, 'udpCLient', 'closeonerror');
|
||||
globalThis.closeUDPSocket=false
|
||||
|
||||
} else {
|
||||
globalThis.closeUDPSocket=true
|
||||
|
||||
this.udp.getState((err, data) => {
|
||||
if (err) {
|
||||
console.log('getState fail');
|
||||
return;
|
||||
} else {
|
||||
if (!data.isisClose) {
|
||||
setTimeout(() => {
|
||||
callback()
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
console.log('getState success:' + JSON.stringify(data));
|
||||
})
|
||||
// let promise = this.udp.getState({});
|
||||
// promise.then(data => {
|
||||
//
|
||||
// console.log('getState success:' + JSON.stringify(data));
|
||||
// }).catch(err => {
|
||||
// callback()
|
||||
// console.log('getState fail');
|
||||
// });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
interface StashFunction {
|
||||
(str: string)
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
import router from '@ohos.router';
|
||||
import UdpClient from '../../common/utils/UdpClient';
|
||||
import FileLog from '../judgeSDK/utils/fileLog';
|
||||
import RealTime from '../compontents/judge/RealTime';
|
||||
import { GPSData, SignalData } from '../../mock';
|
||||
@ -24,7 +23,6 @@ export default struct SignDisplayCom {
|
||||
@State @Watch('outClick') outFlag: boolean = false;
|
||||
@State url: string = ''
|
||||
private timer = null
|
||||
private udpClient: UdpClient = null
|
||||
private FileLog: FileLog
|
||||
private vocObj = null;
|
||||
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import router from '@ohos.router';
|
||||
import UdpClient from '../../common/utils/UdpClient';
|
||||
import FileLog from '../judgeSDK/utils/fileLog';
|
||||
import RealTime from '../compontents/judge/RealTime';
|
||||
import { GPSData, SignalData } from '../../mock';
|
||||
@ -23,7 +22,6 @@ export default struct SignDisplayCom {
|
||||
@State @Watch('outClick') outFlag: boolean = false;
|
||||
@State url: string = ''
|
||||
private timer = null
|
||||
private udpClient: UdpClient = null
|
||||
private FileLog: FileLog
|
||||
private vocObj = null;
|
||||
|
||||
|
||||
75
entry/src/main/ets/utils/UdpUtils.ets
Normal file
75
entry/src/main/ets/utils/UdpUtils.ets
Normal file
@ -0,0 +1,75 @@
|
||||
import socket from '@ohos.net.socket'
|
||||
|
||||
type DealMethod = (value: ArrayBuffer) => string
|
||||
|
||||
class UdpClient {
|
||||
private localIp: string = ''
|
||||
private localIpPort: string = ''
|
||||
private oppositeIp: string = ''
|
||||
private oppositeIpPort: string = ''
|
||||
private messageEvents: Array<Function> = []
|
||||
private udp: socket.UDPSocket = null
|
||||
private disconnectEvents: Array<Function> = []
|
||||
private dealMethod: DealMethod
|
||||
|
||||
private dealMessage() {
|
||||
this.udp?.on("message", value => {
|
||||
let result = this?.dealMethod(value.message)
|
||||
this.messageEvents.forEach(cb => {
|
||||
cb(result)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
init(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
|
||||
this.localIp = udpLocalIp
|
||||
this.oppositeIp = udpOppositeIp
|
||||
this.localIpPort = udpLocalIpPort
|
||||
this.oppositeIpPort = udpOppositeIpPort
|
||||
this.udp = socket.constructUDPSocketInstance();
|
||||
}
|
||||
|
||||
bindUdp(): Promise<void> {
|
||||
return this.udp.bind({ address: this.localIp, port: parseInt(this.localIpPort), family: 1 }).then(() => {
|
||||
try {
|
||||
this.dealMessage()
|
||||
return Promise.resolve()
|
||||
} catch (e) {
|
||||
return Promise.reject(e)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
async reBind() {
|
||||
await this.close()
|
||||
this.udp = socket.constructUDPSocketInstance();
|
||||
await this.bindUdp()
|
||||
}
|
||||
|
||||
close(): Promise<void> {
|
||||
return this.udp?.close()
|
||||
}
|
||||
|
||||
setDealMethod(fun: DealMethod) {
|
||||
this.dealMethod = fun
|
||||
}
|
||||
|
||||
onMessage(callback: Function) {
|
||||
this.messageEvents.push(callback)
|
||||
}
|
||||
|
||||
onDisconnect(callback: Function) {
|
||||
this.disconnectEvents.push(callback)
|
||||
}
|
||||
|
||||
sendMsg(data: string): Promise<void> {
|
||||
return this.udp?.getState().then(() => {
|
||||
return this.udp.send({
|
||||
data,
|
||||
address: { address: this.oppositeIp, port: parseInt(this.oppositeIpPort), family: 1 }
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const udpClient = new UdpClient()
|
||||
Loading…
x
Reference in New Issue
Block a user