Compare commits

...

2 Commits

Author SHA1 Message Date
wangzhongjie
f140274c92 fix: 重构信号显示 2025-06-11 17:50:37 +08:00
wangzhongjie
17c8d88345 fix: 视频优化 2025-06-10 13:33:41 +08:00
22 changed files with 693 additions and 154 deletions

View File

@ -1,6 +1,11 @@
{
"apiType": "stageMode",
"buildOption": {
sourceOption: {
"workers": [
'./src/main/ets/workers/DifferentialCorrection.ets'
]
}
},
"buildOptionSet": [
{

View File

@ -29,3 +29,6 @@ export const RequestTag = '[Request]';
//entry tag
export const EntryTag = '[Entry]';
//worker tag
export const WorkerTag = '[Worker]';

View File

@ -12,7 +12,7 @@ export const GlobalConfig: GlobalConfigType = {
commonFileWriteAddress: '/mnt/hmdfs/100/account/device_view/local/files/duolun',
picSavePath: '/storage/cloud/100/files/Photo/',
videoSavePath: '/storage/cloud/100/files/Videos/',
host: 'http://172.37.55.192:8082',
host: 'http://192.168.32.105:8089',
modelNo: "3",
version: {
//杭州

View File

@ -10,9 +10,9 @@ import { JudgeConfigType } from '../model'
//考试回放开关
export const JudgeConfig:JudgeConfigType = {
export const JudgeConfig: JudgeConfigType = {
//本地目录开关
isTrajectoryOpen: true,
isTrajectoryOpen: false,
//是否开启拍照
isPhotoOpen: true,
//扣分语音是否强制开启

View File

@ -170,7 +170,7 @@ interface VersionInfo {
}
export interface centerCallBackMsgType {
export interface CenterCallBackMsgType {
id: number;
length: number;
body: number[];

View File

@ -1,5 +1,5 @@
export interface TakePhotoCallbackData {
fileSize: number;
fileSize: number
errorCode: number
}

View 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
}

View File

@ -19,3 +19,5 @@ export * from "./api"
export * from "./TableColumn"
export * from "./Other"
export * from "./Worker"

View File

@ -3,15 +3,13 @@ import router from '@ohos.router';
import { JudgeConfig } from '../config';
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 { CreateAlbum, GetCarInfo, GetDeviceInfo, SetCurrentTime, UseAuth } from './Index/utils';
import { GetSyncData, InitializeTheCentralTable } from '../utils/table/Operation';
import { BusinessError } from '@ohos.base';
import { delPic } from '../utils/Video';
import { FileHelper } from '../utils/FileHelp';
import { ObtainUdpBusinessInstance } from '../utils/business/ObtainUdpBusiness';
import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness';
import { DrivingDataStorage } from '../utils/business/DrivingDataStorage';
import { JudgeUdpBusinessInstance } from '../utils/business/JudgeUdpBusiness';
import { JudgeEmitterInstance } from '../utils/business/UdpEvent';
@ -20,6 +18,7 @@ import CardComponent from './Index/Card';
import BottomMessageComponent from './Index/BottomMessage';
import LoadingComponent from './Index/Loading';
import Prompt from '@system.prompt';
import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignal';
@Entry
@ -60,6 +59,7 @@ struct Index {
}
async aboutToAppear() {
console.log("首页 aboutToAppear")
await UseAuth(this.context)
this.ratio = AppStorage.get<BaseInfoType>('baseInfo')?.ratio || 1.4
this.angle = 0
@ -76,7 +76,12 @@ struct Index {
}
async onPageShow(): Promise<void> {
console.log("首页 onPageShow")
await UseAuth(this.context)
DifferentialAndSignal.init()
DifferentialAndSignal.onMsg(() => {
console.log("外层接受")
})
this.avPlayer.playAudio(['welcome.wav'])
this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')!
this.initParams()
@ -174,15 +179,14 @@ struct Index {
async initParams() {
console.log("test1111")
ObtainUdpBusinessInstance.init();
await GetDeviceInfo(this.context)
this.carInfo = await GetCarInfo()
CenterUDPBusinessInstance.init();
CenterUDPBusinessInstance.onMsg((data: centerCallBackMsgType) => {
if (data.id == 32) {
AppStorage.setOrCreate('signNum', data.body[1])
}
},)
// TODO
// CenterUDPBusinessInstance.onMsg((data: CenterCallBackMsgType) => {
// if (data.id == 32) {
// AppStorage.setOrCreate('signNum', data.body[1])
// }
// },)
this.carInfo = AppStorage.get<CarInfoType>('carInfo')!
this.deviceId = this.carInfo.carNo || ""
await SetCurrentTime()
@ -205,6 +209,7 @@ struct Index {
HeaderComponent({
shortLogo: false
})
CardComponent({
isSingle: this.singlePlay,
singleClick: () => {

View File

@ -164,3 +164,5 @@ export function CreateAlbum(fileHelper: FileHelper) {
fileHelper.createAlbum('pz');
fileHelper.createAlbum(date);
}

View File

@ -1,6 +1,6 @@
import { GPSData, SignalData } from '../mock';
import { SignalDataType } from '../model';
import signDisplayCom from './compontents/SignDisplayCom';
import SignalDisplayComponent from './compontents/SignalDisplay';
@Entry
@Component
@ -14,12 +14,12 @@ struct Index {
@State @Watch('outClick') outFlag: boolean = false;
@State url: string = ''
// @State gpsList: Array<any> = []
build() {
Column() {
signDisplayCom({
showBack: true
})
// signDisplayCom({
// showBack: true
// })
SignalDisplayComponent()
}
.width('100%')
.height('100%')

View File

@ -96,7 +96,7 @@ struct Index {
this.fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param))
AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", param)
const host = `http://${param.centerIp}:${param.centerPort}`
console.log("中心host",host)
console.log("中心host", host)
AppStorage.setOrCreate<string>("host", host)
ethernet.setIfaceConfig("eth0", {
mode: ethernet.IPSetMode.STATIC,

View File

@ -21,7 +21,7 @@ import { CryptoJS } from '@ohos/crypto-js';
import {
BeginExamRequest,
CarInfoType,
centerCallBackMsgType,
CenterCallBackMsgType,
DrvexamType,
ExaminationStuAbsentParams,
ExaminerLoginInfo,
@ -1312,7 +1312,7 @@ struct UserInfo {
.backgroundImageSize({ width: '100%', height: '100%' })
}
private onCenterMsg = (val: centerCallBackMsgType) => {
private onCenterMsg = (val: CenterCallBackMsgType) => {
if (val.id == 32) {
AppStorage.setOrCreate('signNum', val.body[1])
if (val.body[0] == 7) {

View File

@ -1,8 +1,9 @@
import router from '@ohos.router';
import RealTime from '../compontents/judge/RealTime';
import { GPSData, SignalData } from '../../mock';
import { SignalDataType } from '../../model';
import { SignalDataType, WorkerBackMessage } from '../../model';
import { ObtainUdpBusinessInstance } from '../../utils/business/ObtainUdpBusiness';
import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignal';
@Component
export default struct SignDisplayCom {
@ -331,12 +332,14 @@ export default struct SignDisplayCom {
if (this.showBack) {
this.ratio = 1.4
ObtainUdpBusinessInstance.onMsg((msg) => {
if (msg) {
this.getSignal(msg)
DifferentialAndSignal.onMsg((data: string) => {
const result: WorkerBackMessage = JSON.parse(data)
if (result.type === "centerUdpData") {
this.getSignal(result.data as string)
}
})
} else {
clearInterval(this.signalTimer)
this.signalTimer = setInterval(() => {
@ -362,7 +365,7 @@ export default struct SignDisplayCom {
clearInterval(this.signalTimer)
this.signalTimer = setInterval(() => {
//TODO 临时方案
const msgStr = AppStorage.get<string>('msgStr')||""
const msgStr = AppStorage.get<string>('msgStr') || ""
getSignal(msgStr)
}, 200)
}

View 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)
}
}

View File

@ -10,7 +10,7 @@ export default class TcpClient {
private oppositeIp: string = ''
private oppositeIpPort: string = ''
private tcpSendNum: number = 0
private tcp: socket.TCPSocket = null
private tcp: socket.TCPSocket = socket.constructTCPSocketInstance()
private events: Array<Function> = []
constructor() {
@ -20,59 +20,102 @@ export default class TcpClient {
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.oppositeIp = tcpOppositeIp
this.localIpPort = tcpLocalIpPort
this.oppositeIpPort = tcpOppositePort
console.log(TCPTag, 'new Tcp', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
this.tcp = socket.constructTCPSocketInstance();
this.bindTcp()
await this.bindTcp()
await this.connectTcp()
}
bindTcp(): Promise<void> {
return this.tcp.bind({
address: this.localIp, port: parseInt(this.localIpPort), family: 1
}).then(() => {
return this.tcp.connect({
address: {
address: this.oppositeIp, port: parseInt(this.oppositeIpPort)
},
timeout: 6000
// 绑定tcp
bindTcp(): Promise<Boolean> {
return new Promise((resolve, reject) => {
this.tcp.bind({
address: this.localIp,
port: Number(this.localIpPort),
family: 1
}).then(() => {
console.log(TCPTag, 'bindTcp success:', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
resolve(true)
}).catch((err: BusinessError) => {
console.log(TCPTag, 'bindTcp error:', JSON.stringify(err), this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
reject(err)
})
}).then(() => {
try {
this.tcp.on("message", value => {
let data = new DataView(value.message)
this.events.forEach(cb => {
cb(value.message.slice(5, data.byteLength))
})
})
return Promise.resolve()
} catch (e) {
return Promise.reject(e)
}
})
}
// 连接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 => {
let data = new DataView(value.message)
this.events.forEach(cb => {
cb(value.message.slice(5, data.byteLength))
})
})
}
// 重新绑定tcp
async reBind() {
await this.close()
this.tcp = socket.constructTCPSocketInstance();
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> {
return this.tcp?.close()
}
// 监听tcp消息
onMsg(callback: Function) {
this.events.push(callback)
}
// 接收tcp消息
sendMsg(data: string): Promise<void> {
return this.tcp?.send({
data
}).catch(async (err: BusinessError) => {
console.log(TCPTag, 'sendMsg error:', JSON.stringify(err))
this.tcpSendNum++
if (this.tcpSendNum > 10) {
this.tcpSendNum = 0
@ -82,6 +125,7 @@ export default class TcpClient {
})
}
// 取消监听tcp消息
offMsg(callback: Function) {
this.events = this.events.filter(cb => cb !== callback)
}

View File

@ -1,10 +1,6 @@
import socket from '@ohos.net.socket'
import promptAction from '@ohos.promptAction'
import { CarInfoType, EnvironmentConfigurationType } from '../model'
import { UDPTag } from '../config'
import { BusinessError } from '@ohos.base'
import { FillZero, StringToBytes, StringToASCII } from './Common'
import { CenterUDPBusinessInstance } from './business/CenterUdpBusiness'
import { FillZero, StringToASCII } from './Common'
interface MsgExt {
id: number,
@ -33,33 +29,18 @@ type DealMethod<T extends Object> = (value: ArrayBuffer) => T
export default class UdpClient {
protected udp: socket.UDPSocket | null = null
private localIp: string = ''
private localIpPort: string = ''
private oppositeIp: string = ''
private oppositeIpPort: string = ''
protected udp: socket.UDPSocket | null = null
private messageEvents: Array<Function> = []
private errorEvents: Array<Function> = []
private dealMethod?: DealMethod<object>
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)
})
})
}
// 绑定udp连接
bindUdp(): Promise<void> | undefined {
console.log(UDPTag, "绑定udp",this.localIp,this.localIpPort)
console.log(UDPTag, "绑定udp", this.localIp, this.localIpPort)
return this.udp?.bind({
address: this.localIp, port: parseInt(this.localIpPort), family: 1
}).then(res => {
@ -67,6 +48,7 @@ export default class UdpClient {
})
}
// 重新绑定udp连接
async reBind() {
await this.close()
this.udp = socket.constructUDPSocketInstance();
@ -74,6 +56,7 @@ export default class UdpClient {
await this.bindUdp()
}
// 关闭udp连接
close(): Promise<void> | undefined {
this.messageEvents = []
this.errorEvents = []
@ -83,10 +66,12 @@ export default class UdpClient {
return this.udp?.close()
}
// 设置处理消息的函数
setDealMethod<T extends Object>(fun: DealMethod<T>) {
this.dealMethod = fun
}
// 发送消息
sendMsg(data: ArrayBuffer | string): Promise<void> | undefined {
return this.udp?.send({
data,
@ -98,6 +83,7 @@ export default class UdpClient {
})
}
// 组装消息
setWholeMsg(params: MsgExt): ArrayBuffer {
let head = generateHead(params);
let headJudge = exclusive(head);
@ -108,11 +94,13 @@ export default class UdpClient {
return new Uint8Array(arr).buffer
}
// 发送消息
sendMsgExt(param: MsgExt) {
const msgData = this.setWholeMsg(param)
this.sendMsg(msgData)
}
// 创建udp实例
async create(udpLocalIp: string, udpLocalIpPort: string, udpOppositeIp: string, udpOppositeIpPort: string) {
console.log(UDPTag, "udp 初始化参数", udpLocalIp, udpLocalIpPort, udpOppositeIp, udpOppositeIpPort)
await this.close()
@ -129,19 +117,38 @@ export default class UdpClient {
}
}
// 绑定消息事件
onMsg(callback: Function) {
if (this.messageEvents.findIndex(cb => cb === callback)) {
if (this.messageEvents.findIndex(cb => cb === callback) !== -1) {
return
}
this.messageEvents.push(callback)
}
// 绑定错误事件
onError(callback: Function) {
this.errorEvents.push(callback)
}
// 取消绑定事件
offMsg(callback: Function) {
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)
})
})
}
}

View File

@ -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 { NumberToByteArray } from '../Common';
import UdpClient from '../UdpUtils';
@ -13,6 +19,10 @@ class CenterUDPBusiness {
private timer: number = -1
private headLength: number = 9
private sendId: number = 0
private carInfo: CarInfoType = {}
private signNum: number = -1
private statue: string = ""
private lsh: string = ""
constructor() {
if (CenterUDPBusiness.instance) {
@ -21,7 +31,71 @@ class CenterUDPBusiness {
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 dataView = new DataView(msg)
for (let i = 0; i < dataView?.byteLength; ++i) {
@ -82,65 +156,6 @@ class CenterUDPBusiness {
}
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();

View 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();

View File

@ -1,20 +1,31 @@
//差分信号
import { TCPTag } from '../../config';
import { EnvironmentConfigurationType } from '../../model';
import TcpClient from '../TcpUtils';
class differentialSignal {
private differentialSignalTcp: TcpClient;
private differentialSignalTcp: TcpClient = new TcpClient()
private timer: number = -1
constructor() {
}
init() {
init(config: EnvironmentConfigurationType) {
this.differentialSignalTcp = new TcpClient();
let config: EnvironmentConfigurationType =
AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")
this.differentialSignalTcp.init(config.tcplocalIp, config.tcplocalIpPort, config.tcpOppositeIp,
config.tcpOppositePort);
// let config: EnvironmentConfigurationType =
// AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration") || {
// tcplocalIp: "",
// 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) {
this.differentialSignalTcp.onMsg((data: ArrayBuffer) => {
console.log(TCPTag, "获取", data);
callback(data);
});
}

View File

@ -13,7 +13,7 @@ class ObtainUdpBusiness {
this.modelNo = GlobalConfig.modelNo || ""
}
init() {
init(config: EnvironmentConfigurationType) {
switch (this.modelNo) {
case "0":
this.initSecondaryBoard()
@ -25,7 +25,7 @@ class ObtainUdpBusiness {
this.initSecondGeneration()
break
case "3":
this.initThirdGeneration()
this.initThirdGeneration(config)
break
default:
this.initFirstGeneration()
@ -68,7 +68,8 @@ class ObtainUdpBusiness {
}
}
sendData(data: string) {
// 发送数据
sendData(data: string | ArrayBuffer) {
switch (this.modelNo) {
case "0":
this.sendSecondaryBoardMsg(data)
@ -98,11 +99,12 @@ class ObtainUdpBusiness {
private initSecondGeneration() {
}
// 三代机udp初始化
private initThirdGeneration() {
private initThirdGeneration(config: EnvironmentConfigurationType) {
try {
let config: EnvironmentConfigurationType =
AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
// let config: EnvironmentConfigurationType =
// AppStorage.get<EnvironmentConfigurationType>("EnvironmentConfiguration")!
console.log("获取udp设置", JSON.stringify(config))
this.thirdGenerationMachineUdp = new UdpClient()
this.thirdGenerationMachineUdp.create(config.udplocalIp!, config.udplocalIpPort!, config.udpOppositeIp!,
@ -153,19 +155,19 @@ class ObtainUdpBusiness {
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)
}
}

View 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}`)
}