From cfe1852b03ac834f2c0314f0cdc92291a86e5cc0 Mon Sep 17 00:00:00 2001 From: lixiao <932184220@qq.com> Date: Tue, 18 Mar 2025 19:39:11 +0800 Subject: [PATCH] =?UTF-8?q?udp=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{EntryAbility.ts => EntryAbility.ets} | 33 ++--- entry/src/main/ets/utils/UdpUtils.ets | 118 ++++++++++++++---- entry/src/main/module.json5 | 2 +- 3 files changed, 112 insertions(+), 41 deletions(-) rename entry/src/main/ets/entryability/{EntryAbility.ts => EntryAbility.ets} (76%) diff --git a/entry/src/main/ets/entryability/EntryAbility.ts b/entry/src/main/ets/entryability/EntryAbility.ets similarity index 76% rename from entry/src/main/ets/entryability/EntryAbility.ts rename to entry/src/main/ets/entryability/EntryAbility.ets index 71d506b7..98939574 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ts +++ b/entry/src/main/ets/entryability/EntryAbility.ets @@ -10,6 +10,7 @@ import { GlobalConfig } from '../config/global' import { tcpUtil } from '../common/utils/TcpRequest'; import DB from '../common/database/DbSql'; import { initTable } from '../common/service/initable'; +import { centerUDPClient, lightUDPClient, objUDPClient } from '../utils/UdpUtils'; export default class EntryAbility extends UIAbility { async onCreate(want, launchParam) { @@ -34,32 +35,36 @@ export default class EntryAbility extends UIAbility { } async onWindowStageCreate(windowStage: window.WindowStage) { + // 初始化示例,只需要调用一次 + await objUDPClient.init(this.context) + await lightUDPClient.init(this.context) + await centerUDPClient.init(this.context) // this.context // Main window is created, set main page for this ability hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); await tcpUtil.init() - AppStorage.setOrCreate('carInfo',{}) - AppStorage.setOrCreate('examinerInfo',{}) - AppStorage.setOrCreate('lsh','0000000000000') - AppStorage.setOrCreate('statue',1)//考试状态 - AppStorage.setOrCreate('signNum',0)//心跳指令编号 - AppStorage.setOrCreate('deviceNo',0)//设备号 - AppStorage.setOrCreate('baseInfo',{ - hasAuth:false, - version:GlobalConfig.version.jn.km3[0], - judgeVersion:GlobalConfig.version.jn.km3[1], - tcpSendNum:0, - videoVersion:'1.0', + AppStorage.SetOrCreate('carInfo', {}) + AppStorage.SetOrCreate('examinerInfo', {}) + AppStorage.SetOrCreate('lsh', '0000000000000') + AppStorage.SetOrCreate('statue', 1) //考试状态 + AppStorage.SetOrCreate('signNum', 0) //心跳指令编号 + AppStorage.SetOrCreate('deviceNo', 0) //设备号 + AppStorage.SetOrCreate('baseInfo', { + hasAuth: false, + version: GlobalConfig.version.jn.km3[0], + judgeVersion: GlobalConfig.version.jn.km3[1], + tcpSendNum: 0, + videoVersion: '1.0', ratio: 1700 / 960, //适配比例 pathDir: this.context.filesDir, context: this.context, - isJudgeInitBool:false, + isJudgeInitBool: false, }) const windowClass = await windowStage.getMainWindow(); - AppStorage.setOrCreate('windowClass',windowClass) + AppStorage.SetOrCreate('windowClass', windowClass) // await windowClass.setWindowLayoutFullScreen(true) // await windowClass.setWindowSystemBarEnable([]) //全屏 await windowClass.setWindowSystemBarEnable(['navigation']) diff --git a/entry/src/main/ets/utils/UdpUtils.ets b/entry/src/main/ets/utils/UdpUtils.ets index d1c38194..dfeb079f 100644 --- a/entry/src/main/ets/utils/UdpUtils.ets +++ b/entry/src/main/ets/utils/UdpUtils.ets @@ -1,43 +1,65 @@ import socket from '@ohos.net.socket' +import common from '@ohos.app.ability.common' +import FileUtils from './fileUtils' +import promptAction from '@ohos.promptAction' type DealMethod = (value: ArrayBuffer) => string +interface IPConfig { + udplocalIp: string + udplocalIpPort: string + udpOppositeIp: string + udpOppositeIpPort: string +} + class UdpClient { private localIp: string = '' private localIpPort: string = '' private oppositeIp: string = '' private oppositeIpPort: string = '' - private messageEvents: Array = [] private udp: socket.UDPSocket = null - private disconnectEvents: Array = [] + private messageEvents: Array = [] + private errorEvents: Array = [] private dealMethod: DealMethod - init(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) { + protected create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) { this.localIp = udpLocalIp this.oppositeIp = udpOppositeIp this.localIpPort = udpLocalIpPort this.oppositeIpPort = udpOppositeIpPort this.udp = socket.constructUDPSocketInstance(); + this.bindEvent() + this.bindUdp() + } + + private bindEvent() { + this.udp?.on("message", value => { + let result = this?.dealMethod(value.message) + this.messageEvents.forEach(cb => { + cb(result) + }) + }) + this.udp.on("error", (err) => { + this.errorEvents.forEach(cb => { + cb(err) + }) + }) } bindUdp(): Promise { - 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) - } - }) + return this.udp.bind({ address: this.localIp, port: parseInt(this.localIpPort), family: 1 }) } async reBind() { await this.close() this.udp = socket.constructUDPSocketInstance(); + this.bindEvent() await this.bindUdp() } close(): Promise { + this.udp.off("message") + this.udp.off("error") return this.udp?.close() } @@ -49,8 +71,8 @@ class UdpClient { this.messageEvents.push(callback) } - onDisconnect(callback: Function) { - this.disconnectEvents.push(callback) + onError(callback: Function) { + this.errorEvents.push(callback) } sendMsg(data: string): Promise { @@ -61,25 +83,69 @@ class UdpClient { }) }) } +} - private dealMessage() { - this.udp?.on("message", value => { - let result = this?.dealMethod(value.message) - this.messageEvents.forEach(cb => { - cb(result) +class ObjUdpClient extends UdpClient { + async init(context: common.UIAbilityContext) { + try { + const fileUtil = new FileUtils(context) + const data = await fileUtil.readFile("" + '/config/ipConfig.txt'); + if (data?.length > 0) { + const result: IPConfig = JSON.parse(data) + this.create(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort) + } + } catch (e) { + promptAction.showToast({ + message: "初始化obj udp失败" }) - }) + } } } -export const objUDPClient = new UdpClient() +class CenterUDPClient extends UdpClient { + async init(context: common.UIAbilityContext) { + try { + const fileUtil = new FileUtils(context) + const data = await fileUtil.readFile("" + '/config/ipConfig.txt'); + const carInfo: { + udpAddress: string + messagePort: string + } = AppStorage.Get('carInfo') + if (data?.length > 0) { + const result: IPConfig = JSON.parse(data) + this.create(result.udplocalIp, '8800', carInfo?.udpAddress, carInfo?.messagePort) + } + } catch (e) { + promptAction.showToast({ + message: "初始化中心 udp失败" + }) + } + } +} -// 中心心跳 -export const centerUDPClient = new UdpClient() +class LightUDPClient extends UdpClient { + async init(context: common.UIAbilityContext) { + try { + const fileUtil = new FileUtils(context) + const data = await fileUtil.readFile("" + '/config/ipConfig.txt'); + if (data?.length > 0) { + const result: IPConfig = JSON.parse(data) + this.create(result.udplocalIp, '55509', result.udpOppositeIp, result.udpOppositeIpPort) + } + } catch (e) { + promptAction.showToast({ + message: "初始化灯光 udp失败" + }) + } + } +} + +// obj +export const objUDPClient = new ObjUdpClient() + +// 中心 +export const centerUDPClient = new CenterUDPClient() -// 中心GPS // 顶灯 -export const lightUDPClient = new UdpClient() +export const lightUDPClient = new LightUDPClient() -// 获取后置机信号 -export const judgeUDPClient = new UdpClient() diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 index ba34d770..86bbe1b5 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json5 @@ -17,7 +17,7 @@ "abilities": [ { "name": "EntryAbility", - "srcEntrance": "./ets/entryability/EntryAbility.ts", + "srcEntrance": "./ets/entryability/EntryAbility.ets", "description": "$string:EntryAbility_desc", "icon": "$media:logo_app", "label": "$string:EntryAbility_label",