光电挠度仪上位机
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1037 lines
30 KiB

import { ipcMain } from 'electron'
import dgram from 'dgram'
import net from 'net'
import { IPC_EVENT } from '../renderer/src/common/ipcEvents.js'
import fs from 'fs'
const TIMEOUT = 10000 // 10秒超时
const END_SEQUENCE = '\n\n' // 消息结束标志
// 全局保存所有TCP连接和相关信息
const tcpClients = new Map()
// 保存待处理的请求,用于关联响应
const pendingRequests = new Map()
export function registerIpRouter() {
ipcMain.on(IPC_EVENT.DEVICE_SEARCH, searchDevice)
ipcMain.on(IPC_EVENT.DEVICE_CONNECT, connectDevice)
ipcMain.on(IPC_EVENT.DEVICE_DISCONNECT, disconnectDevice)
ipcMain.handle(IPC_EVENT.SENSORS_GET, sensorLoad) // 获取传感器
ipcMain.handle(IPC_EVENT.SENSORS_SET, sensorSet) // 传感器设置处理
ipcMain.handle(IPC_EVENT.IMAGE_SEND_TIME_GET, imageSendTimeGet)
ipcMain.handle(IPC_EVENT.IMAGE_SEND_TIME_SET, imageSendTimeSet)
// 其他基本参数GET处理
ipcMain.handle(IPC_EVENT.ZERO_COUNT_GET, zeroCountGet)
ipcMain.handle(IPC_EVENT.RESULT_COUNT_GET, resultCountGet)
ipcMain.handle(IPC_EVENT.DATA_FPS_GET, dataFpsGet)
ipcMain.handle(IPC_EVENT.VIDEO_FPS_GET, videoFpsGet)
ipcMain.handle(IPC_EVENT.THRESHOLD_GET, thresholdGet)
ipcMain.handle(IPC_EVENT.INVALID_DATA_COUNT_GET, invalidDataCountGet)
// 其他基本参数SET处理
ipcMain.handle(IPC_EVENT.ZERO_COUNT_SET, zeroCountSet)
ipcMain.handle(IPC_EVENT.RESULT_COUNT_SET, resultCountSet)
ipcMain.handle(IPC_EVENT.DATA_FPS_SET, dataFpsSet)
ipcMain.handle(IPC_EVENT.VIDEO_FPS_SET, videoFpsSet)
ipcMain.handle(IPC_EVENT.THRESHOLD_SET, thresholdSet)
ipcMain.handle(IPC_EVENT.INVALID_DATA_COUNT_SET, invalidDataCountSet)
}
const searchDevice = (event) => {
const message = Buffer.from(JSON.stringify({ command: 'name', type: 'get' }))
const PORT = 2230
const BROADCAST_ADDR = '255.255.255.255'
const udpClient = dgram.createSocket('udp4')
let timer = null
const resultMap = new Map()
udpClient.bind(() => {
udpClient.setBroadcast(true)
udpClient.send(message, 0, message.length, PORT, BROADCAST_ADDR, (err) => {
if (err) {
console.error('UDP send failed', err)
udpClient.close()
} else {
console.log('UDP send successful')
}
})
})
udpClient.on('message', (msg, rinfo) => {
try {
resultMap.set(rinfo.address, {
from: rinfo.address,
data: msg.toString()
})
} catch (e) {
console.error('parse UDP message failed:', e)
}
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
udpClient.close()
console.log('UDP socket closed after timeout')
event.reply && event.reply(IPC_EVENT.DEVICE_SEARCH_REPLY, Array.from(resultMap.values()))
}, 1000)
})
udpClient.on('error', (err) => {
console.error('UDP error:', err)
udpClient.close()
event.reply && event.reply(IPC_EVENT.DEVICE_SEARCH_REPLY, Array.from(resultMap.values()))
})
}
const connectDevice = (event, { ip, port }) => {
if (!ip || !port) {
event.reply(IPC_EVENT.DEVICE_CONNECT_REPLY, { success: false, error: '参数缺失' })
return
}
if (tcpClients.has(ip)) {
event.reply(IPC_EVENT.DEVICE_CONNECT_REPLY, { success: false, error: '已连接' })
return
}
const client = new net.Socket()
// 保存连接信息,包括event sender用于后续通信
const connectionInfo = {
client,
eventSender: event.sender,
ip,
port
}
client.connect(Number(port), ip, () => {
event.reply(IPC_EVENT.DEVICE_CONNECT_REPLY, { success: true, ip })
tcpClients.set(ip, connectionInfo)
})
let buffer = ''
client.on('data', (data) => {
buffer += data.toString()
let index
while ((index = buffer.indexOf('\n')) !== -1) {
const line = buffer.slice(0, index)
buffer = buffer.slice(index + 1)
if (!line.trim()) continue
let msg
try {
msg = JSON.parse(line)
console.log('Received command:', `${msg.command}:${msg.type}`)
} catch (e) {
console.error('TCP data parse error:', e)
fs.appendFileSync('error_log.txt', line + '\n')
continue
}
if (!msg || !msg.command) {
console.log('invalid msg format:', msg)
continue
}
// 处理TCP响应
handleTcpResponse(ip, msg)
}
})
client.on('error', (err) => {
event.reply(IPC_EVENT.DEVICE_CONNECT_REPLY, { success: false, error: err.message })
client.destroy()
tcpClients.delete(ip)
// 清理该IP的所有待处理请求
clearPendingRequestsByIp(ip)
})
client.on('close', () => {
tcpClients.delete(ip)
clearPendingRequestsByIp(ip)
})
}
const disconnectDevice = (event, { ip }) => {
const connectionInfo = tcpClients.get(ip)
if (connectionInfo) {
connectionInfo.client.destroy()
tcpClients.delete(ip)
clearPendingRequestsByIp(ip)
event.reply(IPC_EVENT.DEVICE_DISCONNECT_REPLY, { success: true })
} else {
event.reply(IPC_EVENT.DEVICE_DISCONNECT_REPLY, { success: false, error: '未连接' })
}
}
// 处理TCP响应
const handleTcpResponse = async (ip, msg) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) return
switch (`${msg.command}:${msg.type}`) {
case IPC_EVENT.RESULT_REPLY:
connectionInfo.eventSender.send(IPC_EVENT.RESULT_REPLY, { ip, ...msg })
break
case IPC_EVENT.IMAGE_REPLY:
connectionInfo.eventSender.send(IPC_EVENT.IMAGE_REPLY, { ip, ...msg })
break
case IPC_EVENT.SENSORS_GET:
{
const sensorRequest = pendingRequests.get(`${ip}${IPC_EVENT.SENSORS_GET}`)
if (sensorRequest) {
// 响应传感器加载请求
await delay()
sensorRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.SENSORS_GET}`)
}
}
break
case IPC_EVENT.SENSORS_SET:
{
const sensorSetRequest = pendingRequests.get(`${ip}${IPC_EVENT.SENSORS_SET}`)
if (sensorSetRequest) {
// 响应传感器设置请求
await delay()
sensorSetRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.SENSORS_SET}`)
}
}
break
case IPC_EVENT.IMAGE_SEND_TIME_GET:
{
const imageTimeRequest = pendingRequests.get(`${ip}${IPC_EVENT.IMAGE_SEND_TIME_GET}`)
if (imageTimeRequest) {
// 响应图像发送间隔获取请求
await delay()
console.log(msg)
imageTimeRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.IMAGE_SEND_TIME_GET}`)
}
}
break
case IPC_EVENT.IMAGE_SEND_TIME_SET:
{
const imageTimeRequest = pendingRequests.get(`${ip}${IPC_EVENT.IMAGE_SEND_TIME_SET}`)
if (imageTimeRequest) {
// 响应图像发送间隔设置请求
await delay()
console.log(msg)
imageTimeRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.IMAGE_SEND_TIME_SET}`)
}
}
break
// 其他基本参数GET响应处理
case IPC_EVENT.ZERO_COUNT_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.ZERO_COUNT_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.ZERO_COUNT_GET}`)
}
}
break
case IPC_EVENT.RESULT_COUNT_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.RESULT_COUNT_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.RESULT_COUNT_GET}`)
}
}
break
case IPC_EVENT.DATA_FPS_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.DATA_FPS_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.DATA_FPS_GET}`)
}
}
break
case IPC_EVENT.VIDEO_FPS_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.VIDEO_FPS_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.VIDEO_FPS_GET}`)
}
}
break
case IPC_EVENT.THRESHOLD_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.THRESHOLD_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.THRESHOLD_GET}`)
}
}
break
case IPC_EVENT.INVALID_DATA_COUNT_GET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.INVALID_DATA_COUNT_GET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.INVALID_DATA_COUNT_GET}`)
}
}
break
// 其他基本参数SET响应处理
case IPC_EVENT.ZERO_COUNT_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.ZERO_COUNT_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.ZERO_COUNT_SET}`)
}
}
break
case IPC_EVENT.RESULT_COUNT_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.RESULT_COUNT_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.RESULT_COUNT_SET}`)
}
}
break
case IPC_EVENT.DATA_FPS_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.DATA_FPS_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.DATA_FPS_SET}`)
}
}
break
case IPC_EVENT.VIDEO_FPS_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.VIDEO_FPS_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.VIDEO_FPS_SET}`)
}
}
break
case IPC_EVENT.THRESHOLD_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.THRESHOLD_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.THRESHOLD_SET}`)
}
}
break
case IPC_EVENT.INVALID_DATA_COUNT_SET:
{
const paramRequest = pendingRequests.get(`${ip}${IPC_EVENT.INVALID_DATA_COUNT_SET}`)
if (paramRequest) {
await delay()
console.log(msg)
paramRequest.resolve({ success: true, data: msg })
pendingRequests.delete(`${ip}${IPC_EVENT.INVALID_DATA_COUNT_SET}`)
}
}
break
case IPC_EVENT.HEARTBEAT_REPLY:
// 心跳处理
break
default:
console.warn('unknown command:', `${msg.command}:${msg.type}`)
}
}
// 传感器加载
const sensorLoad = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
// 生成请求ID并保存待处理请求
const requestKey = `${ip}${IPC_EVENT.SENSORS_GET}`
// 设置超时
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT) // 10秒超时
// 保存请求信息
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
// 发送传感器加载命令
const command = { command: 'sensors', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// 传感器设置
const sensorSet = async (event, { ip, sensors }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
// 生成请求ID并保存待处理请求
const requestKey = `${ip}${IPC_EVENT.SENSORS_SET}`
// 设置超时
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT) // 10秒超时
// 保存请求信息
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
// 发送传感器设置命令
const command = { command: 'sensors', type: 'set', values: sensors }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// 图像发送间隔获取
const imageSendTimeGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
// 生成请求ID并保存待处理请求
const requestKey = `${ip}${IPC_EVENT.IMAGE_SEND_TIME_GET}`
// 设置超时
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT) // 10秒超时
// 保存请求信息
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
// 发送图像发送间隔获取命令
const command = { command: 'imageSendTime', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// 图像发送间隔设置
const imageSendTimeSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
// 生成请求ID并保存待处理请求
const requestKey = `${ip}${IPC_EVENT.IMAGE_SEND_TIME_SET}`
// 设置超时
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT) // 10秒超时
// 保存请求信息
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
// 发送图像发送间隔设置命令
const command = { command: 'imageSendTime', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// zeroCount获取
const zeroCountGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.ZERO_COUNT_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'zeroCount', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// zeroCount设置
const zeroCountSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.ZERO_COUNT_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'zeroCount', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// resultCount获取
const resultCountGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.RESULT_COUNT_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'resultCount', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// resultCount设置
const resultCountSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.RESULT_COUNT_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'resultCount', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// dataFps获取
const dataFpsGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.DATA_FPS_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'dataFps', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// dataFps设置
const dataFpsSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.DATA_FPS_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'dataFps', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
console.log('Sending command:', message)
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// videoFps获取
const videoFpsGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.VIDEO_FPS_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'videoFps', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// videoFps设置
const videoFpsSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.VIDEO_FPS_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'videoFps', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// threshold获取
const thresholdGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.THRESHOLD_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'threshold', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// threshold设置
const thresholdSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.THRESHOLD_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'threshold', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// invalidDataCount获取
const invalidDataCountGet = async (event, { ip }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.INVALID_DATA_COUNT_GET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'invalidDataCount', type: 'get', values: '' }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// invalidDataCount设置
const invalidDataCountSet = async (event, { ip, value }) => {
return new Promise((resolve, reject) => {
const connectionInfo = tcpClients.get(ip)
if (!connectionInfo) {
resolve({ success: false, error: '设备未连接' })
return
}
const requestKey = `${ip}${IPC_EVENT.INVALID_DATA_COUNT_SET}`
const timeout = setTimeout(() => {
pendingRequests.delete(requestKey)
resolve({ success: false, error: '请求超时' })
}, TIMEOUT)
pendingRequests.set(requestKey, {
resolve: (result) => {
clearTimeout(timeout)
resolve(result)
},
reject: (error) => {
clearTimeout(timeout)
reject(error)
},
timestamp: Date.now()
})
const command = { command: 'invalidDataCount', type: 'set', values: value }
const message = JSON.stringify(command) + END_SEQUENCE
connectionInfo.client.write(message, (err) => {
if (err) {
pendingRequests.delete(requestKey)
clearTimeout(timeout)
resolve({ success: false, error: err.message })
}
})
})
}
// 清理指定IP的所有待处理请求
const clearPendingRequestsByIp = (ip) => {
const keysToDelete = []
for (const [key, request] of pendingRequests) {
if (key.startsWith(`${ip}_`)) {
request.resolve({ success: false, error: '连接已断开' })
keysToDelete.push(key)
}
}
keysToDelete.forEach((key) => pendingRequests.delete(key))
}
//模拟延迟函数
const delay = () => {
return new Promise((resolve) => setTimeout(resolve, 1000))
}