fix: 济南后置机方案

This commit is contained in:
wangzhongjie 2025-02-28 10:46:28 +08:00
parent ca44a19722
commit c2a1a9d760
15 changed files with 310 additions and 193 deletions

View File

@ -2,6 +2,11 @@
"apiType": 'stageMode',
"buildOption": {
"externalNativeOptions": {
"abiFilters": [
"arm64-v8a",
"armeabi-v7a",
"x86_64"
],
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "",
"cppFlags": "",

View File

@ -1,4 +1,3 @@
import { NewTcpClient, XmlToJson } from '../common/utils/new/tcp'
import request from "../common/utils/request"
import tempRequest from '../common/utils/tempRequest'

View File

@ -1,7 +1,8 @@
import { getSyncData } from '../common/service/initable';
import request from '../common/utils/request';
import FileUtil from '../common/utils/File';
import { NewTcpClient, XmlToJson } from '../common/utils/new/tcp';
import { HandleCenterCode, NewTcpClient, XmlToJson } from '../common/utils/new/tcp';
import { PrintStr } from '../common/utils/tools';
let baseHost = globalThis.host;
@ -45,37 +46,64 @@ export default async function writeObjectOutNew(data, filePath): Promise<WR> {
console.info('surenjun', '调用新监管')
let temp
try {
if (jkid === "17C51") {
temp = await request({
host: globalThis.JGHOST,
method: 'post',
//是否是新中心
isNewCenter: true,
xml: true,
url: '/dems_ws/services/TmriOutAccess?wsdl',
data: `<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Body>
<writeObjectOut xmlns="http://service.es.doron">
<wglb>${wglb}</wglb>
<jkxlh>${jkxlh}</jkxlh>
<glbm>${glbm}</glbm>
<jgbh>${jgbh}</jgbh>
<sjbs>${sjbs}</sjbs>
<data>${JSON.stringify(params.data)}</data>
<file>${JSON.stringify(params.file)}</file>
</writeObjectOut>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>`,
})
} else {
// if (jkid === "17C51") {
// temp = await request({
// host: globalThis.JGHOST,
// method: 'post',
// //是否是新中心
// isNewCenter: true,
// xml: true,
// url: '/dems_ws/services/TmriOutAccess?wsdl',
// data: `<?xml version="1.0"?>
// <SOAP-ENV:Envelope
// xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
// xmlns:xsd="http://www.w3.org/2001/XMLSchema"
// xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
// >
// <SOAP-ENV:Body>
// <writeObjectOut xmlns="http://service.es.doron">
// <wglb>${wglb}</wglb>
// <jkxlh>${jkxlh}</jkxlh>
// <glbm>${glbm}</glbm>
// <jgbh>${jgbh}</jgbh>
// <sjbs>${sjbs}</sjbs>
// <data>${JSON.stringify(params.data)}</data>
// <file>${JSON.stringify(params.file)}</file>
// </writeObjectOut>
// </SOAP-ENV:Body>
// </SOAP-ENV:Envelope>`,
// })
// } else {
temp = await getMessageByEnd(params, basic)
console.log("zj result", JSON.stringify(temp))
// }
} catch (e) {
console.log("zj 新监管错误")
temp = e
}
console.log("zj temp message: ", JSON.stringify(temp))
if (filePath) {
await fileUtil.editFile(`${filePath}/wuxi_exam_data.txt`, JSON.stringify(temp) + `\n`);
}
return temp
}
function getMessageByEnd(params, basic) {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
PrintStr(params, 100)
// 如果超时,抛出错误
console.log("zj tcp timeout")
reject(new Error("Timeout: No data received within 15 seconds"));
}, 15000);
const {wglb,jkxlh,glbm,jgbh,sjbs} = basic;
let baseUrl = globalThis.JGHOST ? globalThis.JGHOST : globalThis.host
let key = new Date().getTime()
// 走后置机
params.file.param = [{
field: '', data: ""
}]
let data = {
url: `${baseUrl}/dems_ws/services/TmriOutAccess?wsdl`,
serialNumber: key,
@ -103,36 +131,37 @@ export default async function writeObjectOutNew(data, filePath): Promise<WR> {
contentType: 'text/xml',
isHeartBeat: "0",
}
console.log("zj guocheng", JSON.stringify(data))
NewTcpClient.sendMsg(`^#${JSON.stringify(data)}#$`)
NewTcpClient.onMessage((value) => {
console.log("zj value", value)
// 使用正则表达式提取^#和#$之间的JSON数据
const jsonDataMatch = value.match(/\^#(.*?)#\$/);
if (jsonDataMatch && jsonDataMatch[1]) {
try {
const jsonData = JSON.parse(jsonDataMatch[1]);
if (Number(jsonData.serialNumber) === Number(key)) {
temp = XmlToJson(jsonData.data);
let cache = ""
NewTcpClient.onMessage(async (value) => {
console.log("zj onMessage", value)
// 先找到^#和#$开始结束符号
cache += value
let start = cache.indexOf("^#")
let end = cache.indexOf("#$")
if (start !== -1 && end !== -1) {
let message = cache.slice(start + 2, end)
cache = cache.slice(end + 2)
let tempIndex = message.indexOf("^#")
while (tempIndex > -1) {
message = message.slice(tempIndex + 2)
tempIndex = message.indexOf("^#")
}
let result: any = JSON.parse(message)
if (Number(result.serialNumber) === Number(key) && !result.url) {
let temp: any = XmlToJson(result.data)
if (temp.Envelope) {
console.log("zj accept", JSON.stringify(temp))
const msgXml = temp.Envelope.Body.writeObjectOutResponse.return;
const dd = HandleCenterCode(msgXml, true);
clearTimeout(timeoutId);
resolve(dd)
}
} catch (error) {
console.error("Failed to parse JSON data:", error);
}
} else {
console.log("No JSON data found between ^# and #$");
}
});
}
} catch (e) {
console.log("新监管错误")
temp = e
}
console.log("temp message: ", JSON.stringify(temp))
if (filePath) {
await fileUtil.editFile(`${filePath}/wuxi_exam_data.txt`, JSON.stringify(temp) + `\n`);
}
return temp
})
}
export async function getParams(jkid, drvexam) {

View File

@ -229,6 +229,7 @@ export async function takePhoto(param, context, dir, flag = 1, callback?) {
const date = time.split(' ')[0]
let dirName = dir ? dir : date
rtsp_server.getVideoSnapshot(context, video_uri, fileName, dirName, true, async (err, snapResult) => {
console.log("zj photo", snapResult.fileSize.toString())
if (snapResult.result && snapResult.errorCode == 0) {
resolve({
base64: snapResult.dataString,
@ -249,6 +250,7 @@ export async function takePhoto(param, context, dir, flag = 1, callback?) {
})
}
}
export async function deleteAllPicturesFn() {
fileHelper.deleteAllPictures();
deleteAllVideos(globalThis.context, photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.VIDEO)

View File

@ -1,5 +1,6 @@
import Want from '@ohos.app.ability.Want'
import promptAction from '@ohos.promptAction'
import fileAccess from '@ohos.file.fileAccess'
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'
import common from '@ohos.app.ability.common'
import fs from '@ohos.file.fs'
@ -103,7 +104,7 @@ export default class FileUtil {
};
private context: common.UIAbilityContext
private wantInfos: Want[]
private fileAccessHelper: any
private fileAccessHelper: fileAccess.FileAccessHelper
//后续文件路径待替换
private absolutePath = '/mnt/hmdfs/100/account/device_view/local/files/duolun'
private getFilePathList = async (filePath: string, isSdcard: boolean) => {
@ -127,10 +128,8 @@ export default class FileUtil {
}
// 检索文件列表
public getSdCardPathList = async () => {
//@ts-ignore
this.wantInfos = await fileAccess.getFileAccessAbilityInfo();
const {wantInfos,context} = this;
//@ts-ignore
const fileAccessHelper = fileAccess.createFileAccessHelper(this.context, this.wantInfos);
this.fileAccessHelper = fileAccessHelper;
@ -177,7 +176,6 @@ export default class FileUtil {
'ohos.permission.READ_MEDIA',
'ohos.permission.WRITE_MEDIA'
];
// @ts-ignore
this.wantInfos = await fileAccess.getFileAccessAbilityInfo();
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
atManager.requestPermissionsFromUser(context, permissions, async (code, result) => {

View File

@ -305,24 +305,24 @@ export default class UdpClientByCenter {
console.info('surenjun', 'getUDP关闭udp message监听事件 成功')
}
message_1Fn = (value) => {
message_1Fn = (strachArr) => {
let callback = this.onMessage_1Callback
// 收到的是ArrayBuffer 需要进行转换解析
this.plcUdpError = false
if (value) {
let dataView = new DataView(value.message)
let str = ""
for (let i = 0; i < dataView?.byteLength; ++i) {
let c = String.fromCharCode(dataView?.getUint8(i))
if (c !== "\n") {
str += c
}
}
let strachArr = str.split(',')
if (strachArr[0] != '#DN_GD') {
return
}
if (strachArr) {
// let dataView = new DataView(value.message)
// let str = ""
// for (let i = 0; i < dataView?.byteLength; ++i) {
// let c = String.fromCharCode(dataView?.getUint8(i))
// if (c !== "\n") {
// str += c
// }
// }
//
// let strachArr = str.split(',')
// if (strachArr[0] != '#DN_GD') {
// return
// }
strachArr[28] = globalThis.chuankoMsg || strachArr[28]

View File

@ -1,5 +1,7 @@
import socket from '@ohos.net.socket';
import convertxml from '@ohos.convertxml';
import util from '@ohos.util';
import Prompt from '@system.prompt';
class NewTcp {
private localIp: string = '192.168.7.170'
@ -7,6 +9,7 @@ class NewTcp {
private oppositeIp: string = '192.168.7.124'
private oppositeIpPort: string = '20022'
private tcp: socket.TCPSocket = null
private cbArr = []
constructor() {
this.init()
@ -24,6 +27,26 @@ class NewTcp {
timeout: 6000
}).then(res => {
console.log('tcp connect success')
this.tcp.on("message", (value) => {
if (value) {
let decoder = util.TextDecoder.create()
let message = decoder.decodeWithStream(new Uint8Array(value.message))
let strArr = message.split(',')
// 获取档位信息
strArr[28] = globalThis.chuankoMsg || '0'
globalThis.udpClient.getCurrentMessage = strArr.toString()
this.cbArr.forEach(cb => {
cb && cb(strArr.toString())
})
// 超时15秒打印信息
} else {
this.cbArr.forEach(cb => {
cb && cb("")
})
}
})
}).catch(err => {
console.log('tcp connect error', err)
})
@ -34,42 +57,19 @@ class NewTcp {
return new Promise((resolve, reject) => {
this.tcp.send({ data: data }, (err) => {
if (err) {
console.log("zj tcp end error", JSON.stringify(err))
console.log("zj tcp end error", data)
reject(err);
} else {
// console.log("zj tcp end success")
resolve();
}
});
});
}
public onMessage(callback) {
this.tcp.on("message", (value) => {
if (value) {
let dataView = new DataView(value.message)
let str = ""
for (let i = 0; i < dataView?.byteLength; ++i) {
let c = String.fromCharCode(dataView?.getUint8(i))
if (c !== "\n") {
str += c
}
}
let strachArr = str.split(',')
if (strachArr[0] != '#DN_GD') {
return
}
// console.log(`udp222 on message array buffer:${str}`);
strachArr[28] = globalThis.chuankoMsg || '0'
const newArr = JSON.parse(JSON.stringify(strachArr))
callback && callback(newArr.toString())
} else {
callback && callback('')
}
})
this.cbArr.push(callback)
}
// 重连
@ -93,6 +93,42 @@ class NewTcp {
export const NewTcpClient = new NewTcp()
export const HandleCenterCode = (msgXml, isNewCenter) => {
//新监管
if (isNewCenter) {
const msg = JSON.parse(msgXml);
const result = msg?.data[0]?.result;
if (result) {
const {code,message,retval} = result
if (code != '1') {
const rMessage = decodeURIComponent(message as string)
Prompt.showToast({
message: rMessage,
duration: 3000
});
return { code, message }
} else {
return { code, keystr: retval }
}
}
}
//正则匹配code message字段
const [code, message, keystr] = [/<code>(.*)<\/code>/i, /<message>(.*)<\/message>/i, /<keystr>(.*)<\/keystr>/i].map(pattern => {
const patternArr = pattern.exec(msgXml);
return patternArr && patternArr[1]
});
if (code != '1') {
Prompt.showToast({
message: decodeURIComponent(message as string),
duration: 3000
});
return { code, message: decodeURIComponent(message) }
} else {
return { code, keystr, message }
}
}
export const XmlToJson = (result) => {
let xmlOptions = {

View File

@ -1,7 +1,7 @@
//@ts-ignore
import systemTime from '@ohos.systemDateTime';
import { expect } from '@ohos/hypium';
import FileUtil from './File';
export function isSevenDaysAgo(date, days = 2) {
const today = new Date(); // 当前日期
const target = new Date(date); // 需要判断的日期
@ -14,6 +14,7 @@ export function isSevenDaysAgo(date,days=2) {
console.log('diffDays', diffDays, days)
return diffDays >= (Number(days));
}
// export async function writeLog(path,param){
// return
// const fileUtil = new FileUtil(globalThis.context)
@ -146,7 +147,6 @@ export function formatTime(time:number):string {
}
// 根据指定个数分割数组
export function chunkArr(arr, size: number) {
//判断如果不是数组(就没有length)或者size没有传值size小于1就返回空数组
@ -227,8 +227,7 @@ export function string2Bytes(number, len){
export function Array2Byte(array) {
var buf = new ArrayBuffer(array.length);
var view = new Uint8Array(buf);
for (var i = 0; i != array.length; ++i)
{
for (var i = 0; i != array.length; ++i) {
view[i] = array[i] & 0xFF;
}
return view;
@ -252,4 +251,32 @@ export function debounce(fn, delay){
}
timer = setTimeout(fn, delay);
}
};
}
;
// 循环打印一个字符串
/**
*
* @param {string} value -
* @param {number} length -
*/
export function PrintStr(value, length) {
// 参数校验
if (typeof value !== 'string' || typeof length !== 'number' || length <= 0) {
console.error('参数无效value 必须是字符串length 必须是正整数');
return;
}
// 如果字符串长度小于等于分段长度,直接打印整个字符串
if (value.length <= length) {
console.log(value);
return;
}
// 分段打印
for (let i = 0; i < value.length; i += length) {
// 截取当前段
const segment = value.slice(i, i + length);
console.log("zj PrintStr", segment);
}
}

View File

@ -2,3 +2,10 @@ export type SignalDataType = {
key: string;
value: string;
};
export interface Response {
serialNumber: string
data: string
isForwordHttp: string
}

View File

@ -1,5 +1,8 @@
import TopLogo from './compontents/TopLogo';
import prompt from '@ohos.prompt';
import TopLogo from './compontents/TopLogo'
import ethernet from '@ohos.net.ethernet';
import prompt from '@ohos.prompt'
import { upDateTableByArray } from '../common/service/initable'
import { getSyncData } from '../common/service/initable'
import FileUtil from '../common/utils/File';
import common from '@ohos.app.ability.common';
import { GlobalConfig } from '../config';
@ -100,7 +103,6 @@ struct Index {
}
fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param), '')
// upDateTableByArray('IpConfigTable',[])
// @ts-ignore
ethernet.setIfaceConfig("eth0", {
mode: 0,
ipAddr: this.inputTextList1[9],
@ -170,7 +172,7 @@ struct Index {
this.inputTextList1[3] = result.centerPort
}
//@ts-ignore
ethernet.getIfaceConfig("eth0", (error, value) => {
if (error) {
// that.errorMsg='error'

View File

@ -24,6 +24,7 @@ import errorMsgDialog from './compontents/errorMsgDialog';
import imageBtn from './compontents/imageBtn';
import FileUtil from '../common/utils/File';
import DB, { ColumnType } from '../common/database/DbSql';
import { NewTcpClient } from '../common/utils/new/tcp';
@Entry
@Component
@ -167,8 +168,6 @@ struct UserInfo {
)
private filePhoto: FilePhoto
private avPlayer
private AccountTable = new AccountTable(() => {
}, USER);
private context = getContext(this) as common.UIAbilityContext;
private labelBlocks = [
{ label: '考生姓名', key: 'xm' },
@ -919,7 +918,12 @@ struct UserInfo {
resolve(true)
return
}
let plcValue = globalThis.udpClient.getCurrentMessage();
// let plcValue = ""
let plcValue = globalThis.udpClient.getCurrentMessage;
// NewTcpClient.onMessage((value) => {
// console.log(value)
// plcValue = value
// })
const msgArr = plcValue.split(',') || ''
const mkg = msgArr[14];
const fdjzs = msgArr[25];

View File

@ -346,21 +346,25 @@ export default struct SignDisplayCom {
// getSignal(msg)
// }
// })
// NewTcpClient.onMessage((msg) => {
// console.log("zj msg", msg)
// getSignal(msg)
// })
}
// clearInterval(globalThis.signalTimer)
// globalThis.signalTimer = setInterval(() => {
// const msgStr = globalThis.msgStr
// if (msgStr) {
// getSignal(msgStr)
//
// }
// }, 200)
NewTcpClient.onMessage((msg) => {
console.log("zj msg", msg)
getSignal(msg)
})
} else {
clearInterval(globalThis.signalTimer)
globalThis.signalTimer = setInterval(() => {
const msgStr = globalThis.msgStr
if (msgStr) {
getSignal(msgStr)
}
}, 200)
}
}
onPageShow() {
console.info('SURENJUN', 123)

View File

@ -239,7 +239,9 @@ export default class Judge {
if (stachArr[0] != '#DN_GD' || isUdpEnd) {
return
}
const plcData = await getPlcData(msg);
console.log("zj getPlcData start")
const plcData = await this.getPlcData(msg);
console.log("zj getPlcData end")
// 4.过程数据
await fileLog.setExamJudgeData(plcData)
//检测到有无锡所设备接入,需要发送特定的数据,供检测
@ -257,6 +259,7 @@ export default class Judge {
if (!isExamEnd) {
await examJudgeRealExam(plcData)
}
console.log("zj plcData", plcData.toString())
const udpIndex = globalThis.udpIndex;
let [prevJd, preWd] = [0, 0]
if (udpIndex % 5 === 0 && !isUdpEnd) {
@ -1830,7 +1833,8 @@ export default class Judge {
// });
NewTcpClient.onMessage((msg) => {
console.info('socketTag[PLC.UdpClient]', '收到udp回调数据')
handleUdp(msg)
console.log("zj msg1", msg)
this.handleUdp(msg)
const udpIndex = globalThis.udpIndex;
if (udpIndex % 5 === 0) {
handDistance();