158 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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'
 | |
| import buffer from '@ohos.buffer'
 | |
| 
 | |
| 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<Function> = []
 | |
|   private errorEvents: Array<Function> = []
 | |
|   private dealMethod: DealMethod
 | |
| 
 | |
|   bindUdp(): Promise<void> {
 | |
|     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<void> {
 | |
|     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: ArrayBuffer|string): Promise<void> {
 | |
|     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失败"
 | |
| //       })
 | |
| //     }
 | |
| //   }
 | |
| // }
 | |
| 
 | |
| // 给中心发送GPS消息
 | |
| 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<CarInfoType>('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()
 | |
| 
 | |
| // 中心GPS
 | |
| export const CenterUDPClient = new centerUDPClient()
 | |
| 
 | |
| // 顶灯
 | |
| export const lightUDPClient = new LightUDPClient()
 | |
| 
 |