fix: 优化评判UDP
This commit is contained in:
		
							parent
							
								
									46244ac980
								
							
						
					
					
						commit
						339dc43493
					
				| @ -5,6 +5,7 @@ export interface WorkerMessage { | ||||
|   carInfo: CarInfoType; | ||||
|   centerUdpParam?: UDPParamType; | ||||
|   otherMessage: OtherMessageType; | ||||
|   singlePlay?: boolean | ||||
| } | ||||
| 
 | ||||
| export interface OtherMessageType { | ||||
|  | ||||
| @ -11,7 +11,6 @@ import { BusinessError } from '@ohos.base'; | ||||
| import { delPic } from '../utils/Video'; | ||||
| import { FileHelper } from '../utils/FileHelp'; | ||||
| import { DrivingDataStorage } from '../utils/business/DrivingDataStorage'; | ||||
| import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness'; | ||||
| import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; | ||||
| import HeaderComponent from './compontents/Header'; | ||||
| import CardComponent from './Index/Card'; | ||||
| @ -184,7 +183,7 @@ struct Index { | ||||
|     this.timeInfo = AppStorage.get<TimeSynchronizationRspBody>('timeInfo')! | ||||
|     DrivingDataStorage.init(this.context) | ||||
|     DrivingDataStorage.initializeTheDrivingDataFolder() | ||||
|     JudgeUdpBusinessInstance.init() | ||||
|     // JudgeUdpBusinessInstance.init() | ||||
|     // TODO 摄像头遮挡 | ||||
|     // takePhotoFn(this.context) | ||||
|     // TODO | ||||
|  | ||||
| @ -74,8 +74,8 @@ export function ArrayToByteArray(array: number[]): Uint8Array { | ||||
|  * @param len 字节数 | ||||
|  * @returns 返回字节数组 | ||||
|  */ | ||||
| export function NumberToByteArray(number: number, len: number): number[]  { | ||||
|   let str = Math.floor(number).toString(2); | ||||
| export function NumberToByteArray(number: number | string, len: number): number[] { | ||||
|   let str = Math.floor(Number(number)).toString(2); | ||||
|   if (str.length > len) { | ||||
|     console.log('数据长度不对~~'); | ||||
|     return []; | ||||
|  | ||||
| @ -24,6 +24,7 @@ class differentialAndSignal { | ||||
|     const signNum = AppStorage.get<number>('signNum') | ||||
|     const statue = AppStorage.get<string>('statue') | ||||
|     const lsh = AppStorage.get<string>('lsh') | ||||
|     const singlePlay = AppStorage.get<boolean>("singlePlay") | ||||
|     const data: WorkerMessage = { | ||||
|       config: config, | ||||
|       carInfo: carInfo, | ||||
| @ -31,7 +32,8 @@ class differentialAndSignal { | ||||
|         signNum: signNum || 0, | ||||
|         statue: statue || "", | ||||
|         lsh: lsh || "" | ||||
|       } | ||||
|       }, | ||||
|       singlePlay: singlePlay || false | ||||
|     } | ||||
|     this.workerInstance.postMessage(JSON.stringify(data)) | ||||
|     this.getMessage() | ||||
|  | ||||
| @ -2,7 +2,7 @@ import { CarInfoType, EnvironmentConfigurationType, Gps, Sensor, UDPParamType } | ||||
| import { testKm2Items, testKm3Items } from '../../pages/judgeSDK/dataTest'; | ||||
| import { fillZero, } from '../../pages/judgeSDK/utils/Common'; | ||||
| import { JudgeConfig } from '../../config'; | ||||
| import { FillZero, StringToASCII } from '../Common'; | ||||
| import { FillZero, NumberToByteArray, StringToASCII } from '../Common'; | ||||
| import UdpClient from '../UdpUtils'; | ||||
| import { CenterUDPBusinessInstance } from './CenterUdpBusiness'; | ||||
| import { ObtainUdpBusinessInstance } from './ObtainUdpBusiness'; | ||||
| @ -25,33 +25,16 @@ interface ProjectItemType { | ||||
|   status: string | ||||
| } | ||||
| 
 | ||||
| function string2Bytes(num: number | string, len: number) { | ||||
|   let str = (Math.floor(Number(num))).toString(2); | ||||
|   if (str.length > len) { | ||||
|     console.log('数据长度不对~~'); | ||||
|     return [] | ||||
|   } | ||||
|   let byteString = FillZero(str, len); | ||||
| 
 | ||||
|   let arrBytes: number[] = []; | ||||
|   for (let i = byteString.length; i > 0; ) { | ||||
|     let j = i - 8; | ||||
|     if (j < 0) { | ||||
|       j = 0 | ||||
|     } | ||||
|     let s = byteString.slice(j, i); | ||||
|     let v = parseInt(s, 2); | ||||
|     arrBytes.push(v); | ||||
|     i = i - 8 | ||||
|   } | ||||
|   return arrBytes; | ||||
| } | ||||
| 
 | ||||
| class JudgeUdpBusiness { | ||||
|   private static instance: JudgeUdpBusiness | ||||
|   public udpIndex = 0; | ||||
|   private udp: UdpClient = new UdpClient() | ||||
|   private currentUdpIndex = 0; | ||||
|   private carInfo: CarInfoType = {} | ||||
|   private singlePlay: boolean = false | ||||
|   private lsh: string = "" | ||||
|   private serialIndex: number = 0 | ||||
| 
 | ||||
|   constructor() { | ||||
|     if (!JudgeUdpBusiness.instance) { | ||||
| @ -61,16 +44,16 @@ class JudgeUdpBusiness { | ||||
|   } | ||||
| 
 | ||||
|   async getMessageHeartbeat(msg: string): Promise<number[]> { | ||||
|     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     let gpsDigit = JudgeConfig.fourInOneScreen.gpsDigit | ||||
|     const asclshArr = StringToASCII(FillZero( | ||||
|       AppStorage.get<boolean>("singlePlay") | ||||
|       this.singlePlay | ||||
|         ? '1111111111111' | ||||
|         : AppStorage.get<string>("lsh")!, | ||||
|         : this.lsh, | ||||
|       13)); | ||||
|     const ascksyhArr = StringToASCII(carInfo.examSubject === '2' ? '0000000000000' : '1111111111111') | ||||
|     const ascksyhArr = StringToASCII(this.carInfo.examSubject === '2' ? '0000000000000' : '1111111111111') | ||||
|     const ascsbxhArr = StringToASCII('00000000') | ||||
|     const serialIndex = AppStorage.get<number>("serialIndex")! | ||||
|     // const serialIndex = AppStorage.get<number>("serialIndex")! | ||||
| 
 | ||||
|     const plcData = await this.getPlcData(msg); | ||||
|     let param: number[] = Object.entries(plcData.sensor) | ||||
|       .filter((item: [string, number]) => { | ||||
| @ -85,70 +68,71 @@ class JudgeUdpBusiness { | ||||
|     const translateProject = this.getTranslateProject(); | ||||
|     const translateJd = Number(this.convertGpsCoord2(plcData.gps.wd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit); | ||||
|     const translateWd = Number(this.convertGpsCoord2(plcData.gps.jd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit) | ||||
|     const translateProjects = translateProject.map(numStr => string2Bytes(parseInt(numStr, 2), 8)[0]) | ||||
|     const translateProjects = translateProject.map(numStr => NumberToByteArray(parseInt(numStr, 2), 8)[0]) | ||||
|     let tempSd = Number((plcData.gps.sd * 1.852).toFixed(0)) | ||||
|     if (tempSd < 1) { | ||||
|       tempSd = 0 | ||||
|     } | ||||
|     const arr: number[][] = [ | ||||
|     //考生号 | ||||
|       asclshArr.map(lsh => string2Bytes(lsh, 8)[0]), | ||||
|       asclshArr.map(lsh => NumberToByteArray(lsh, 8)[0]), | ||||
|       //考试员号 | ||||
|       ascksyhArr.map(ksyh => string2Bytes(ksyh, 8)[0]), | ||||
|       ascksyhArr.map(ksyh => NumberToByteArray(ksyh, 8)[0]), | ||||
|       //科目类型(0:未考试 1:科目二 2:科目三) + 考试开始时间 | ||||
|       string2Bytes(`${0}${'00:00:000'}`, 4 * 8), | ||||
|       NumberToByteArray(`${0}${'00:00:000'}`, 4 * 8), | ||||
|       // 消息序号 | ||||
|       string2Bytes(serialIndex, 2 * 8), | ||||
|       NumberToByteArray(this.serialIndex, 2 * 8), | ||||
|       translateSignals, | ||||
|       string2Bytes(tempSd * 100, 2 * 8), | ||||
|       string2Bytes(plcData.sensor.fdjzs / 100, 8), | ||||
|       string2Bytes(translateJd, 4 * 8), | ||||
|       string2Bytes(translateWd, 4 * 8), string2Bytes(1, 8), | ||||
|       NumberToByteArray(tempSd * 100, 2 * 8), | ||||
|       NumberToByteArray(plcData.sensor.fdjzs / 100, 8), | ||||
|       NumberToByteArray(translateJd, 4 * 8), | ||||
|       NumberToByteArray(translateWd, 4 * 8), NumberToByteArray(1, 8), | ||||
|       //GPS东向距离 | ||||
|       string2Bytes(0, 4 * 8), | ||||
|       NumberToByteArray(0, 4 * 8), | ||||
|       //GPS北向距离 | ||||
|       string2Bytes(0, 4 * 8), | ||||
|       NumberToByteArray(0, 4 * 8), | ||||
|       //航向角 | ||||
|       string2Bytes(plcData.gps.hxj * 100, 2 * 8), | ||||
|       NumberToByteArray(plcData.gps.hxj * 100, 2 * 8), | ||||
|       //俯仰角 | ||||
|       string2Bytes(plcData.gps.fyj * 100, 2 * 8), | ||||
|       NumberToByteArray(plcData.gps.fyj * 100, 2 * 8), | ||||
|       // 高程(海拔) | ||||
|       string2Bytes(plcData.gps.hbg * 100, 4 * 8), | ||||
|       NumberToByteArray(plcData.gps.hbg * 100, 4 * 8), | ||||
|       //dddd | ||||
|       translateProjects, | ||||
|       //当前项目编号 | ||||
|       string2Bytes(0, 8), | ||||
|       NumberToByteArray(0, 8), | ||||
|       //场地设备编号 | ||||
|       ascsbxhArr.map(sbxh => string2Bytes(sbxh, 8)[0]), | ||||
|       ascsbxhArr.map(sbxh => NumberToByteArray(sbxh, 8)[0]), | ||||
|       //本次考试行驶距离 | ||||
|       string2Bytes(0, 2 * 8), | ||||
|       NumberToByteArray(0, 2 * 8), | ||||
|       //扣分值 | ||||
|       string2Bytes(0, 2 * 8), | ||||
|       NumberToByteArray(0, 2 * 8), | ||||
|       //扣分数 | ||||
|       string2Bytes(0, 2 * 8), | ||||
|       NumberToByteArray(0, 2 * 8), | ||||
|       //扣分项数量 | ||||
|       string2Bytes(0, 8), | ||||
|       NumberToByteArray(0, 8), | ||||
|       //n个扣分序号 | ||||
|       // [].map(kf => string2Bytes(kf.markcatalog, 8)), | ||||
|       [], | ||||
|       //牵引车第二gps精度、纬度 | ||||
|       string2Bytes(0, 4 * 8), string2Bytes(0, 4 * 8), | ||||
|       NumberToByteArray(0, 4 * 8), NumberToByteArray(0, 4 * 8), | ||||
|       //牵引车第二航向角 | ||||
|       string2Bytes(0, 2 * 8), | ||||
|       NumberToByteArray(0, 2 * 8), | ||||
|       //摩托压线 Byte[20], | ||||
|       string2Bytes(0, 20 * 8), | ||||
|       NumberToByteArray(0, 20 * 8), | ||||
|       //考试用时 | ||||
|       string2Bytes(FillZero(0, 4), 4 * 8), | ||||
|       NumberToByteArray(FillZero(0, 4), 4 * 8), | ||||
|       //项目用时 | ||||
|       string2Bytes(FillZero(0, 2), 2 * 8), | ||||
|       NumberToByteArray(FillZero(0, 2), 2 * 8), | ||||
|       //设备信号状态 | ||||
|       string2Bytes(0, 4 * 8), | ||||
|       NumberToByteArray(0, 4 * 8), | ||||
|     ] | ||||
|     let result: number[] = []; | ||||
|     arr.forEach(itemArr => { | ||||
|       result = result.concat(itemArr) | ||||
|     }) | ||||
|     AppStorage.setOrCreate("serialIndex", 0) | ||||
|     // AppStorage.setOrCreate("serialIndex", 0) | ||||
|     this.serialIndex = 0 | ||||
|     return [...new Uint8Array(result)] | ||||
|   } | ||||
| 
 | ||||
| @ -158,13 +142,12 @@ class JudgeUdpBusiness { | ||||
|   } | ||||
| 
 | ||||
|   sendData(bytes: number[]) { | ||||
|     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     if (this.udpIndex > this.currentUdpIndex) { | ||||
|       this.udp.sendMsgExt({ | ||||
|         id: 45, | ||||
|         list: bytes, | ||||
|         carNo: carInfo.carNo!, | ||||
|         placeId: carInfo.examinationRoomId! | ||||
|         carNo: this.carInfo.carNo!, | ||||
|         placeId: this.carInfo.examinationRoomId! | ||||
|       }) | ||||
|       this.currentUdpIndex = this.udpIndex | ||||
|     } | ||||
| @ -172,35 +155,33 @@ class JudgeUdpBusiness { | ||||
| 
 | ||||
|   //申请远程扣分查询 | ||||
|   askKf(directives: number) { | ||||
|     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     CenterUDPBusinessInstance.sendData({ | ||||
|       id: 35, | ||||
|       list: [directives], | ||||
|       carNo: carInfo.carNo!, | ||||
|       placeId: carInfo.examinationRoomId!, | ||||
|       carNo: this.carInfo.carNo!, | ||||
|       placeId: this.carInfo.examinationRoomId!, | ||||
|     }) | ||||
|     console.info('surenjun', `考车查询扣分项目内容,请求指令为:${directives}`) | ||||
|   } | ||||
| 
 | ||||
|   //确定远程扣分 | ||||
|   confirmKf(directives: number, code: number) { | ||||
|     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     CenterUDPBusinessInstance.sendData({ | ||||
|       id: 37, | ||||
|       list: [directives, code], | ||||
|       carNo: carInfo.carNo!, | ||||
|       placeId: carInfo.examinationRoomId! | ||||
|       carNo: this.carInfo.carNo!, | ||||
|       placeId: this.carInfo.examinationRoomId! | ||||
|     }) | ||||
|     console.info('surenjun', `考车发送确定扣分指令,指令为:${directives}`) | ||||
|   } | ||||
| 
 | ||||
|   async init(): Promise<void> { | ||||
|   async init(config: EnvironmentConfigurationType, carInfo: CarInfoType, singlePlay: boolean, lsh: string): Promise<void> { | ||||
|     this.lsh = lsh | ||||
|     this.carInfo = carInfo | ||||
|     this.singlePlay = singlePlay | ||||
|     return new Promise((resolve, reject) => { | ||||
|       try { | ||||
|         let result: EnvironmentConfigurationType = | ||||
|           AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")! | ||||
|         const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|         this.udp.create(result.udplocalIp!, '8080', carInfo.udpAddress!, carInfo.hintPort!).then(resolve).catch(reject) | ||||
|         this.udp.create(config.udplocalIp!, '8080', carInfo.udpAddress!, carInfo.hintPort!).then(resolve).catch(reject) | ||||
|         ObtainUdpBusinessInstance.onMsg(async (msg: string) => { | ||||
|           let prevJd = 0, preWd = 0 | ||||
| 
 | ||||
| @ -228,7 +209,7 @@ class JudgeUdpBusiness { | ||||
|             prevJd = jd; | ||||
|             preWd = wd; | ||||
|           } | ||||
|           AppStorage.set("udpIndex", udpIndex + 1) | ||||
|           // AppStorage.setOrCreate("udpIndex", udpIndex + 1) | ||||
|         }) | ||||
|         setInterval(() => { | ||||
|           this.udpIndex += 1 | ||||
| @ -259,9 +240,9 @@ class JudgeUdpBusiness { | ||||
| 
 | ||||
|   private setMsgHead(params: UDPParamType) { | ||||
|     const lshNo = SerialNumberInstance.get() | ||||
|     let a = string2Bytes(Number(`${params.id}${fillZero(params.placeId, 3)}`), 2 * 8); | ||||
|     let b = string2Bytes(Number(`${fillZero(params.carNo, 4)}${lshNo}`), 4 * 8); | ||||
|     let c = string2Bytes(params.list.length, 2 * 8); | ||||
|     let a = NumberToByteArray(Number(`${params.id}${fillZero(params.placeId, 3)}`), 2 * 8); | ||||
|     let b = NumberToByteArray(Number(`${fillZero(params.carNo, 4)}${lshNo}`), 4 * 8); | ||||
|     let c = NumberToByteArray(params.list.length, 2 * 8); | ||||
|     let result: number[] = [] | ||||
|     a?.forEach(item => result.push(item)) | ||||
|     b?.forEach(item => result.push(item)) | ||||
| @ -291,14 +272,14 @@ class JudgeUdpBusiness { | ||||
|     for (let i = 0; i < len; i++) { | ||||
|       arr.push(tempItems.slice(i * 8, (i + 1) * 8).join('')); | ||||
|     } | ||||
|     return arr.map(numStr => parseInt(numStr, 2)).map(item => string2Bytes(item, 8)[0]) | ||||
|     return arr.map(numStr => parseInt(numStr, 2)).map(item => NumberToByteArray(item, 8)[0]) | ||||
|   } | ||||
| 
 | ||||
|   // 中心所有项目转换 | ||||
|   private getTranslateProject(): string[] { | ||||
|     const examSubject = AppStorage.get<string>("examSubject"); | ||||
|     this.carInfo.examSubject | ||||
|     const tempItems: ProjectItemType[] = | ||||
|       (examSubject === '2' ? testKm2Items : testKm3Items).map((code: ProjectDataType) => { | ||||
|       (this.carInfo.examSubject === '2' ? testKm2Items : testKm3Items).map((code: ProjectDataType) => { | ||||
|         let data: ProjectItemType = { | ||||
|           code, | ||||
|           status: '0' | ||||
| @ -310,7 +291,7 @@ class JudgeUdpBusiness { | ||||
|       const temp = tempItems.slice(i * 4, (i + 1) * 4); | ||||
|       let tempArr = temp.map(item => item.status) | ||||
|       if (i === 4) { | ||||
|         tempArr = examSubject === '2' | ||||
|         tempArr = this.carInfo.examSubject === '2' | ||||
|           //bit36-bit39保留 | ||||
|           ? tempArr.concat(['00', '00']) | ||||
|           //bit30-bit39保留 | ||||
| @ -416,4 +397,5 @@ class JudgeUdpBusiness { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| export const JudgeUdpBusinessInstance = new JudgeUdpBusiness() | ||||
| @ -4,6 +4,7 @@ import { WorkerTag } from '../config'; | ||||
| import { CenterCallBackMsgType, WorkerBackMessage, WorkerMessage } from '../model'; | ||||
| import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness'; | ||||
| import { DifferentialSignal } from '../utils/business/DifferentialSignal'; | ||||
| import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness'; | ||||
| import { ObtainUdpBusinessInstance } from '../utils/business/ObtainUdpBusiness'; | ||||
| 
 | ||||
| const workerPort: ThreadWorkerGlobalScope = worker.workerPort; | ||||
| @ -37,6 +38,9 @@ function initFn(result: WorkerMessage) { | ||||
|   CenterUDPBusinessInstance.init(result.config, result.carInfo, result.otherMessage) | ||||
|   // 中心心跳 | ||||
|   CenterUDPBusinessInstance.startHeartBeat() | ||||
|   // 初始化考试过程UDP | ||||
|   JudgeUdpBusinessInstance.init(result.config, result.carInfo, result.singlePlay, result.otherMessage.lsh) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| function getDataFn() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user