Compare commits
	
		
			2 Commits
		
	
	
		
			5efb9cd735
			...
			f140274c92
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f140274c92 | ||
| 
						 | 
					17c8d88345 | 
@ -1,6 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "apiType": "stageMode",
 | 
					  "apiType": "stageMode",
 | 
				
			||||||
  "buildOption": {
 | 
					  "buildOption": {
 | 
				
			||||||
 | 
					    sourceOption: {
 | 
				
			||||||
 | 
					      "workers": [
 | 
				
			||||||
 | 
					        './src/main/ets/workers/DifferentialCorrection.ets'
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "buildOptionSet": [
 | 
					  "buildOptionSet": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
				
			|||||||
@ -29,3 +29,6 @@ export const RequestTag = '[Request]';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//entry tag
 | 
					//entry tag
 | 
				
			||||||
export const EntryTag = '[Entry]';
 | 
					export const EntryTag = '[Entry]';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//worker tag
 | 
				
			||||||
 | 
					export const WorkerTag = '[Worker]';
 | 
				
			||||||
@ -12,7 +12,7 @@ export const GlobalConfig: GlobalConfigType = {
 | 
				
			|||||||
  commonFileWriteAddress: '/mnt/hmdfs/100/account/device_view/local/files/duolun',
 | 
					  commonFileWriteAddress: '/mnt/hmdfs/100/account/device_view/local/files/duolun',
 | 
				
			||||||
  picSavePath: '/storage/cloud/100/files/Photo/',
 | 
					  picSavePath: '/storage/cloud/100/files/Photo/',
 | 
				
			||||||
  videoSavePath: '/storage/cloud/100/files/Videos/',
 | 
					  videoSavePath: '/storage/cloud/100/files/Videos/',
 | 
				
			||||||
  host: 'http://172.37.55.192:8082',
 | 
					  host: 'http://192.168.32.105:8089',
 | 
				
			||||||
  modelNo: "3",
 | 
					  modelNo: "3",
 | 
				
			||||||
  version: {
 | 
					  version: {
 | 
				
			||||||
    //杭州
 | 
					    //杭州
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,7 @@ import { JudgeConfigType } from '../model'
 | 
				
			|||||||
//考试回放开关
 | 
					//考试回放开关
 | 
				
			||||||
export const JudgeConfig: JudgeConfigType = {
 | 
					export const JudgeConfig: JudgeConfigType = {
 | 
				
			||||||
  //本地目录开关
 | 
					  //本地目录开关
 | 
				
			||||||
  isTrajectoryOpen: true,
 | 
					  isTrajectoryOpen: false,
 | 
				
			||||||
  //是否开启拍照
 | 
					  //是否开启拍照
 | 
				
			||||||
  isPhotoOpen: true,
 | 
					  isPhotoOpen: true,
 | 
				
			||||||
  //扣分语音是否强制开启
 | 
					  //扣分语音是否强制开启
 | 
				
			||||||
 | 
				
			|||||||
@ -170,7 +170,7 @@ interface VersionInfo {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface centerCallBackMsgType {
 | 
					export interface CenterCallBackMsgType {
 | 
				
			||||||
  id: number;
 | 
					  id: number;
 | 
				
			||||||
  length: number;
 | 
					  length: number;
 | 
				
			||||||
  body: number[];
 | 
					  body: number[];
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
export interface TakePhotoCallbackData {
 | 
					export interface TakePhotoCallbackData {
 | 
				
			||||||
  fileSize: number;
 | 
					  fileSize: number
 | 
				
			||||||
  errorCode: number
 | 
					  errorCode: number
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								entry/src/main/ets/model/Worker.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								entry/src/main/ets/model/Worker.ets
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					import { CarInfoType, CenterCallBackMsgType, EnvironmentConfigurationType, UDPParamType } from '.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface WorkerMessage {
 | 
				
			||||||
 | 
					  config: EnvironmentConfigurationType;
 | 
				
			||||||
 | 
					  carInfo: CarInfoType;
 | 
				
			||||||
 | 
					  udpParam?: UDPParamType;
 | 
				
			||||||
 | 
					  otherMessage: OtherMessageType;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface OtherMessageType {
 | 
				
			||||||
 | 
					  signNum: number;
 | 
				
			||||||
 | 
					  statue: string;
 | 
				
			||||||
 | 
					  lsh: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface WorkerBackMessage {
 | 
				
			||||||
 | 
					  type: string;
 | 
				
			||||||
 | 
					  data: string | CenterCallBackMsgType
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -19,3 +19,5 @@ export * from "./api"
 | 
				
			|||||||
export * from "./TableColumn"
 | 
					export * from "./TableColumn"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export * from "./Other"
 | 
					export * from "./Other"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export * from "./Worker"
 | 
				
			||||||
@ -3,15 +3,13 @@ import router from '@ohos.router';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { JudgeConfig } from '../config';
 | 
					import { JudgeConfig } from '../config';
 | 
				
			||||||
import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements';
 | 
					import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements';
 | 
				
			||||||
import { BaseInfoType, centerCallBackMsgType } from '../model/Common';
 | 
					import { BaseInfoType } from '../model/Common';
 | 
				
			||||||
import { CarInfoType, InitializeTheCentralTableType, MASYSSETTableType, TimeSynchronizationRspBody } from '../model';
 | 
					import { CarInfoType, InitializeTheCentralTableType, MASYSSETTableType, TimeSynchronizationRspBody } from '../model';
 | 
				
			||||||
import { CreateAlbum, GetCarInfo, GetDeviceInfo, SetCurrentTime, UseAuth } from './Index/utils';
 | 
					import { CreateAlbum, GetCarInfo, GetDeviceInfo, SetCurrentTime, UseAuth } from './Index/utils';
 | 
				
			||||||
import { GetSyncData, InitializeTheCentralTable } from '../utils/table/Operation';
 | 
					import { GetSyncData, InitializeTheCentralTable } from '../utils/table/Operation';
 | 
				
			||||||
import { BusinessError } from '@ohos.base';
 | 
					import { BusinessError } from '@ohos.base';
 | 
				
			||||||
import { delPic } from '../utils/Video';
 | 
					import { delPic } from '../utils/Video';
 | 
				
			||||||
import { FileHelper } from '../utils/FileHelp';
 | 
					import { FileHelper } from '../utils/FileHelp';
 | 
				
			||||||
import { ObtainUdpBusinessInstance } from '../utils/business/ObtainUdpBusiness';
 | 
					 | 
				
			||||||
import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness';
 | 
					 | 
				
			||||||
import { DrivingDataStorage } from '../utils/business/DrivingDataStorage';
 | 
					import { DrivingDataStorage } from '../utils/business/DrivingDataStorage';
 | 
				
			||||||
import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness';
 | 
					import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness';
 | 
				
			||||||
import { JudgeEmitterInstance } from '../utils/business/UdpEvent';
 | 
					import { JudgeEmitterInstance } from '../utils/business/UdpEvent';
 | 
				
			||||||
@ -20,6 +18,7 @@ import CardComponent from './Index/Card';
 | 
				
			|||||||
import BottomMessageComponent from './Index/BottomMessage';
 | 
					import BottomMessageComponent from './Index/BottomMessage';
 | 
				
			||||||
import LoadingComponent from './Index/Loading';
 | 
					import LoadingComponent from './Index/Loading';
 | 
				
			||||||
import Prompt from '@system.prompt';
 | 
					import Prompt from '@system.prompt';
 | 
				
			||||||
 | 
					import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignal';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Entry
 | 
					@Entry
 | 
				
			||||||
@ -60,6 +59,7 @@ struct Index {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async aboutToAppear() {
 | 
					  async aboutToAppear() {
 | 
				
			||||||
 | 
					    console.log("首页 aboutToAppear")
 | 
				
			||||||
    await UseAuth(this.context)
 | 
					    await UseAuth(this.context)
 | 
				
			||||||
    this.ratio = AppStorage.get<BaseInfoType>('baseInfo')?.ratio || 1.4
 | 
					    this.ratio = AppStorage.get<BaseInfoType>('baseInfo')?.ratio || 1.4
 | 
				
			||||||
    this.angle = 0
 | 
					    this.angle = 0
 | 
				
			||||||
@ -76,7 +76,12 @@ struct Index {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onPageShow(): Promise<void> {
 | 
					  async onPageShow(): Promise<void> {
 | 
				
			||||||
 | 
					    console.log("首页 onPageShow")
 | 
				
			||||||
    await UseAuth(this.context)
 | 
					    await UseAuth(this.context)
 | 
				
			||||||
 | 
					    DifferentialAndSignal.init()
 | 
				
			||||||
 | 
					    DifferentialAndSignal.onMsg(() => {
 | 
				
			||||||
 | 
					      console.log("外层接受")
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
    this.avPlayer.playAudio(['welcome.wav'])
 | 
					    this.avPlayer.playAudio(['welcome.wav'])
 | 
				
			||||||
    this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')!
 | 
					    this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')!
 | 
				
			||||||
    this.initParams()
 | 
					    this.initParams()
 | 
				
			||||||
@ -174,15 +179,14 @@ struct Index {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  async initParams() {
 | 
					  async initParams() {
 | 
				
			||||||
    console.log("test1111")
 | 
					    console.log("test1111")
 | 
				
			||||||
    ObtainUdpBusinessInstance.init();
 | 
					 | 
				
			||||||
    await GetDeviceInfo(this.context)
 | 
					    await GetDeviceInfo(this.context)
 | 
				
			||||||
    this.carInfo = await GetCarInfo()
 | 
					    this.carInfo = await GetCarInfo()
 | 
				
			||||||
    CenterUDPBusinessInstance.init();
 | 
					    // TODO
 | 
				
			||||||
    CenterUDPBusinessInstance.onMsg((data: centerCallBackMsgType) => {
 | 
					    // CenterUDPBusinessInstance.onMsg((data: CenterCallBackMsgType) => {
 | 
				
			||||||
      if (data.id == 32) {
 | 
					    //   if (data.id == 32) {
 | 
				
			||||||
        AppStorage.setOrCreate('signNum', data.body[1])
 | 
					    //     AppStorage.setOrCreate('signNum', data.body[1])
 | 
				
			||||||
      }
 | 
					    //   }
 | 
				
			||||||
    },)
 | 
					    // },)
 | 
				
			||||||
    this.carInfo = AppStorage.get<CarInfoType>('carInfo')!
 | 
					    this.carInfo = AppStorage.get<CarInfoType>('carInfo')!
 | 
				
			||||||
    this.deviceId = this.carInfo.carNo || ""
 | 
					    this.deviceId = this.carInfo.carNo || ""
 | 
				
			||||||
    await SetCurrentTime()
 | 
					    await SetCurrentTime()
 | 
				
			||||||
@ -205,6 +209,7 @@ struct Index {
 | 
				
			|||||||
      HeaderComponent({
 | 
					      HeaderComponent({
 | 
				
			||||||
        shortLogo: false
 | 
					        shortLogo: false
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      CardComponent({
 | 
					      CardComponent({
 | 
				
			||||||
        isSingle: this.singlePlay,
 | 
					        isSingle: this.singlePlay,
 | 
				
			||||||
        singleClick: () => {
 | 
					        singleClick: () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -164,3 +164,5 @@ export function CreateAlbum(fileHelper: FileHelper) {
 | 
				
			|||||||
  fileHelper.createAlbum('pz');
 | 
					  fileHelper.createAlbum('pz');
 | 
				
			||||||
  fileHelper.createAlbum(date);
 | 
					  fileHelper.createAlbum(date);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { GPSData, SignalData } from '../mock';
 | 
					import { GPSData, SignalData } from '../mock';
 | 
				
			||||||
import { SignalDataType } from '../model';
 | 
					import { SignalDataType } from '../model';
 | 
				
			||||||
import signDisplayCom from './compontents/SignDisplayCom';
 | 
					import SignalDisplayComponent from './compontents/SignalDisplay';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Entry
 | 
					@Entry
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
@ -14,12 +14,12 @@ struct Index {
 | 
				
			|||||||
  @State @Watch('outClick') outFlag: boolean = false;
 | 
					  @State @Watch('outClick') outFlag: boolean = false;
 | 
				
			||||||
  @State url: string = ''
 | 
					  @State url: string = ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //  @State gpsList: Array<any> = []
 | 
					 | 
				
			||||||
  build() {
 | 
					  build() {
 | 
				
			||||||
    Column() {
 | 
					    Column() {
 | 
				
			||||||
      signDisplayCom({
 | 
					      // signDisplayCom({
 | 
				
			||||||
        showBack: true
 | 
					      //   showBack: true
 | 
				
			||||||
      })
 | 
					      // })
 | 
				
			||||||
 | 
					      SignalDisplayComponent()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    .width('100%')
 | 
					    .width('100%')
 | 
				
			||||||
    .height('100%')
 | 
					    .height('100%')
 | 
				
			||||||
 | 
				
			|||||||
@ -21,7 +21,7 @@ import { CryptoJS } from '@ohos/crypto-js';
 | 
				
			|||||||
import {
 | 
					import {
 | 
				
			||||||
  BeginExamRequest,
 | 
					  BeginExamRequest,
 | 
				
			||||||
  CarInfoType,
 | 
					  CarInfoType,
 | 
				
			||||||
  centerCallBackMsgType,
 | 
					  CenterCallBackMsgType,
 | 
				
			||||||
  DrvexamType,
 | 
					  DrvexamType,
 | 
				
			||||||
  ExaminationStuAbsentParams,
 | 
					  ExaminationStuAbsentParams,
 | 
				
			||||||
  ExaminerLoginInfo,
 | 
					  ExaminerLoginInfo,
 | 
				
			||||||
@ -1312,7 +1312,7 @@ struct UserInfo {
 | 
				
			|||||||
    .backgroundImageSize({ width: '100%', height: '100%' })
 | 
					    .backgroundImageSize({ width: '100%', height: '100%' })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private onCenterMsg = (val: centerCallBackMsgType) => {
 | 
					  private onCenterMsg = (val: CenterCallBackMsgType) => {
 | 
				
			||||||
    if (val.id == 32) {
 | 
					    if (val.id == 32) {
 | 
				
			||||||
      AppStorage.setOrCreate('signNum', val.body[1])
 | 
					      AppStorage.setOrCreate('signNum', val.body[1])
 | 
				
			||||||
      if (val.body[0] == 7) {
 | 
					      if (val.body[0] == 7) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
import router from '@ohos.router';
 | 
					import router from '@ohos.router';
 | 
				
			||||||
import RealTime from '../compontents/judge/RealTime';
 | 
					import RealTime from '../compontents/judge/RealTime';
 | 
				
			||||||
import { GPSData, SignalData } from '../../mock';
 | 
					import { GPSData, SignalData } from '../../mock';
 | 
				
			||||||
import { SignalDataType } from '../../model';
 | 
					import { SignalDataType, WorkerBackMessage } from '../../model';
 | 
				
			||||||
import { ObtainUdpBusinessInstance } from '../../utils/business/ObtainUdpBusiness';
 | 
					import { ObtainUdpBusinessInstance } from '../../utils/business/ObtainUdpBusiness';
 | 
				
			||||||
 | 
					import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignal';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
export default struct SignDisplayCom {
 | 
					export default struct SignDisplayCom {
 | 
				
			||||||
@ -331,12 +332,14 @@ export default struct SignDisplayCom {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (this.showBack) {
 | 
					    if (this.showBack) {
 | 
				
			||||||
      this.ratio = 1.4
 | 
					      this.ratio = 1.4
 | 
				
			||||||
      ObtainUdpBusinessInstance.onMsg((msg) => {
 | 
					      DifferentialAndSignal.onMsg((data: string) => {
 | 
				
			||||||
        if (msg) {
 | 
					        const result: WorkerBackMessage = JSON.parse(data)
 | 
				
			||||||
          this.getSignal(msg)
 | 
					        if (result.type === "centerUdpData") {
 | 
				
			||||||
 | 
					          this.getSignal(result.data as string)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      clearInterval(this.signalTimer)
 | 
					      clearInterval(this.signalTimer)
 | 
				
			||||||
      this.signalTimer = setInterval(() => {
 | 
					      this.signalTimer = setInterval(() => {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										271
									
								
								entry/src/main/ets/pages/compontents/SignalDisplay.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								entry/src/main/ets/pages/compontents/SignalDisplay.ets
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,271 @@
 | 
				
			|||||||
 | 
					import router from '@ohos.router'
 | 
				
			||||||
 | 
					import { GPSData, SignalData } from '../../mock'
 | 
				
			||||||
 | 
					import { EnvironmentConfigurationType, SignalDataType, WorkerBackMessage } from '../../model'
 | 
				
			||||||
 | 
					import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignal'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					export default struct SignalDisplayComponent {
 | 
				
			||||||
 | 
					  @State sjxhColum: Array<SignalDataType> = SignalData
 | 
				
			||||||
 | 
					  @State signArr: Array<string> = []
 | 
				
			||||||
 | 
					  @State GPSColum: Array<SignalDataType> = GPSData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  aboutToAppear(): void {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DifferentialAndSignal.onMsg((data: string) => {
 | 
				
			||||||
 | 
					      const result: WorkerBackMessage = JSON.parse(data)
 | 
				
			||||||
 | 
					      if (result.type === "centerUdpData") {
 | 
				
			||||||
 | 
					        this.getSignal(result.data as string)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  getSignal = (msg: string) => {
 | 
				
			||||||
 | 
					    const strachArr = msg.split(',')
 | 
				
			||||||
 | 
					    if (strachArr[0] != '#DN_GD') {
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.signArr = strachArr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (let i = 0; i <= 12; i++) {
 | 
				
			||||||
 | 
					      this.sjxhColum[i].value = this.signArr[i+2]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.sjxhColum[13].value = this.signArr[17]
 | 
				
			||||||
 | 
					    this.sjxhColum[14].value = this.signArr[18]
 | 
				
			||||||
 | 
					    this.sjxhColum[15].value = this.signArr[19]
 | 
				
			||||||
 | 
					    this.sjxhColum[16].value = this.signArr[20]
 | 
				
			||||||
 | 
					    this.sjxhColum[17].value = this.signArr[23] //车速
 | 
				
			||||||
 | 
					    this.sjxhColum[18].value = this.signArr[28]
 | 
				
			||||||
 | 
					    this.sjxhColum[19].value = this.signArr[29]
 | 
				
			||||||
 | 
					    this.sjxhColum[20].value = this.signArr[30]
 | 
				
			||||||
 | 
					    this.sjxhColum[21].value = this.signArr[15] //NC
 | 
				
			||||||
 | 
					    this.sjxhColum[22].value = this.signArr[16] //SA15
 | 
				
			||||||
 | 
					    this.sjxhColum[23].value = this.signArr[21]
 | 
				
			||||||
 | 
					    this.sjxhColum[24].value = this.signArr[22]
 | 
				
			||||||
 | 
					    this.sjxhColum[25].value = this.signArr[24]
 | 
				
			||||||
 | 
					    this.sjxhColum[26].value = this.signArr[26]
 | 
				
			||||||
 | 
					    this.sjxhColum[27].value = this.signArr[25]
 | 
				
			||||||
 | 
					    this.sjxhColum[28].value = this.signArr[27]
 | 
				
			||||||
 | 
					    this.sjxhColum[29].value = this.signArr[31]
 | 
				
			||||||
 | 
					    this.sjxhColum[30].value = this.signArr[32]
 | 
				
			||||||
 | 
					    this.sjxhColum[31].value = this.signArr[33]
 | 
				
			||||||
 | 
					    this.sjxhColum[32].value = this.signArr[34]
 | 
				
			||||||
 | 
					    this.sjxhColum[33].value = this.signArr[35]
 | 
				
			||||||
 | 
					    for (let i = 34; i <= 46; i++) {
 | 
				
			||||||
 | 
					      this.sjxhColum[i].value = this.signArr[i+2]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let t = 0
 | 
				
			||||||
 | 
					    for (let i = 83; i <= 97; i++) {
 | 
				
			||||||
 | 
					      this.GPSColum[t].value = this.signArr[i]
 | 
				
			||||||
 | 
					      t++
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.GPSColum[14].value = ((Number((this.signArr[97] || 0)) * 1.852).toFixed(2)).toString()
 | 
				
			||||||
 | 
					    const str0 = this.signArr[93].substr(0, 2)
 | 
				
			||||||
 | 
					    const str1 = this.signArr[93].substr(2, 2)
 | 
				
			||||||
 | 
					    const str2 = this.signArr[93].substr(4.2)
 | 
				
			||||||
 | 
					    this.signArr[93] = str2 + str1 + str0
 | 
				
			||||||
 | 
					    this.GPSColum[10].value = this.signArr[93]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // this.signArr[53]=192.168.7.170'
 | 
				
			||||||
 | 
					    this.sjxhColum = JSON.parse(JSON.stringify((this.sjxhColum)))
 | 
				
			||||||
 | 
					    this.signArr = JSON.parse(JSON.stringify((this.signArr)))
 | 
				
			||||||
 | 
					    this.GPSColum = JSON.parse(JSON.stringify((this.GPSColum)))
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  build() {
 | 
				
			||||||
 | 
					    Column() {
 | 
				
			||||||
 | 
					      //   头部
 | 
				
			||||||
 | 
					      Flex({
 | 
				
			||||||
 | 
					        alignItems: ItemAlign.Center,
 | 
				
			||||||
 | 
					        justifyContent: FlexAlign.SpaceBetween
 | 
				
			||||||
 | 
					      }) {
 | 
				
			||||||
 | 
					        Row() {
 | 
				
			||||||
 | 
					          // 短logo
 | 
				
			||||||
 | 
					          Image($r('app.media.shortLogo')).height(100).width(150).objectFit(ImageFit.Contain).margin({
 | 
				
			||||||
 | 
					            left: 10
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Row() {
 | 
				
			||||||
 | 
					          //   返回按钮
 | 
				
			||||||
 | 
					          Image($r('app.media.topB_back')).height(100).onClick(() => {
 | 
				
			||||||
 | 
					            router.back()
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }.width("100%").height(100)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      Column() {
 | 
				
			||||||
 | 
					        // GPS信号展示
 | 
				
			||||||
 | 
					        GPSComponent({
 | 
				
			||||||
 | 
					          data: this.signArr
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        //   车载信号以及车载坐标
 | 
				
			||||||
 | 
					        Column() {
 | 
				
			||||||
 | 
					          CarComponent({
 | 
				
			||||||
 | 
					            data: this.sjxhColum
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					          CoordinateComponent({
 | 
				
			||||||
 | 
					            data: this.GPSColum
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        }.margin({
 | 
				
			||||||
 | 
					          top: 5
 | 
				
			||||||
 | 
					        }).backgroundColor("#282828")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      .width("100%")
 | 
				
			||||||
 | 
					      .height("100%")
 | 
				
			||||||
 | 
					      .backgroundColor("#fff")
 | 
				
			||||||
 | 
					      .borderRadius(20)
 | 
				
			||||||
 | 
					      .padding(20)
 | 
				
			||||||
 | 
					      .margin(20)
 | 
				
			||||||
 | 
					    }.width("100%").height("100%").backgroundColor("#222222")
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					struct GPSComponent {
 | 
				
			||||||
 | 
					  @State data: Array<string> = []
 | 
				
			||||||
 | 
					  @State ip: string = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  aboutToAppear(): void {
 | 
				
			||||||
 | 
					    // 获取config
 | 
				
			||||||
 | 
					    let config: EnvironmentConfigurationType =
 | 
				
			||||||
 | 
					      AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration") || {
 | 
				
			||||||
 | 
					        tcplocalIp: "",
 | 
				
			||||||
 | 
					        tcplocalIpPort: "",
 | 
				
			||||||
 | 
					        tcpOppositeIp: "",
 | 
				
			||||||
 | 
					        tcpOppositePort: ""
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    this.ip = config.tcplocalIp
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  build() {
 | 
				
			||||||
 | 
					    Flex({
 | 
				
			||||||
 | 
					      wrap: FlexWrap.Wrap
 | 
				
			||||||
 | 
					    }) {
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "发送次数",
 | 
				
			||||||
 | 
					        value: this.data[49] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "固件版本",
 | 
				
			||||||
 | 
					        value: this.data[54] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "方向盘类型",
 | 
				
			||||||
 | 
					        value: this.data[50] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "按键数值",
 | 
				
			||||||
 | 
					        value: this.data[55] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "GPS错误次数",
 | 
				
			||||||
 | 
					        value: this.data[60] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "汽车类型",
 | 
				
			||||||
 | 
					        value: this.data[51] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "GPS板卡类型",
 | 
				
			||||||
 | 
					        value: this.data[56] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "本机IP",
 | 
				
			||||||
 | 
					        value: this.ip
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "接口心跳",
 | 
				
			||||||
 | 
					        value: this.data[52] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "GPS板卡软件版本",
 | 
				
			||||||
 | 
					        value: this.data[57] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "改正数次数/改正数大小",
 | 
				
			||||||
 | 
					        value: this.data[58] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "已工作时长/设定工作时长",
 | 
				
			||||||
 | 
					        value: this.data[61] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "GPS数据次数/数据长度",
 | 
				
			||||||
 | 
					        value: this.data[59] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      blockComponent({
 | 
				
			||||||
 | 
					        label: "改正数据长度*数据长度-基准站RTCM改正数类型",
 | 
				
			||||||
 | 
					        value: this.data[62] || "-"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }.backgroundColor("#282828").width("100%")
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					struct CarComponent {
 | 
				
			||||||
 | 
					  @State data: Array<SignalDataType> = SignalData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  build() {
 | 
				
			||||||
 | 
					    Flex({
 | 
				
			||||||
 | 
					      wrap: FlexWrap.Wrap
 | 
				
			||||||
 | 
					    }) {
 | 
				
			||||||
 | 
					      ForEach(this.data, (item: SignalDataType) => {
 | 
				
			||||||
 | 
					        blockComponent({
 | 
				
			||||||
 | 
					          label: item.key,
 | 
				
			||||||
 | 
					          value: item.value
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }.width("100%")
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					struct CoordinateComponent {
 | 
				
			||||||
 | 
					  @State data: Array<SignalDataType> = GPSData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  build() {
 | 
				
			||||||
 | 
					    Column() {
 | 
				
			||||||
 | 
					      Text("GPS坐标").fontColor("#FFB433").fontSize(20).margin({
 | 
				
			||||||
 | 
					        top: 20
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      Flex({
 | 
				
			||||||
 | 
					        wrap: FlexWrap.Wrap
 | 
				
			||||||
 | 
					      }) {
 | 
				
			||||||
 | 
					        ForEach(this.data, (item: SignalDataType) => {
 | 
				
			||||||
 | 
					          blockComponent({
 | 
				
			||||||
 | 
					            color: "#FFB433",
 | 
				
			||||||
 | 
					            label: item.key,
 | 
				
			||||||
 | 
					            value: item.value
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }.width("100%").backgroundColor("#1A1A1A").justifyContent(FlexAlign.Center)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					struct blockComponent {
 | 
				
			||||||
 | 
					  @State label: string = "发送次数"
 | 
				
			||||||
 | 
					  @State value: string = "1"
 | 
				
			||||||
 | 
					  @State widthNum: number = 130
 | 
				
			||||||
 | 
					  @State color: string = "#FDF5E7"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  build() {
 | 
				
			||||||
 | 
					    Row() {
 | 
				
			||||||
 | 
					      Row() {
 | 
				
			||||||
 | 
					        Text(this.label + ":").fontColor(this.color)
 | 
				
			||||||
 | 
					      }.width(this.widthNum).justifyContent(FlexAlign.End)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      Row() {
 | 
				
			||||||
 | 
					        Text(this.value).fontColor(this.color)
 | 
				
			||||||
 | 
					      }.width(80).justifyContent(FlexAlign.Start).margin({
 | 
				
			||||||
 | 
					        left: 20
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }.height(65).justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -10,7 +10,7 @@ export default class TcpClient {
 | 
				
			|||||||
  private oppositeIp: string = ''
 | 
					  private oppositeIp: string = ''
 | 
				
			||||||
  private oppositeIpPort: string = ''
 | 
					  private oppositeIpPort: string = ''
 | 
				
			||||||
  private tcpSendNum: number = 0
 | 
					  private tcpSendNum: number = 0
 | 
				
			||||||
  private tcp: socket.TCPSocket = null
 | 
					  private tcp: socket.TCPSocket = socket.constructTCPSocketInstance()
 | 
				
			||||||
  private events: Array<Function> = []
 | 
					  private events: Array<Function> = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor() {
 | 
					  constructor() {
 | 
				
			||||||
@ -20,59 +20,102 @@ export default class TcpClient {
 | 
				
			|||||||
    return TcpClient.instance
 | 
					    return TcpClient.instance
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init(tcpLocalIp: string, tcpLocalIpPort: string, tcpOppositeIp: string, tcpOppositePort: string) {
 | 
					  // 初始化tcp连接
 | 
				
			||||||
 | 
					  async init(tcpLocalIp: string, tcpLocalIpPort: string, tcpOppositeIp: string, tcpOppositePort: string) {
 | 
				
			||||||
    this.localIp = tcpLocalIp
 | 
					    this.localIp = tcpLocalIp
 | 
				
			||||||
    this.oppositeIp = tcpOppositeIp
 | 
					    this.oppositeIp = tcpOppositeIp
 | 
				
			||||||
    this.localIpPort = tcpLocalIpPort
 | 
					    this.localIpPort = tcpLocalIpPort
 | 
				
			||||||
    this.oppositeIpPort = tcpOppositePort
 | 
					    this.oppositeIpPort = tcpOppositePort
 | 
				
			||||||
    console.log(TCPTag, 'new Tcp', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
 | 
					    console.log(TCPTag, 'new Tcp', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
 | 
				
			||||||
    this.tcp = socket.constructTCPSocketInstance();
 | 
					    this.tcp = socket.constructTCPSocketInstance();
 | 
				
			||||||
    this.bindTcp()
 | 
					    await this.bindTcp()
 | 
				
			||||||
 | 
					    await this.connectTcp()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bindTcp(): Promise<void> {
 | 
					  // 绑定tcp
 | 
				
			||||||
    return this.tcp.bind({
 | 
					  bindTcp(): Promise<Boolean> {
 | 
				
			||||||
      address: this.localIp, port: parseInt(this.localIpPort), family: 1
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					      this.tcp.bind({
 | 
				
			||||||
 | 
					        address: this.localIp,
 | 
				
			||||||
 | 
					        port: Number(this.localIpPort),
 | 
				
			||||||
 | 
					        family: 1
 | 
				
			||||||
      }).then(() => {
 | 
					      }).then(() => {
 | 
				
			||||||
      return this.tcp.connect({
 | 
					        console.log(TCPTag, 'bindTcp success:', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
 | 
				
			||||||
        address: {
 | 
					        resolve(true)
 | 
				
			||||||
          address: this.oppositeIp, port: parseInt(this.oppositeIpPort)
 | 
					      }).catch((err: BusinessError) => {
 | 
				
			||||||
        },
 | 
					        console.log(TCPTag, 'bindTcp error:', JSON.stringify(err), this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
 | 
				
			||||||
        timeout: 6000
 | 
					        reject(err)
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    }).then(() => {
 | 
					    })
 | 
				
			||||||
      try {
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 连接tcp
 | 
				
			||||||
 | 
					  connectTcp(): Promise<Boolean> {
 | 
				
			||||||
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					      this.tcp.connect({
 | 
				
			||||||
 | 
					        address: {
 | 
				
			||||||
 | 
					          address: this.oppositeIp, port: Number(this.oppositeIpPort), family: 1
 | 
				
			||||||
 | 
					        }, timeout: 1000 * 15
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					        .then(() => {
 | 
				
			||||||
 | 
					          this.getMessage()
 | 
				
			||||||
 | 
					          console.log(TCPTag, "tcp connect success")
 | 
				
			||||||
 | 
					          return this.tcp.setExtraOptions({
 | 
				
			||||||
 | 
					            keepAlive: true
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .then(() => {
 | 
				
			||||||
 | 
					          resolve(true)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .catch((err: BusinessError) => {
 | 
				
			||||||
 | 
					          console.log(TCPTag, "tcp connect or keepAlive error: ", JSON.stringify(err))
 | 
				
			||||||
 | 
					          console.log(TCPTag, "tcp 重启服务")
 | 
				
			||||||
 | 
					          reject(err)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  getMessage() {
 | 
				
			||||||
    this.tcp.on("message", value => {
 | 
					    this.tcp.on("message", value => {
 | 
				
			||||||
      let data = new DataView(value.message)
 | 
					      let data = new DataView(value.message)
 | 
				
			||||||
      this.events.forEach(cb => {
 | 
					      this.events.forEach(cb => {
 | 
				
			||||||
        cb(value.message.slice(5, data.byteLength))
 | 
					        cb(value.message.slice(5, data.byteLength))
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
        return Promise.resolve()
 | 
					 | 
				
			||||||
      } catch (e) {
 | 
					 | 
				
			||||||
        return Promise.reject(e)
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 重新绑定tcp
 | 
				
			||||||
  async reBind() {
 | 
					  async reBind() {
 | 
				
			||||||
    await this.close()
 | 
					    await this.close()
 | 
				
			||||||
    this.tcp = socket.constructTCPSocketInstance();
 | 
					    this.tcp = socket.constructTCPSocketInstance();
 | 
				
			||||||
    await this.bindTcp()
 | 
					    await this.bindTcp()
 | 
				
			||||||
 | 
					    await this.connectTcp()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 监听tcp错误
 | 
				
			||||||
 | 
					  onError(callback: Function) {
 | 
				
			||||||
 | 
					    this.tcp.on('error', err => {
 | 
				
			||||||
 | 
					      console.log(TCPTag, 'tcp on error: ', JSON.stringify(err))
 | 
				
			||||||
 | 
					      callback?.()
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 关闭tcp连接
 | 
				
			||||||
  close(): Promise<void> {
 | 
					  close(): Promise<void> {
 | 
				
			||||||
    return this.tcp?.close()
 | 
					    return this.tcp?.close()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 监听tcp消息
 | 
				
			||||||
  onMsg(callback: Function) {
 | 
					  onMsg(callback: Function) {
 | 
				
			||||||
    this.events.push(callback)
 | 
					    this.events.push(callback)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 接收tcp消息
 | 
				
			||||||
  sendMsg(data: string): Promise<void> {
 | 
					  sendMsg(data: string): Promise<void> {
 | 
				
			||||||
    return this.tcp?.send({
 | 
					    return this.tcp?.send({
 | 
				
			||||||
      data
 | 
					      data
 | 
				
			||||||
    }).catch(async (err: BusinessError) => {
 | 
					    }).catch(async (err: BusinessError) => {
 | 
				
			||||||
 | 
					      console.log(TCPTag, 'sendMsg error:', JSON.stringify(err))
 | 
				
			||||||
      this.tcpSendNum++
 | 
					      this.tcpSendNum++
 | 
				
			||||||
      if (this.tcpSendNum > 10) {
 | 
					      if (this.tcpSendNum > 10) {
 | 
				
			||||||
        this.tcpSendNum = 0
 | 
					        this.tcpSendNum = 0
 | 
				
			||||||
@ -82,6 +125,7 @@ export default class TcpClient {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 取消监听tcp消息
 | 
				
			||||||
  offMsg(callback: Function) {
 | 
					  offMsg(callback: Function) {
 | 
				
			||||||
    this.events = this.events.filter(cb => cb !== callback)
 | 
					    this.events = this.events.filter(cb => cb !== callback)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,6 @@
 | 
				
			|||||||
import socket from '@ohos.net.socket'
 | 
					import socket from '@ohos.net.socket'
 | 
				
			||||||
import promptAction from '@ohos.promptAction'
 | 
					 | 
				
			||||||
import { CarInfoType, EnvironmentConfigurationType } from '../model'
 | 
					 | 
				
			||||||
import { UDPTag } from '../config'
 | 
					import { UDPTag } from '../config'
 | 
				
			||||||
import { BusinessError } from '@ohos.base'
 | 
					import { FillZero, StringToASCII } from './Common'
 | 
				
			||||||
import { FillZero, StringToBytes, StringToASCII } from './Common'
 | 
					 | 
				
			||||||
import { CenterUDPBusinessInstance } from './business/CenterUdpBusiness'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface MsgExt {
 | 
					interface MsgExt {
 | 
				
			||||||
  id: number,
 | 
					  id: number,
 | 
				
			||||||
@ -33,31 +29,16 @@ type DealMethod<T extends Object> = (value: ArrayBuffer) => T
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class UdpClient {
 | 
					export default class UdpClient {
 | 
				
			||||||
 | 
					  protected udp: socket.UDPSocket | null = null
 | 
				
			||||||
  private localIp: string = ''
 | 
					  private localIp: string = ''
 | 
				
			||||||
  private localIpPort: string = ''
 | 
					  private localIpPort: string = ''
 | 
				
			||||||
  private oppositeIp: string = ''
 | 
					  private oppositeIp: string = ''
 | 
				
			||||||
  private oppositeIpPort: string = ''
 | 
					  private oppositeIpPort: string = ''
 | 
				
			||||||
  protected udp: socket.UDPSocket | null = null
 | 
					 | 
				
			||||||
  private messageEvents: Array<Function> = []
 | 
					  private messageEvents: Array<Function> = []
 | 
				
			||||||
  private errorEvents: Array<Function> = []
 | 
					  private errorEvents: Array<Function> = []
 | 
				
			||||||
  private dealMethod?: DealMethod<object>
 | 
					  private dealMethod?: DealMethod<object>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private bindEvent() {
 | 
					  // 绑定udp连接
 | 
				
			||||||
    this.udp?.on("message", value => {
 | 
					 | 
				
			||||||
      let result = this.dealMethod?.(value.message)
 | 
					 | 
				
			||||||
      this.messageEvents.forEach(cb => {
 | 
					 | 
				
			||||||
        cb(result)
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    this.udp?.on("error", (err) => {
 | 
					 | 
				
			||||||
      console.log(UDPTag, 'udp error', JSON.stringify(err))
 | 
					 | 
				
			||||||
      this.errorEvents.forEach(cb => {
 | 
					 | 
				
			||||||
        cb(err)
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bindUdp(): Promise<void> | undefined {
 | 
					  bindUdp(): Promise<void> | undefined {
 | 
				
			||||||
    console.log(UDPTag, "绑定udp", this.localIp, this.localIpPort)
 | 
					    console.log(UDPTag, "绑定udp", this.localIp, this.localIpPort)
 | 
				
			||||||
    return this.udp?.bind({
 | 
					    return this.udp?.bind({
 | 
				
			||||||
@ -67,6 +48,7 @@ export default class UdpClient {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 重新绑定udp连接
 | 
				
			||||||
  async reBind() {
 | 
					  async reBind() {
 | 
				
			||||||
    await this.close()
 | 
					    await this.close()
 | 
				
			||||||
    this.udp = socket.constructUDPSocketInstance();
 | 
					    this.udp = socket.constructUDPSocketInstance();
 | 
				
			||||||
@ -74,6 +56,7 @@ export default class UdpClient {
 | 
				
			|||||||
    await this.bindUdp()
 | 
					    await this.bindUdp()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 关闭udp连接
 | 
				
			||||||
  close(): Promise<void> | undefined {
 | 
					  close(): Promise<void> | undefined {
 | 
				
			||||||
    this.messageEvents = []
 | 
					    this.messageEvents = []
 | 
				
			||||||
    this.errorEvents = []
 | 
					    this.errorEvents = []
 | 
				
			||||||
@ -83,10 +66,12 @@ export default class UdpClient {
 | 
				
			|||||||
    return this.udp?.close()
 | 
					    return this.udp?.close()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 设置处理消息的函数
 | 
				
			||||||
  setDealMethod<T extends Object>(fun: DealMethod<T>) {
 | 
					  setDealMethod<T extends Object>(fun: DealMethod<T>) {
 | 
				
			||||||
    this.dealMethod = fun
 | 
					    this.dealMethod = fun
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 发送消息
 | 
				
			||||||
  sendMsg(data: ArrayBuffer | string): Promise<void> | undefined {
 | 
					  sendMsg(data: ArrayBuffer | string): Promise<void> | undefined {
 | 
				
			||||||
    return this.udp?.send({
 | 
					    return this.udp?.send({
 | 
				
			||||||
      data,
 | 
					      data,
 | 
				
			||||||
@ -98,6 +83,7 @@ export default class UdpClient {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 组装消息
 | 
				
			||||||
  setWholeMsg(params: MsgExt): ArrayBuffer {
 | 
					  setWholeMsg(params: MsgExt): ArrayBuffer {
 | 
				
			||||||
    let head = generateHead(params);
 | 
					    let head = generateHead(params);
 | 
				
			||||||
    let headJudge = exclusive(head);
 | 
					    let headJudge = exclusive(head);
 | 
				
			||||||
@ -108,11 +94,13 @@ export default class UdpClient {
 | 
				
			|||||||
    return new Uint8Array(arr).buffer
 | 
					    return new Uint8Array(arr).buffer
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 发送消息
 | 
				
			||||||
  sendMsgExt(param: MsgExt) {
 | 
					  sendMsgExt(param: MsgExt) {
 | 
				
			||||||
    const msgData = this.setWholeMsg(param)
 | 
					    const msgData = this.setWholeMsg(param)
 | 
				
			||||||
    this.sendMsg(msgData)
 | 
					    this.sendMsg(msgData)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 创建udp实例
 | 
				
			||||||
  async create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
 | 
					  async create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
 | 
				
			||||||
    console.log(UDPTag, "udp 初始化参数", udpLocalIp, udpLocalIpPort, udpOppositeIp, udpOppositeIpPort)
 | 
					    console.log(UDPTag, "udp 初始化参数", udpLocalIp, udpLocalIpPort, udpOppositeIp, udpOppositeIpPort)
 | 
				
			||||||
    await this.close()
 | 
					    await this.close()
 | 
				
			||||||
@ -129,19 +117,38 @@ export default class UdpClient {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 绑定消息事件
 | 
				
			||||||
  onMsg(callback: Function) {
 | 
					  onMsg(callback: Function) {
 | 
				
			||||||
    if (this.messageEvents.findIndex(cb => cb === callback)) {
 | 
					    if (this.messageEvents.findIndex(cb => cb === callback) !== -1) {
 | 
				
			||||||
      return
 | 
					      return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    this.messageEvents.push(callback)
 | 
					    this.messageEvents.push(callback)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 绑定错误事件
 | 
				
			||||||
  onError(callback: Function) {
 | 
					  onError(callback: Function) {
 | 
				
			||||||
    this.errorEvents.push(callback)
 | 
					    this.errorEvents.push(callback)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 取消绑定事件
 | 
				
			||||||
  offMsg(callback: Function) {
 | 
					  offMsg(callback: Function) {
 | 
				
			||||||
    this.messageEvents = this.messageEvents.filter(cb => cb !== callback)
 | 
					    this.messageEvents = this.messageEvents.filter(cb => cb !== callback)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 绑定事件
 | 
				
			||||||
 | 
					  private bindEvent() {
 | 
				
			||||||
 | 
					    this.udp?.on("message", value => {
 | 
				
			||||||
 | 
					      let result = this.dealMethod?.(value.message)
 | 
				
			||||||
 | 
					      this.messageEvents.forEach(cb => {
 | 
				
			||||||
 | 
					        cb(result)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    this.udp?.on("error", (err) => {
 | 
				
			||||||
 | 
					      console.log(UDPTag, 'udp error', JSON.stringify(err))
 | 
				
			||||||
 | 
					      this.errorEvents.forEach(cb => {
 | 
				
			||||||
 | 
					        cb(err)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,11 @@
 | 
				
			|||||||
// 中心心跳/发送消息
 | 
					// 中心心跳/发送消息
 | 
				
			||||||
import { CarInfoType, centerCallBackMsgType, EnvironmentConfigurationType, UDPParamType } from '../../model';
 | 
					import {
 | 
				
			||||||
 | 
					  CarInfoType,
 | 
				
			||||||
 | 
					  CenterCallBackMsgType,
 | 
				
			||||||
 | 
					  EnvironmentConfigurationType,
 | 
				
			||||||
 | 
					  OtherMessageType,
 | 
				
			||||||
 | 
					  UDPParamType
 | 
				
			||||||
 | 
					} from '../../model';
 | 
				
			||||||
import { fillZero, string2Bytes } from '../../pages/judgeSDK/utils/Common';
 | 
					import { fillZero, string2Bytes } from '../../pages/judgeSDK/utils/Common';
 | 
				
			||||||
import { NumberToByteArray } from '../Common';
 | 
					import { NumberToByteArray } from '../Common';
 | 
				
			||||||
import UdpClient from '../UdpUtils';
 | 
					import UdpClient from '../UdpUtils';
 | 
				
			||||||
@ -13,6 +19,10 @@ class CenterUDPBusiness {
 | 
				
			|||||||
  private timer: number = -1
 | 
					  private timer: number = -1
 | 
				
			||||||
  private headLength: number = 9
 | 
					  private headLength: number = 9
 | 
				
			||||||
  private sendId: number = 0
 | 
					  private sendId: number = 0
 | 
				
			||||||
 | 
					  private carInfo: CarInfoType = {}
 | 
				
			||||||
 | 
					  private signNum: number = -1
 | 
				
			||||||
 | 
					  private statue: string = ""
 | 
				
			||||||
 | 
					  private lsh: string = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor() {
 | 
					  constructor() {
 | 
				
			||||||
    if (CenterUDPBusiness.instance) {
 | 
					    if (CenterUDPBusiness.instance) {
 | 
				
			||||||
@ -21,7 +31,71 @@ class CenterUDPBusiness {
 | 
				
			|||||||
    return CenterUDPBusiness.instance
 | 
					    return CenterUDPBusiness.instance
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private dealMsg(msg: ArrayBuffer): centerCallBackMsgType {
 | 
					  sendData(data: UDPParamType) {
 | 
				
			||||||
 | 
					    this.sendId = data.id
 | 
				
			||||||
 | 
					    const param = this.setWholeMsg(data)
 | 
				
			||||||
 | 
					    this.udp.sendMsg(param);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  startHeartBeat() {
 | 
				
			||||||
 | 
					    // 组装消息,一秒发送一次
 | 
				
			||||||
 | 
					    this.timer = setInterval(() => {
 | 
				
			||||||
 | 
					      SetSerialNumber()
 | 
				
			||||||
 | 
					      // const signNum = AppStorage.get<number>('signNum')
 | 
				
			||||||
 | 
					      // const statue = AppStorage.get<string>('statue')
 | 
				
			||||||
 | 
					      // const lsh = AppStorage.get<string>('lsh')
 | 
				
			||||||
 | 
					      const arr = [this.signNum || 0, this.statue || 1]
 | 
				
			||||||
 | 
					      let tmpList: number[] = [];
 | 
				
			||||||
 | 
					      tmpList.push(NumberToByteArray(Number(arr[0]), 1 * 8)[0])
 | 
				
			||||||
 | 
					      tmpList.push(NumberToByteArray(Number(arr[1]), 1 * 8)[0])
 | 
				
			||||||
 | 
					      const str = this.lsh || '0000000000000'
 | 
				
			||||||
 | 
					      for (let i = 0; i < str.length; i++) {
 | 
				
			||||||
 | 
					        tmpList.push(NumberToByteArray(str.charCodeAt(i), 1 * 8)[0])
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // const carInfo = AppStorage.get<CarInfoType>('carInfo')!
 | 
				
			||||||
 | 
					      const data: UDPParamType = {
 | 
				
			||||||
 | 
					        id: 31,
 | 
				
			||||||
 | 
					        list: tmpList,
 | 
				
			||||||
 | 
					        carNo: this.carInfo.carNo!,
 | 
				
			||||||
 | 
					        placeId: this.carInfo.examinationRoomId!
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      const param = this.setWholeMsg(data)
 | 
				
			||||||
 | 
					      this.udp.sendMsg(param);
 | 
				
			||||||
 | 
					    }, 1000);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onMsg(cb: (param: CenterCallBackMsgType) => void) {
 | 
				
			||||||
 | 
					    this.udp.onMsg(cb)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  offMsg(cb: (param: CenterCallBackMsgType) => void) {
 | 
				
			||||||
 | 
					    this.udp.offMsg(cb)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 初始化
 | 
				
			||||||
 | 
					  async init(config: EnvironmentConfigurationType, carInfo: CarInfoType, otherMessage: OtherMessageType) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      // let result: EnvironmentConfigurationType =
 | 
				
			||||||
 | 
					      //   AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
 | 
				
			||||||
 | 
					      // const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')!
 | 
				
			||||||
 | 
					      this.signNum = otherMessage.signNum || 0
 | 
				
			||||||
 | 
					      this.statue = otherMessage.statue || '1'
 | 
				
			||||||
 | 
					      this.lsh = otherMessage.lsh || '0000000000000'
 | 
				
			||||||
 | 
					      this.carInfo = carInfo
 | 
				
			||||||
 | 
					      this.udp.create(config.udplocalIp!, '8800', carInfo.udpAddress!, carInfo.messagePort!)
 | 
				
			||||||
 | 
					      this.udp.setDealMethod(this.dealMsg)
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      console.error(UDPTag, "初始化中心 udp失败")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 关闭所有动作
 | 
				
			||||||
 | 
					  async close() {
 | 
				
			||||||
 | 
					    clearInterval(this.timer)
 | 
				
			||||||
 | 
					    return this.udp.close()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private dealMsg(msg: ArrayBuffer): CenterCallBackMsgType {
 | 
				
			||||||
    let arr: number[] = []
 | 
					    let arr: number[] = []
 | 
				
			||||||
    let dataView = new DataView(msg)
 | 
					    let dataView = new DataView(msg)
 | 
				
			||||||
    for (let i = 0; i < dataView?.byteLength; ++i) {
 | 
					    for (let i = 0; i < dataView?.byteLength; ++i) {
 | 
				
			||||||
@ -82,65 +156,6 @@ class CenterUDPBusiness {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    return [result];
 | 
					    return [result];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  sendData(data: UDPParamType) {
 | 
					 | 
				
			||||||
    this.sendId = data.id
 | 
					 | 
				
			||||||
    const param = this.setWholeMsg(data)
 | 
					 | 
				
			||||||
    this.udp.sendMsg(param);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  startHeartBeat() {
 | 
					 | 
				
			||||||
    // 组装消息,一秒发送一次
 | 
					 | 
				
			||||||
    this.timer = setInterval(() => {
 | 
					 | 
				
			||||||
      SetSerialNumber()
 | 
					 | 
				
			||||||
      const signNum = AppStorage.get<number>('signNum')
 | 
					 | 
				
			||||||
      const statue = AppStorage.get<string>('statue')
 | 
					 | 
				
			||||||
      const lsh = AppStorage.get<string>('lsh')
 | 
					 | 
				
			||||||
      const arr = [signNum || 0, statue || 1]
 | 
					 | 
				
			||||||
      let tmpList: number[] = [];
 | 
					 | 
				
			||||||
      tmpList.push(NumberToByteArray(Number(arr[0]), 1 * 8)[0])
 | 
					 | 
				
			||||||
      tmpList.push(NumberToByteArray(Number(arr[1]), 1 * 8)[0])
 | 
					 | 
				
			||||||
      const str = lsh || '0000000000000'
 | 
					 | 
				
			||||||
      for (let i = 0; i < str.length; i++) {
 | 
					 | 
				
			||||||
        tmpList.push(NumberToByteArray(str.charCodeAt(i), 1 * 8)[0])
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      const carInfo = AppStorage.get<CarInfoType>('carInfo')!
 | 
					 | 
				
			||||||
      const data: UDPParamType = {
 | 
					 | 
				
			||||||
        id: 31,
 | 
					 | 
				
			||||||
        list: tmpList,
 | 
					 | 
				
			||||||
        carNo: carInfo.carNo!,
 | 
					 | 
				
			||||||
        placeId: carInfo.examinationRoomId!
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      const param = this.setWholeMsg(data)
 | 
					 | 
				
			||||||
      this.udp.sendMsg(param);
 | 
					 | 
				
			||||||
    }, 1000);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  onMsg(cb: (param: centerCallBackMsgType) => void) {
 | 
					 | 
				
			||||||
    this.udp.onMsg(cb)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  offMsg(cb: (param: centerCallBackMsgType) => void) {
 | 
					 | 
				
			||||||
    this.udp.offMsg(cb)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  async init() {
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
      let result: EnvironmentConfigurationType =
 | 
					 | 
				
			||||||
        AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
 | 
					 | 
				
			||||||
      const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')!
 | 
					 | 
				
			||||||
      this.udp.create(result.udplocalIp!, '8800', carInfo.udpAddress!, carInfo.messagePort!)
 | 
					 | 
				
			||||||
      this.udp.setDealMethod(this.dealMsg)
 | 
					 | 
				
			||||||
    } catch (e) {
 | 
					 | 
				
			||||||
      console.error(UDPTag, "初始化中心 udp失败")
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // 关闭所有动作
 | 
					 | 
				
			||||||
  async close() {
 | 
					 | 
				
			||||||
    clearInterval(this.timer)
 | 
					 | 
				
			||||||
    return this.udp.close()
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const CenterUDPBusinessInstance = new CenterUDPBusiness();
 | 
					export const CenterUDPBusinessInstance = new CenterUDPBusiness();
 | 
				
			||||||
							
								
								
									
										66
									
								
								entry/src/main/ets/utils/business/DifferentialAndSignal.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								entry/src/main/ets/utils/business/DifferentialAndSignal.ets
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					// 拉起Worker处理tcp信息以及接受后置机UDP信息
 | 
				
			||||||
 | 
					import worker, { MessageEvents } from '@ohos.worker';
 | 
				
			||||||
 | 
					import { WorkerTag } from '../../config';
 | 
				
			||||||
 | 
					import { CarInfoType, EnvironmentConfigurationType, WorkerMessage } from '../../model';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class differentialAndSignal {
 | 
				
			||||||
 | 
					  private workerInstance = new worker.ThreadWorker("entry/ets/workers/DifferentialCorrection.ets")
 | 
				
			||||||
 | 
					  private events: Array<Function> = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor() {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 初始化Worker
 | 
				
			||||||
 | 
					  init() {
 | 
				
			||||||
 | 
					    this.workerInstance = new worker.ThreadWorker("entry/ets/workers/DifferentialCorrection.ets");
 | 
				
			||||||
 | 
					    let config: EnvironmentConfigurationType =
 | 
				
			||||||
 | 
					      AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration") || {
 | 
				
			||||||
 | 
					        tcplocalIp: "",
 | 
				
			||||||
 | 
					        tcplocalIpPort: "",
 | 
				
			||||||
 | 
					        tcpOppositeIp: "",
 | 
				
			||||||
 | 
					        tcpOppositePort: ""
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')!
 | 
				
			||||||
 | 
					    const signNum = AppStorage.get<number>('signNum')
 | 
				
			||||||
 | 
					    const statue = AppStorage.get<string>('statue')
 | 
				
			||||||
 | 
					    const lsh = AppStorage.get<string>('lsh')
 | 
				
			||||||
 | 
					    const data: WorkerMessage = {
 | 
				
			||||||
 | 
					      config: config,
 | 
				
			||||||
 | 
					      carInfo: carInfo,
 | 
				
			||||||
 | 
					      otherMessage: {
 | 
				
			||||||
 | 
					        signNum: signNum || 0,
 | 
				
			||||||
 | 
					        statue: statue || "",
 | 
				
			||||||
 | 
					        lsh: lsh || ""
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.workerInstance.postMessage(JSON.stringify(data))
 | 
				
			||||||
 | 
					    this.getMessage()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 添加监听
 | 
				
			||||||
 | 
					  onMsg(callback: Function) {
 | 
				
			||||||
 | 
					    if (this.events.findIndex(cb => cb === callback) !== -1) return; // 防止重复添加监听器
 | 
				
			||||||
 | 
					    this.events.push(callback);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 取消监听
 | 
				
			||||||
 | 
					  offMsg(callback: Function) {
 | 
				
			||||||
 | 
					    this.events = this.events.filter((cb) => cb !== callback);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 获取Worker消息
 | 
				
			||||||
 | 
					  getMessage() {
 | 
				
			||||||
 | 
					    this.workerInstance.onmessage = (e: MessageEvents): void => {
 | 
				
			||||||
 | 
					      if (e.data) {
 | 
				
			||||||
 | 
					        console.log(WorkerTag, "Worker 收到消息: " + e.data);
 | 
				
			||||||
 | 
					        this.events.forEach((callback) => {
 | 
				
			||||||
 | 
					          callback(e.data);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        console.error(WorkerTag, "Worker 收到空消息");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const DifferentialAndSignal = new differentialAndSignal();
 | 
				
			||||||
@ -1,20 +1,31 @@
 | 
				
			|||||||
//差分信号
 | 
					//差分信号
 | 
				
			||||||
 | 
					import { TCPTag } from '../../config';
 | 
				
			||||||
import { EnvironmentConfigurationType } from '../../model';
 | 
					import { EnvironmentConfigurationType } from '../../model';
 | 
				
			||||||
import TcpClient from '../TcpUtils';
 | 
					import TcpClient from '../TcpUtils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class differentialSignal {
 | 
					class differentialSignal {
 | 
				
			||||||
  private differentialSignalTcp: TcpClient;
 | 
					  private differentialSignalTcp: TcpClient = new TcpClient()
 | 
				
			||||||
  private timer: number = -1
 | 
					  private timer: number = -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor() {
 | 
					  constructor() {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init() {
 | 
					  init(config: EnvironmentConfigurationType) {
 | 
				
			||||||
    this.differentialSignalTcp = new TcpClient();
 | 
					    this.differentialSignalTcp = new TcpClient();
 | 
				
			||||||
    let config: EnvironmentConfigurationType =
 | 
					    // let config: EnvironmentConfigurationType =
 | 
				
			||||||
      AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")
 | 
					    //   AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration") || {
 | 
				
			||||||
    this.differentialSignalTcp.init(config.tcplocalIp, config.tcplocalIpPort, config.tcpOppositeIp,
 | 
					    //     tcplocalIp: "",
 | 
				
			||||||
      config.tcpOppositePort);
 | 
					    //     tcplocalIpPort: "",
 | 
				
			||||||
 | 
					    //     tcpOppositeIp: "",
 | 
				
			||||||
 | 
					    //     tcpOppositePort: ""
 | 
				
			||||||
 | 
					    //   }
 | 
				
			||||||
 | 
					    console.log(TCPTag, "初始化", JSON.stringify(config))
 | 
				
			||||||
 | 
					    if (config.tcplocalIp || config.tcplocalIpPort || config.tcpOppositeIp || config.tcpOppositePort) {
 | 
				
			||||||
 | 
					      this.differentialSignalTcp.init(config.tcplocalIp || "", config.tcplocalIpPort || "", config.tcpOppositeIp || "",
 | 
				
			||||||
 | 
					        config.tcpOppositePort || "");
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      console.log(TCPTag, "未配置差分信号TCP信息,请在环境配置中设置")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 发送消息
 | 
					  // 发送消息
 | 
				
			||||||
@ -30,6 +41,7 @@ class differentialSignal {
 | 
				
			|||||||
  //   获取消息
 | 
					  //   获取消息
 | 
				
			||||||
  getData(callback: (data: ArrayBuffer) => void) {
 | 
					  getData(callback: (data: ArrayBuffer) => void) {
 | 
				
			||||||
    this.differentialSignalTcp.onMsg((data: ArrayBuffer) => {
 | 
					    this.differentialSignalTcp.onMsg((data: ArrayBuffer) => {
 | 
				
			||||||
 | 
					      console.log(TCPTag, "获取", data);
 | 
				
			||||||
      callback(data);
 | 
					      callback(data);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ class ObtainUdpBusiness {
 | 
				
			|||||||
    this.modelNo = GlobalConfig.modelNo || ""
 | 
					    this.modelNo = GlobalConfig.modelNo || ""
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init() {
 | 
					  init(config: EnvironmentConfigurationType) {
 | 
				
			||||||
    switch (this.modelNo) {
 | 
					    switch (this.modelNo) {
 | 
				
			||||||
      case "0":
 | 
					      case "0":
 | 
				
			||||||
        this.initSecondaryBoard()
 | 
					        this.initSecondaryBoard()
 | 
				
			||||||
@ -25,7 +25,7 @@ class ObtainUdpBusiness {
 | 
				
			|||||||
        this.initSecondGeneration()
 | 
					        this.initSecondGeneration()
 | 
				
			||||||
        break
 | 
					        break
 | 
				
			||||||
      case "3":
 | 
					      case "3":
 | 
				
			||||||
        this.initThirdGeneration()
 | 
					        this.initThirdGeneration(config)
 | 
				
			||||||
        break
 | 
					        break
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        this.initFirstGeneration()
 | 
					        this.initFirstGeneration()
 | 
				
			||||||
@ -68,7 +68,8 @@ class ObtainUdpBusiness {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  sendData(data: string) {
 | 
					  // 发送数据
 | 
				
			||||||
 | 
					  sendData(data: string | ArrayBuffer) {
 | 
				
			||||||
    switch (this.modelNo) {
 | 
					    switch (this.modelNo) {
 | 
				
			||||||
      case "0":
 | 
					      case "0":
 | 
				
			||||||
        this.sendSecondaryBoardMsg(data)
 | 
					        this.sendSecondaryBoardMsg(data)
 | 
				
			||||||
@ -98,11 +99,12 @@ class ObtainUdpBusiness {
 | 
				
			|||||||
  private initSecondGeneration() {
 | 
					  private initSecondGeneration() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 三代机udp初始化
 | 
					  // 三代机udp初始化
 | 
				
			||||||
  private initThirdGeneration() {
 | 
					  private initThirdGeneration(config: EnvironmentConfigurationType) {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      let config: EnvironmentConfigurationType =
 | 
					      // let config: EnvironmentConfigurationType =
 | 
				
			||||||
        AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
 | 
					      //   AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
 | 
				
			||||||
      console.log("获取udp设置", JSON.stringify(config))
 | 
					      console.log("获取udp设置", JSON.stringify(config))
 | 
				
			||||||
      this.thirdGenerationMachineUdp = new UdpClient()
 | 
					      this.thirdGenerationMachineUdp = new UdpClient()
 | 
				
			||||||
      this.thirdGenerationMachineUdp.create(config.udplocalIp!, config.udplocalIpPort!, config.udpOppositeIp!,
 | 
					      this.thirdGenerationMachineUdp.create(config.udplocalIp!, config.udplocalIpPort!, config.udpOppositeIp!,
 | 
				
			||||||
@ -153,19 +155,19 @@ class ObtainUdpBusiness {
 | 
				
			|||||||
    this.thirdGenerationMachineUdp!.onMsg(cb)
 | 
					    this.thirdGenerationMachineUdp!.onMsg(cb)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private sendSecondaryBoardMsg(data: string) {
 | 
					  private sendSecondaryBoardMsg(data: string | ArrayBuffer) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private sendFirstGenerationMsg(data: string) {
 | 
					  private sendFirstGenerationMsg(data: string | ArrayBuffer) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private sendSecondGenerationMsg(data: string) {
 | 
					  private sendSecondGenerationMsg(data: string | ArrayBuffer) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private sendThirdGenerationMsg(data: string) {
 | 
					  private sendThirdGenerationMsg(data: string | ArrayBuffer) {
 | 
				
			||||||
    this.thirdGenerationMachineUdp!.sendMsg(data)
 | 
					    this.thirdGenerationMachineUdp!.sendMsg(data)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										83
									
								
								entry/src/main/ets/workers/DifferentialCorrection.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								entry/src/main/ets/workers/DifferentialCorrection.ets
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					// 处理worker线程的消息tcp拿差分改正数,udp给后置机
 | 
				
			||||||
 | 
					import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';
 | 
				
			||||||
 | 
					import { WorkerTag } from '../config';
 | 
				
			||||||
 | 
					import { CenterCallBackMsgType, WorkerBackMessage, WorkerMessage } from '../model';
 | 
				
			||||||
 | 
					import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness';
 | 
				
			||||||
 | 
					import { DifferentialSignal } from '../utils/business/DifferentialSignal';
 | 
				
			||||||
 | 
					import { ObtainUdpBusinessInstance } from '../utils/business/ObtainUdpBusiness';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Defines the event handler to be called when the worker thread receives a message sent by the host thread.
 | 
				
			||||||
 | 
					 * The event handler is executed in the worker thread.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param e message data
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					workerPort.onmessage = (e: MessageEvents) => {
 | 
				
			||||||
 | 
					  console.log(WorkerTag, `Worker received message: ${e.data}`);
 | 
				
			||||||
 | 
					  const result: WorkerMessage = JSON.parse(e.data);
 | 
				
			||||||
 | 
					  // 初始化TCP
 | 
				
			||||||
 | 
					  DifferentialSignal.init(result.config);
 | 
				
			||||||
 | 
					  DifferentialSignal.sendData()
 | 
				
			||||||
 | 
					  // 初始化后置机UDP
 | 
				
			||||||
 | 
					  ObtainUdpBusinessInstance.init(result.config)
 | 
				
			||||||
 | 
					  // 初始化中心UDP
 | 
				
			||||||
 | 
					  CenterUDPBusinessInstance.init(result.config, result.carInfo, result.otherMessage)
 | 
				
			||||||
 | 
					  // 中心心跳
 | 
				
			||||||
 | 
					  CenterUDPBusinessInstance.startHeartBeat()
 | 
				
			||||||
 | 
					  // 如果外部有这个消息进来就开始给中心发送
 | 
				
			||||||
 | 
					  if (result.udpParam) {
 | 
				
			||||||
 | 
					    CenterUDPBusinessInstance.sendData(result.udpParam);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // 获取TCP差分改正数信号
 | 
				
			||||||
 | 
					  DifferentialSignal.getData((data: ArrayBuffer) => {
 | 
				
			||||||
 | 
					    console.log(WorkerTag, "Received differential signal data:", data.byteLength, "bytes")
 | 
				
			||||||
 | 
					    // TCP拿到差分改正数发给后置机
 | 
				
			||||||
 | 
					    ObtainUdpBusinessInstance.sendData(data)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  // 监听PLC和GPS信号
 | 
				
			||||||
 | 
					  ObtainUdpBusinessInstance.onMsg((data: string) => {
 | 
				
			||||||
 | 
					    // TODO
 | 
				
			||||||
 | 
					    // 需要观察
 | 
				
			||||||
 | 
					    console.log(WorkerTag, "后置机消息", data)
 | 
				
			||||||
 | 
					    // 收到后置机消息传出去提供给业务,data应该是个string
 | 
				
			||||||
 | 
					    workerPort.postMessage(
 | 
				
			||||||
 | 
					      JSON.stringify({
 | 
				
			||||||
 | 
					        type: 'obtainUdpData',
 | 
				
			||||||
 | 
					        data: data
 | 
				
			||||||
 | 
					      } as WorkerBackMessage))
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  CenterUDPBusinessInstance.onMsg((data: CenterCallBackMsgType) => {
 | 
				
			||||||
 | 
					    // TODO
 | 
				
			||||||
 | 
					    // 需要观察
 | 
				
			||||||
 | 
					    console.log(WorkerTag, "中心消息", data)
 | 
				
			||||||
 | 
					    //   收到中心指令发送出去
 | 
				
			||||||
 | 
					    workerPort.postMessage(
 | 
				
			||||||
 | 
					      JSON.stringify({
 | 
				
			||||||
 | 
					        type: 'centerUdpData',
 | 
				
			||||||
 | 
					        data: data
 | 
				
			||||||
 | 
					      } as WorkerBackMessage)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Defines the event handler to be called when the worker receives a message that cannot be deserialized.
 | 
				
			||||||
 | 
					 * The event handler is executed in the worker thread.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param e message data
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					workerPort.onmessageerror = (e: MessageEvents) => {
 | 
				
			||||||
 | 
					  console.log(WorkerTag, `Worker received message error: ${e.data}`);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Defines the event handler to be called when an exception occurs during worker execution.
 | 
				
			||||||
 | 
					 * The event handler is executed in the worker thread.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param e error message
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					workerPort.onerror = (e: ErrorEvent) => {
 | 
				
			||||||
 | 
					  console.log(WorkerTag, `Worker error: ${e.message}, filename: ${e.filename}, lineno: ${e.lineno}, colno: ${e.colno}`)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user