refactor: 重构网络配置相关接口,优化文件处理逻辑
This commit is contained in:
parent
af338af32a
commit
94cf59b607
@ -1,196 +0,0 @@
|
||||
import socket from '@ohos.net.socket';
|
||||
import util from '@ohos.util';
|
||||
|
||||
|
||||
interface RequestKey {
|
||||
time: string
|
||||
}
|
||||
|
||||
interface RequestCallback {
|
||||
url: string
|
||||
type: number
|
||||
resolve: Function
|
||||
reject: Function
|
||||
timeout: number
|
||||
}
|
||||
|
||||
interface RequestParams {
|
||||
method: string
|
||||
data: object
|
||||
type: 0 | 1
|
||||
contentType: string
|
||||
timeout: number
|
||||
}
|
||||
|
||||
interface Response {
|
||||
serialNumber: string
|
||||
data: string
|
||||
isForwordHttp: string
|
||||
}
|
||||
|
||||
let tag = "tcp request"
|
||||
|
||||
class TcpUtils {
|
||||
private static instance: TcpUtils
|
||||
private socket: socket.TCPSocket = socket.constructTCPSocketInstance()
|
||||
private requestMap: Map<string, RequestCallback> = new Map<string, RequestCallback>()
|
||||
private tick: number
|
||||
private heartbeat: number
|
||||
private cache: string = ''
|
||||
private fileUtil = new FileUtil(AppStorage.get('context'))
|
||||
private path = ""
|
||||
|
||||
constructor() {
|
||||
if (!TcpUtils.instance) {
|
||||
TcpUtils.instance = this
|
||||
}
|
||||
return TcpUtils.instance
|
||||
}
|
||||
|
||||
async init() {
|
||||
this.path = await this.fileUtil.initFolder('/config/tcpRequest')
|
||||
this.socket.on("message", (res) => {
|
||||
let decoder = util.TextDecoder.create()
|
||||
let message = decoder.decodeWithStream(new Uint8Array(res.message))
|
||||
console.log(tag, "on message", message)
|
||||
this.cache += message
|
||||
let start = this.cache.indexOf("^#")
|
||||
let end = this.cache.indexOf("#$")
|
||||
try {
|
||||
if (start !== -1 && end !== -1) {
|
||||
let message = this.cache.slice(start + 2, end)
|
||||
this.cache = this.cache.slice(end + 2)
|
||||
let tempIndex = message.indexOf("^#")
|
||||
while (tempIndex > -1) {
|
||||
message = message.slice(tempIndex + 2)
|
||||
tempIndex = message.indexOf("^#")
|
||||
}
|
||||
let result: Response = JSON.parse(message)
|
||||
let key = result.serialNumber
|
||||
let data = result.data
|
||||
let isSuccess = result.isForwordHttp === "1"
|
||||
console.log(tag, "complete message")
|
||||
let item = this.requestMap.get(key)
|
||||
console.log(tag, "============", item?.url)
|
||||
if (this.requestMap.get(key)?.type === 0) {
|
||||
console.log(tag, "resolve message")
|
||||
if (isSuccess) {
|
||||
item?.resolve(JSON.parse(data))
|
||||
} else {
|
||||
item?.reject({
|
||||
code: -1,
|
||||
message: data || "request failed"
|
||||
})
|
||||
}
|
||||
} else {
|
||||
console.log(tag, "resolve message")
|
||||
if (isSuccess) {
|
||||
item?.resolve(data)
|
||||
} else {
|
||||
item?.reject({
|
||||
code: -1,
|
||||
message: data || "request failed"
|
||||
})
|
||||
}
|
||||
}
|
||||
this.requestMap.delete(key)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(tag, "解析相应失败", JSON.stringify(e))
|
||||
}
|
||||
})
|
||||
|
||||
this.loop()
|
||||
return this.socket.connect({
|
||||
address: { address: "172.37.55.191", port: 19998 }
|
||||
}).then(() => {
|
||||
this.heartbeat = setInterval(() => {
|
||||
this.send("heart", JSON.stringify({
|
||||
isHeartBeat: 1
|
||||
}), false)
|
||||
}, 1000 * 6)
|
||||
console.log(tag, "connect success")
|
||||
}).catch(err => {
|
||||
console.log(tag, JSON.stringify(err))
|
||||
})
|
||||
}
|
||||
|
||||
request(url: string, option: RequestParams, resolve, reject) {
|
||||
let key = new Date().getTime()
|
||||
this.requestMap.set(key + "", {
|
||||
url,
|
||||
resolve,
|
||||
reject,
|
||||
timeout: option.timeout,
|
||||
type: option.type,
|
||||
})
|
||||
|
||||
let message = {
|
||||
url,
|
||||
serialNumber: key,
|
||||
type: option.type,
|
||||
method: option.method,
|
||||
data: option.data,
|
||||
contentType: option.contentType,
|
||||
isHeartBeat: "0",
|
||||
}
|
||||
|
||||
this.send(key + "", JSON.stringify(message))
|
||||
}
|
||||
|
||||
destroy() {
|
||||
clearInterval(this.tick)
|
||||
clearInterval(this.heartbeat)
|
||||
}
|
||||
|
||||
private loop() {
|
||||
this.tick = setInterval(() => {
|
||||
let now = new Date().getTime()
|
||||
this.requestMap.forEach((value, key) => {
|
||||
if (now - Number(key) >= value.timeout) {
|
||||
console.log("tcp request timeout url: ", value.url)
|
||||
console.log("tcp request timeout key: ", key)
|
||||
value.reject({
|
||||
message: "tcp request timeout",
|
||||
code: 2300028
|
||||
})
|
||||
this.requestMap.delete(key)
|
||||
}
|
||||
})
|
||||
}, 100)
|
||||
}
|
||||
|
||||
private async send(key: string, message: string, log: boolean = true) {
|
||||
if (log) {
|
||||
console.log(tag, 'send', message)
|
||||
}
|
||||
this.fileUtil.addFile(this.path + 'temp.txt', `^#${message}#$`)
|
||||
this.socket.send({
|
||||
data: `^#${message}#$`
|
||||
}).then(() => {
|
||||
if (log) {
|
||||
console.log(tag, 'send success')
|
||||
}
|
||||
}).catch(async err => {
|
||||
if (key !== "heart") {
|
||||
console.log("tcp request send failed", this.requestMap.get(key).url)
|
||||
this.requestMap.get(key).reject({
|
||||
message: "tcp request send failed",
|
||||
code: 2300007
|
||||
})
|
||||
}
|
||||
await this.socket.close()
|
||||
this.socket = socket.constructTCPSocketInstance()
|
||||
await this.socket.connect({
|
||||
address: { address: "172.37.55.191", port: 19998 }
|
||||
}).then(res => {
|
||||
console.log("tcp request reconnect success", JSON.stringify(res))
|
||||
}).catch(err => {
|
||||
console.log("tcp request reconnect failed", JSON.stringify(err))
|
||||
})
|
||||
console.log(tag, JSON.stringify(err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const tcpUtil = new TcpUtils()
|
||||
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
const TEN = 10; // 这是数字10
|
||||
const SIXTY = 60; // 时间进制
|
||||
const THOUSAND = 1000; // 这是数字1000
|
||||
|
||||
export function tempNum(num: number): string {
|
||||
if (num < TEN) {
|
||||
return '0' + num;
|
||||
}
|
||||
return num.toString();
|
||||
}
|
||||
|
||||
export function getDurationString(duration: number): string {
|
||||
let hour = Math.floor(duration / (THOUSAND * SIXTY * SIXTY));
|
||||
let minute = Math.floor((duration - hour * (THOUSAND * SIXTY * SIXTY)) / (THOUSAND * SIXTY));
|
||||
let second = Math.floor(
|
||||
(duration - hour * (THOUSAND * SIXTY * SIXTY) - minute * (SIXTY * THOUSAND)) / THOUSAND
|
||||
);
|
||||
if (hour > 0) {
|
||||
return `${tempNum(hour)}:${tempNum(minute)}:${tempNum(second)}`;
|
||||
}
|
||||
return `${tempNum(minute)}:${tempNum(second)}`;
|
||||
}
|
||||
@ -1,16 +1,14 @@
|
||||
import UIAbility from '@ohos.app.ability.UIAbility';
|
||||
import hilog from '@ohos.hilog';
|
||||
import window from '@ohos.window';
|
||||
import relationalStore from '@ohos.data.relationalStore'
|
||||
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
|
||||
import { GlobalConfig } from '../config/global'
|
||||
import { tcpUtil } from '../common/utils/TcpRequest';
|
||||
import { GlobalConfig } from '../config/global';
|
||||
import { initTable } from '../common/service/initable';
|
||||
import { centerUDPClient, lightUDPClient, objUDPClient } from '../utils/UdpUtils';
|
||||
import Want from '@ohos.app.ability.Want';
|
||||
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
|
||||
import { BaseInfoType, CarInfoType, ExaminerInfoType } from '../model';
|
||||
import DB from '../utils/DbSql';
|
||||
import { tcpUtil } from '../utils/TcpRequest';
|
||||
|
||||
export default class EntryAbility extends UIAbility {
|
||||
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
|
||||
|
||||
@ -115,3 +115,21 @@ export interface CarInfoType {
|
||||
|
||||
// TODO
|
||||
export interface ExaminerInfoType {}
|
||||
|
||||
// 一些运行配置
|
||||
export interface EnvironmentConfigurationType {
|
||||
udplocalIp?: string,
|
||||
udplocalIpPort?: string,
|
||||
udpOppositeIp?: string,
|
||||
udpOppositeIpPort?: string,
|
||||
tcplocalIp?: string,
|
||||
tcplocalIpPort?: string,
|
||||
tcpOppositeIp?: string,
|
||||
tcpOppositePort?: string,
|
||||
netMask?: string,
|
||||
gateway?: string,
|
||||
dnsServers?: string,
|
||||
centerIp?: string,
|
||||
centerPort?: string,
|
||||
terType?: string
|
||||
}
|
||||
@ -1,15 +0,0 @@
|
||||
export interface NetworkConfigType {
|
||||
udplocalIp: string;
|
||||
udplocalIpPort: string;
|
||||
udpOppositeIp: string;
|
||||
udpOppositeIpPort: string;
|
||||
tcplocalIp: string;
|
||||
tcplocalIpPort: string;
|
||||
tcpOppositeIp: string;
|
||||
tcpOppositePort: string;
|
||||
netMask: string;
|
||||
gateway: string;
|
||||
dnsServers: string;
|
||||
centerIp: string;
|
||||
centerPort: string;
|
||||
}
|
||||
@ -3,9 +3,9 @@ import ethernet from '@ohos.net.ethernet';
|
||||
|
||||
import common from '@ohos.app.ability.common';
|
||||
import { GlobalConfig } from '../config';
|
||||
import { NetworkConfigType } from '../model/TerminalInfos';
|
||||
import Prompt from '@system.prompt';
|
||||
import FileUtils from '../utils/FileUtils';
|
||||
import { EnvironmentConfigurationType } from '../model/Common';
|
||||
|
||||
|
||||
@Entry
|
||||
@ -17,20 +17,20 @@ struct Index {
|
||||
// @State textList2: string[] = []
|
||||
@State ratio: number = 1700 / 960
|
||||
@State inputFontSize: number = 12 //12
|
||||
//
|
||||
// @State inputTextList1: string[] = ['192.168.7.170','8084','192.168.7.170','20122','255.255.255.0','192.168.7.1','','','114.114.114.114','112.80.35.83','11055' +
|
||||
// '',]
|
||||
// @State inputTextList2: string[] = ['192.168.7.124','20022']
|
||||
|
||||
// @State inputTextList1: string[] = ['172.37.55.191','18782','192.168.7.1','8082','255.255.255.0','192.168.7.170','114.114.114.114','192.168.7.124','20022','172.37.55.59','20122']
|
||||
@State inputTextList1: string[] =
|
||||
['172.37.55.191', '18782', '172.37.55.191', '8082', '255.255.255.0', '192.168.7.1', '114.114.114.114',
|
||||
'192.168.7.124', '20022', '192.168.7.170', '20122']
|
||||
// @State inputTextList2: string[] = []
|
||||
// 112.80.35.83 11052
|
||||
//
|
||||
// @State inputTextList1: string[] = ['192.168.7.170','8084','192.168.7.170','20122','255.255.255.0','192.168.7.1','','','114.114.114.114','112.80.35.83','11055' +
|
||||
// '',]
|
||||
// @State inputTextList2: string[] = ['192.168.7.124','20022']
|
||||
// @State inputTextList1: string[] = ['192.168.36.2','8084','192.168.36.200','20122','255.255.255.0','192.168.36.1','','','114.114.114.114','192.168.36.139','8000']
|
||||
@State @Watch('outClick') outFlag: boolean = false;
|
||||
// @State inputTextList2: string[] = []
|
||||
// 112.80.35.83 11052
|
||||
scroller: Scroller = new Scroller()
|
||||
private fileUtil: FileUtils
|
||||
// @State inputTextList2: string[] = ['192.168.36.139','20022']
|
||||
private context = getContext(this) as common.UIAbilityContext;
|
||||
|
||||
@ -85,9 +85,8 @@ struct Index {
|
||||
|
||||
Column() {
|
||||
Image($r('app.media.terminal_save')).width('20.5%').height('74%').onClick(async () => {
|
||||
const fileUtil = new FileUtils(this.context)
|
||||
const folderPath = await fileUtil.initFolder(`/config`);
|
||||
const param: NetworkConfigType = {
|
||||
const folderPath = await this.fileUtil.initFolder(`/config`);
|
||||
const param: EnvironmentConfigurationType = {
|
||||
udplocalIp: this.inputTextList1[9],
|
||||
udplocalIpPort: this.inputTextList1[10],
|
||||
udpOppositeIp: this.inputTextList1[7],
|
||||
@ -102,7 +101,8 @@ struct Index {
|
||||
centerIp: this.inputTextList1[2],
|
||||
centerPort: this.inputTextList1[3]
|
||||
}
|
||||
fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param), '')
|
||||
this.fileUtil.addFile(`${folderPath}/ipConfig.txt`, JSON.stringify(param))
|
||||
AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", param)
|
||||
// upDateTableByArray('IpConfigTable',[])
|
||||
ethernet.setIfaceConfig("eth0", {
|
||||
mode: 0,
|
||||
@ -149,12 +149,12 @@ struct Index {
|
||||
}
|
||||
|
||||
async aboutToAppear() {
|
||||
const fileUtil = new FileUtils(this.context)
|
||||
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||
this.fileUtil = new FileUtils(this.context)
|
||||
const data = await this.fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||
if (data === '' || data === undefined) {
|
||||
} else {
|
||||
// TODO
|
||||
const result: ESObject = JSON.parse(data)
|
||||
const result: EnvironmentConfigurationType = JSON.parse(data)
|
||||
AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", result)
|
||||
this.inputTextList1[9] = result.udplocalIp
|
||||
this.inputTextList1[10] = result.udplocalIpPort
|
||||
this.inputTextList1[7] = result.udpOppositeIp
|
||||
|
||||
@ -625,7 +625,7 @@ struct Index {
|
||||
this.oldParam = JSON.parse(JSON.stringify(this.param))
|
||||
this.videoArr = JSON.parse(JSON.stringify(this.videoArr))
|
||||
const folderPath = await this.fileUtil.initFolder(`/config`);
|
||||
this.fileUtil.addFile(`${folderPath}/config3.txt`, JSON.stringify(this.param), 'overWrite')
|
||||
this.fileUtil.addFile(`${folderPath}/config3.txt`, JSON.stringify(this.param))
|
||||
this.showFlag = false
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user