import socket from '@ohos.net.socket' import common from '@ohos.app.ability.common' import FileUtils from './FileUtils' import promptAction from '@ohos.promptAction' import { CarInfoType } from '../model' type DealMethod = (value: ArrayBuffer) => string interface IPConfig { udplocalIp: string udplocalIpPort: string udpOppositeIp: string udpOppositeIpPort: string } export default class UdpClient { private localIp: string = '' private localIpPort: string = '' private oppositeIp: string = '' private oppositeIpPort: string = '' private udp: socket.UDPSocket = null private messageEvents: Array = [] private errorEvents: Array = [] private dealMethod: DealMethod bindUdp(): Promise { 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() } setDealMethod(fun: DealMethod) { this.dealMethod = fun } onMessage(callback: Function) { this.messageEvents.push(callback) } onError(callback: Function) { this.errorEvents.push(callback) } sendMsg(data: string): Promise { return this.udp?.getState().then(() => { return this.udp.send({ data, address: { address: this.oppositeIp, port: parseInt(this.oppositeIpPort), family: 1 } }) }) } 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) }) }) } } // 获取后置机信号 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失败" }) } } } // 给中心发送消息 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: CarInfoType = 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失败" }) } } } // 顶灯 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() // 顶灯 export const lightUDPClient = new LightUDPClient()