2024-01-05 11:11:15 +08:00
|
|
|
/*
|
|
|
|
|
* 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 fs from '@ohos.file.fs'
|
|
|
|
|
import mediaLibrary from '@ohos.multimedia.mediaLibrary'
|
|
|
|
|
import FileUtil from '../../common/utils/File'
|
2024-06-04 11:49:16 +08:00
|
|
|
import { fillZero, string2Bytes } from '../utils/tools'
|
2024-05-09 13:42:56 +08:00
|
|
|
import { GlobalConfig } from '../../config/index'
|
2024-06-04 11:49:16 +08:00
|
|
|
|
2024-01-05 11:11:15 +08:00
|
|
|
const TAG = '[UdpDemo.UdpClient]'
|
|
|
|
|
// import common from '@ohos.app.ability.common';
|
2024-05-16 09:53:10 +08:00
|
|
|
import hilog from '@ohos.hilog';
|
2024-01-05 11:11:15 +08:00
|
|
|
import prompt from '@ohos.prompt'
|
|
|
|
|
import call from '@ohos.telephony.call';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default class UdpClientByCenter {
|
2024-06-04 11:49:16 +08:00
|
|
|
private localIp: string = ''
|
|
|
|
|
private localIpPort: string = ''
|
|
|
|
|
private oppositeIp: string = ''
|
|
|
|
|
private oppositeIpPort: string = ''
|
|
|
|
|
private udpMsg: any = ''
|
|
|
|
|
private num: number = 0
|
|
|
|
|
private fileUtil: FileUtil
|
|
|
|
|
private udp: any = null
|
|
|
|
|
private sendId: any = 0
|
|
|
|
|
private lsh: string = null
|
|
|
|
|
private context
|
|
|
|
|
private stashFn: StashFunction
|
|
|
|
|
private headLenth: number = 9
|
|
|
|
|
//消息头长度
|
|
|
|
|
private initParam
|
2024-05-09 13:42:56 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
constructor(udplocalIp: string, udplocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
|
|
|
|
|
this.localIp = udplocalIp
|
|
|
|
|
this.oppositeIp = udpOppositeIp
|
|
|
|
|
this.localIpPort = udplocalIpPort
|
|
|
|
|
this.oppositeIpPort = udpOppositeIpPort
|
|
|
|
|
this.stashFn = () => {
|
2024-01-05 11:11:15 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
this.udp = socket.constructUDPSocketInstance();
|
|
|
|
|
}
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
rebindUdp(localIp: string, localIpPort: string, oppositeIp: string, oppositeIpPort: string) {
|
|
|
|
|
this.localIp = localIp
|
|
|
|
|
this.oppositeIp = oppositeIp
|
|
|
|
|
this.localIpPort = localIpPort
|
|
|
|
|
this.oppositeIpPort = oppositeIpPort
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
let promise = this.udp.bind({
|
|
|
|
|
// address: '192.168.7.170', port: 20122, family: 1
|
|
|
|
|
address: this.localIp, port: parseInt(this.localIpPort), family: 1
|
|
|
|
|
});
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
promise.then(() => {
|
|
|
|
|
console.log(`${TAG} udp bind success`);
|
|
|
|
|
}).catch(err => {
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
console.log(`${TAG} udp bind failed:${JSON.stringify(err)}`);
|
|
|
|
|
});
|
|
|
|
|
}
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
initHeartSendMsg(param, context) {
|
|
|
|
|
this.initParam = param
|
|
|
|
|
this.context = context
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bindUdp() {
|
|
|
|
|
let promise = this.udp.bind({
|
|
|
|
|
address: this.localIp, port: parseInt(this.localIpPort), family: 1
|
|
|
|
|
});
|
|
|
|
|
promise.then(() => {
|
|
|
|
|
console.log(`${TAG} udp bind success`);
|
|
|
|
|
}).catch(err => {
|
|
|
|
|
|
|
|
|
|
console.log(`${TAG} udp bind failed:${JSON.stringify(err)}`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//异或运算
|
|
|
|
|
setMessageExclusive(tmpList) {
|
|
|
|
|
let result = tmpList[0];
|
|
|
|
|
for (let i = 1; i < tmpList.length; i++) {
|
|
|
|
|
result = result ^ tmpList[i]
|
2024-01-05 11:11:15 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
return [result];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Array2Byte(array) {
|
|
|
|
|
var buf = new ArrayBuffer(array.length);
|
|
|
|
|
var view = new Uint8Array(buf);
|
|
|
|
|
for (var i = 0; i != array.length; ++i) {
|
|
|
|
|
view[i] = array[i] & 0xFF;
|
2024-01-05 11:11:15 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
return view;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//length消息体bufferlength id消息类型id bodyStr消息体string
|
|
|
|
|
// setMsyBody(id,bodyByte){
|
|
|
|
|
|
|
|
|
|
// {id: 31,list:[0,1,'0000000000000'],carNo:489,placeId:62}
|
|
|
|
|
setWholeMsg(params) {
|
|
|
|
|
let head = this.setMsgHead(params);
|
|
|
|
|
let headJudge = this.setMessageExclusive(head);
|
|
|
|
|
let body = this.setMsgBody(params);
|
|
|
|
|
let bodyJudge = this.setMessageExclusive(body);
|
|
|
|
|
let end = [13, 10];
|
|
|
|
|
const arr = [...head, ...headJudge, ...body, ...bodyJudge, ...end]
|
|
|
|
|
console.log('BitArray', arr)
|
|
|
|
|
return this.Array2Byte(arr).buffer
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setMsgHead({id, list, placeId=62, carNo=489}) {
|
|
|
|
|
let a = string2Bytes(`${id}${fillZero(placeId, 3)}`, 2 * 8);
|
|
|
|
|
let b = string2Bytes(`${carNo}${this.lsh}`, 4 * 8);
|
|
|
|
|
|
|
|
|
|
let c = string2Bytes(list.length, 2 * 8);
|
|
|
|
|
return [...a, ...b, ...c];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setMsgBody({id,list}) {
|
|
|
|
|
let tmpList = []
|
|
|
|
|
tmpList = list
|
|
|
|
|
|
|
|
|
|
return tmpList;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sendHeadMsg(msgData) {
|
|
|
|
|
console.log('sendsnd1')
|
|
|
|
|
//udpOppositeIp
|
|
|
|
|
let promise = this.udp.send({
|
|
|
|
|
data: msgData,
|
|
|
|
|
address: {
|
|
|
|
|
address: this.oppositeIp,
|
|
|
|
|
port: parseInt(this.oppositeIpPort),
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
promise.then(() => {
|
|
|
|
|
console.log(`${TAG} udpLine send success:`);
|
|
|
|
|
}).catch(err => {
|
|
|
|
|
console.log(`${TAG} udpLine send fail:${JSON.stringify(err)}`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setMsgCallBack(callback) {
|
|
|
|
|
this.stashFn = callback ? callback : () => {
|
2024-05-27 17:25:20 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
}
|
2024-01-05 11:11:15 +08:00
|
|
|
|
2024-06-04 11:49:16 +08:00
|
|
|
sendMsg(param, context?) {
|
|
|
|
|
console.log('paramparam', JSON.stringify(param))
|
|
|
|
|
if (context) {
|
|
|
|
|
this.context = context
|
2024-01-05 11:11:15 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
this.sendId = param.id
|
|
|
|
|
console.log('sendMsg', JSON.stringify(param))
|
|
|
|
|
const msgData = this.setWholeMsg(param)
|
|
|
|
|
// const msgData=this.setMsyBody('31','010000000000000')
|
|
|
|
|
let promise = this.udp.send({
|
|
|
|
|
data: msgData,
|
|
|
|
|
address: {
|
|
|
|
|
address: this.oppositeIp,
|
|
|
|
|
port: parseInt(this.oppositeIpPort),
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
promise.then(() => {
|
|
|
|
|
if (param.sendCallback) {
|
|
|
|
|
param.sendCallback()
|
|
|
|
|
}
|
|
|
|
|
// if(this.sendId=='46'&¶m.callback){
|
|
|
|
|
// param.callback()
|
|
|
|
|
// }
|
|
|
|
|
console.log(`${TAG} udp send success:`);
|
|
|
|
|
}).catch(err => {
|
|
|
|
|
console.log(`${TAG} udp send fail:${JSON.stringify(err)}`);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMessage(callback, type?) {
|
|
|
|
|
this.udp.on('message', value => {
|
|
|
|
|
let arr = []
|
|
|
|
|
let dataView = new DataView(value.message)
|
|
|
|
|
for (let i = 0; i < dataView?.byteLength; ++i) {
|
|
|
|
|
arr[i] = dataView?.getUint8(i)
|
|
|
|
|
}
|
|
|
|
|
let idNum = '0x' + fillZero(arr[1].toString(16), 2) + fillZero(arr[0].toString(16), 2);
|
|
|
|
|
let id = Math.floor(+idNum / 1000)
|
|
|
|
|
hilog.info(0x0000, 'bitbit', JSON.stringify(arr));
|
|
|
|
|
|
|
|
|
|
let lengthNum = '0x' + fillZero(arr[7].toString(16), 2) + fillZero(arr[6].toString(16), 2);
|
|
|
|
|
let length = +lengthNum;
|
|
|
|
|
let list = []
|
|
|
|
|
for (let i = this.headLenth; i <= this.headLenth + length - 1; i++) {
|
|
|
|
|
list.push(arr[i])
|
|
|
|
|
}
|
|
|
|
|
this.stashFn({
|
|
|
|
|
id, length, body: list, sendId: this.sendId
|
|
|
|
|
})
|
|
|
|
|
callback({
|
|
|
|
|
id, length, body: list, sendId: this.sendId
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onError(callback?) {
|
|
|
|
|
this.udp.on('error', err => {
|
|
|
|
|
console.log('udpbycenterdiushierroring')
|
|
|
|
|
hilog.info(0x0000, 'udpCLientBycenteronerror', 'error' + JSON.stringify(err));
|
|
|
|
|
console.log("on error, err:" + JSON.stringify(err))
|
|
|
|
|
// this.closeUdp(()=>{
|
|
|
|
|
// this.bindUdp()
|
|
|
|
|
// })
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
closeUdp() {
|
|
|
|
|
return new Promise<void>((resolve, reject) => {
|
|
|
|
|
this.udp.close().then(() => {
|
|
|
|
|
hilog.info(0x0000, 'udpClient', 'close');
|
|
|
|
|
return this.udp.getState()
|
|
|
|
|
}).then((data) => {
|
|
|
|
|
if (!data.isClose) {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
resolve()
|
|
|
|
|
}, 1000)
|
|
|
|
|
}
|
|
|
|
|
}).catch(err => {
|
|
|
|
|
hilog.error(0x0000, 'udpClient', err);
|
|
|
|
|
reject(err)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
2024-03-12 15:32:48 +08:00
|
|
|
}
|
2024-06-04 11:49:16 +08:00
|
|
|
|
2024-03-12 15:32:48 +08:00
|
|
|
interface StashFunction {
|
2024-06-04 11:49:16 +08:00
|
|
|
(params: {
|
|
|
|
|
id: number;
|
|
|
|
|
length: number;
|
|
|
|
|
body: any[];
|
|
|
|
|
sendId: string
|
|
|
|
|
}): void;
|
2024-01-05 11:11:15 +08:00
|
|
|
}
|