subject-two/entry/src/main/ets/common/utils/UdpClientByCenter.ts

237 lines
7.9 KiB
TypeScript
Raw Normal View History

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-01-31 14:35:16 +08:00
import {fillZero,string2Bytes} from '../utils/tools'
2024-05-09 13:42:56 +08:00
import { GlobalConfig } from '../../config/index'
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 {
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
2024-03-12 15:32:48 +08:00
private stashFn:StashFunction
private headLenth:number=9 //消息头长度
private initParam
2024-01-05 11:11:15 +08:00
constructor(udplocalIp: string, udplocalIpPort:string,udpOppositeIp: string,udpOppositeIpPort:string) {
this.localIp = udplocalIp
this.oppositeIp = udpOppositeIp
this.localIpPort = udplocalIpPort
this.oppositeIpPort = udpOppositeIpPort
2024-03-12 15:32:48 +08:00
this.stashFn=()=>{}
2024-01-05 11:11:15 +08:00
this.udp = socket.constructUDPSocketInstance();
}
rebindUdp(localIp: string, localIpPort:string,oppositeIp: string,oppositeIpPort:string){
this.localIp = localIp
this.oppositeIp = oppositeIp
this.localIpPort = localIpPort
this.oppositeIpPort = oppositeIpPort
let promise = this.udp.bind({
// address: '192.168.7.170', port: 20122, family: 1
2024-01-31 14:35:16 +08:00
address: this.localIp, port: parseInt(this.localIpPort), family: 1
2024-01-05 11:11:15 +08:00
});
promise.then(() => {
console.log(`${TAG} udp bind success`);
}).catch(err => {
console.log(`${TAG} udp bind failed:${JSON.stringify(err)}`);
});
}
2024-03-12 15:32:48 +08:00
initHeartSendMsg(param,context){
2024-06-27 20:53:36 +08:00
console.log('1111param',JSON.stringify(param))
2024-03-12 15:32:48 +08:00
this.initParam=param
this.context=context
}
2024-01-05 11:11:15 +08:00
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)}`);
});
}
2024-05-09 13:42:56 +08:00
2024-01-05 11:11:15 +08:00
//异或运算
setMessageExclusive(tmpList){
let result = tmpList[0];
for (let i = 1; i < tmpList.length; i++) {
result = result ^ tmpList[i]
}
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;
}
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}){
2024-06-27 20:53:36 +08:00
console.log('globalThis.lshNo',globalThis.lshNo)
2024-01-31 14:35:16 +08:00
let a = string2Bytes(`${id}${fillZero(placeId,3)}`, 2*8);
2024-06-27 20:53:36 +08:00
console.log('aaa',a)
let b = string2Bytes(`${fillZero(carNo,4)}${globalThis.lshNo}`, 4*8);
console.log('bbb',b)
2024-01-31 14:35:16 +08:00
let c = string2Bytes(list.length, 2*8);
2024-01-05 11:11:15 +08:00
return [...a,...b,...c];
}
setMsgBody({id,list}) {
let tmpList = []
2024-01-31 14:35:16 +08:00
tmpList = list
2024-01-05 11:11:15 +08:00
return tmpList ;
}
sendHeadMsg(msgData){
2024-05-09 13:42:56 +08:00
console.log('sendsnd1')
2024-01-05 11:11:15 +08:00
//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)}`);
});
}
2024-03-05 15:44:53 +08:00
setMsgCallBack(callback){
2024-03-12 15:32:48 +08:00
this.stashFn=callback?callback:()=>{}
2024-03-05 15:44:53 +08:00
}
2024-01-05 11:11:15 +08:00
sendMsg(param,context?) {
2024-03-12 15:32:48 +08:00
console.log('paramparam',JSON.stringify(param))
2024-01-05 11:11:15 +08:00
if(context){
this.context=context
}
this.sendId=param.id
2024-03-05 15:44:53 +08:00
console.log('sendMsg',JSON.stringify(param))
2024-01-05 11:11:15 +08:00
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(() => {
2024-02-26 15:01:27 +08:00
if(param.sendCallback){
param.sendCallback()
2024-01-05 11:11:15 +08:00
}
2024-02-26 15:01:27 +08:00
// if(this.sendId=='46'&&param.callback){
// param.callback()
// }
2024-01-05 11:11:15 +08:00
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 => {
2024-06-27 20:53:36 +08:00
console.log('tttttttt')
2024-01-05 11:11:15 +08:00
let arr=[]
let dataView = new DataView(value.message)
for (let i = 0;i < dataView?.byteLength; ++i) {
arr[i]=dataView?.getUint8(i)
}
2024-01-31 14:35:16 +08:00
let idNum = '0x' + fillZero(arr[1].toString(16),2) + fillZero(arr[0].toString(16),2) ;
2024-01-05 11:11:15 +08:00
let id = Math.floor(+idNum/1000)
2024-05-16 09:53:10 +08:00
hilog.info(0x0000, 'bitbit', JSON.stringify(arr));
2024-01-05 11:11:15 +08:00
2024-01-31 14:35:16 +08:00
let lengthNum = '0x' + fillZero(arr[7].toString(16),2) + fillZero(arr[6].toString(16),2) ;
2024-01-05 11:11:15 +08:00
let length= +lengthNum;
let list=[]
2024-03-12 15:32:48 +08:00
for(let i=this.headLenth;i<=this.headLenth+length-1;i++){
2024-01-05 11:11:15 +08:00
list.push(arr[i])
}
2024-02-22 10:40:35 +08:00
this.stashFn({id,length,body:list,sendId:this.sendId})
2024-01-05 11:11:15 +08:00
callback({id,length,body:list,sendId:this.sendId})
});
}
2024-06-27 20:53:36 +08:00
2024-01-05 11:11:15 +08:00
closeUdp(callback) {
this.udp.close(err=>{
if(err){
}else{
this.udp.getState((err, data) => {
if (err) {
return;
}else{
if(!data.isisClose){
setTimeout(()=>{
callback()
},1000)
}
}
})
// let promise = this.udp.getState({});
// promise.then(data => {
//
// console.log('getState success:' + JSON.stringify(data));
// }).catch(err => {
// callback()
// console.log('getState fail');
// });
}
});
}
2024-03-12 15:32:48 +08:00
}
interface StashFunction {
(params: { id: number; length: number; body: any[]; sendId: string }): void;
2024-01-05 11:11:15 +08:00
}