diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 86a7137..79a1d10 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -1834,6 +1834,9 @@ namespace JoyD.Windows.CS.Toprie if (data == null || data.Length == 0) return; + // 记录数据接收时间 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [图像接收] 开始处理接收到的数据,大小: {data.Length}字节"); + // 更新最后接收数据时间戳 _lastDataReceivedTime = DateTime.Now; @@ -1889,20 +1892,26 @@ namespace JoyD.Windows.CS.Toprie if (imageData[endPos + 1] == 0xD9) { // 创建并触发事件 - Image jpegImage = Image.FromStream(ms); - OnImageReceived(new ImageReceivedEventArgs(imageData, _currentImageMode)); - return; + Image jpegImage = Image.FromStream(ms); + // 记录图像接收时间 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [图像接收] 成功接收到JPEG图像,大小: {imageData.Length}字节"); + OnImageReceived(new ImageReceivedEventArgs(imageData, _currentImageMode)); + return; } } } // 对于其他格式或无法确认完整度的情况,直接尝试创建 Image generalImage = Image.FromStream(ms); + // 记录图像接收时间 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [图像接收] 成功接收到图像,大小: {imageData.Length}字节"); OnImageReceived(new ImageReceivedEventArgs(imageData, _currentImageMode)); } } catch (Exception ex) { + // 记录异常日志 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [图像接收] 处理图像数据异常: {ex.Message}"); Console.WriteLine("处理图像数据异常: " + ex.Message); // 尝试查找有效的图像起始位置 int validStartPos = FindImageStartPosition(imageData); @@ -1918,6 +1927,8 @@ namespace JoyD.Windows.CS.Toprie using (MemoryStream ms = new MemoryStream(validImageData)) { Image validImage = Image.FromStream(ms); + // 记录图像接收时间 + Log($"[{DateTime.Now:HH:mm:ss.fff}] [图像接收] 成功接收到有效图像(二次尝试),大小: {validImageData.Length}字节"); OnImageReceived(new ImageReceivedEventArgs(validImageData, _currentImageMode)); } } @@ -3818,23 +3829,20 @@ namespace JoyD.Windows.CS.Toprie return; } - // 检查是否最近收到过数据 - bool recentlyReceivedData = false; - if (_lastDataReceivedTime != DateTime.MinValue) + // 检查是否在最近收到过数据 + bool recentlyReceivedData = _lastDataReceivedTime != DateTime.MinValue && + (DateTime.Now - _lastDataReceivedTime).TotalMilliseconds < DataReceivedTimeout; + + if (recentlyReceivedData) { TimeSpan timeSinceLastData = DateTime.Now - _lastDataReceivedTime; - recentlyReceivedData = timeSinceLastData.TotalMilliseconds < DataReceivedTimeout; - - if (recentlyReceivedData) + Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 最近收到数据({timeSinceLastData.TotalMilliseconds:F0}ms前),不进行心跳检测"); + // 更新连接状态为正常 + if (_connectionStatus != ConnectionStatus.Connected) { - Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 最近{timeSinceLastData.TotalMilliseconds:F0}ms内收到过数据,跳过心跳检测"); - // 更新连接状态为正常 - if (_connectionStatus != ConnectionStatus.Connected) - { - UpdateConnectionStatus(ConnectionStatus.Connected, "最近收到数据,连接正常"); - } - return; + UpdateConnectionStatus(ConnectionStatus.Connected, "最近收到数据,连接正常"); } + return; } Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] HeartbeatCallback() - 长时间未收到数据,执行心跳检测"); diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/UdpCommunicationManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/UdpCommunicationManager.cs index 3b8957f..6f5bf00 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/UdpCommunicationManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/UdpCommunicationManager.cs @@ -275,6 +275,52 @@ namespace JoyD.Windows.CS.Toprie InvalidResponse } + /// + /// 使用独立UDP客户端发送请求并接收响应(即用即销毁模式) + /// + /// 目标IP地址 + /// 要发送的数据 + /// 目标端口 + /// 超时时间(毫秒) + /// 响应数据,如果超时或出错则返回null + private byte[] SendRequestWithDisposableUdp(string targetIp, byte[] data, int port, int timeout) + { + using (UdpClient udpClient = new UdpClient()) + { + try + { + // 设置超时时间 + udpClient.Client.ReceiveTimeout = timeout; + + // 发送数据 + IPEndPoint targetEndPoint = new IPEndPoint(IPAddress.Parse(targetIp), port); + udpClient.Send(data, data.Length, targetEndPoint); + + // 接收响应 + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + byte[] responseData = udpClient.Receive(ref remoteEndPoint); + return responseData; + } + catch (SocketException ex) + { + if (ex.SocketErrorCode == SocketError.TimedOut) + { + Console.WriteLine($"UDP请求执行超时({timeout}ms)"); + } + else + { + Console.WriteLine($"UDP通信错误: {ex.Message}"); + } + return null; + } + catch (Exception ex) + { + Console.WriteLine($"发送UDP请求时发生错误: {ex.Message}"); + return null; + } + } + } + /// /// 同步发送UDP请求 /// @@ -289,28 +335,21 @@ namespace JoyD.Windows.CS.Toprie response = null; try { - var task = SendRequestAsync(targetIp, data, port, timeout); - bool completed = task.Wait(timeout); - if (completed) + // 使用新的即用即销毁UDP方法 + response = SendRequestWithDisposableUdp(targetIp, data, port, timeout); + + if (response != null) { - response = task.Result; - if (response != null) - { - return RequestResult.Success; - } - return RequestResult.NetworkError; + return RequestResult.Success; } - Console.WriteLine($"UDP请求执行超时({timeout}ms)"); - return RequestResult.Timeout; - } - catch (TimeoutException) - { - Console.WriteLine($"UDP请求执行超时异常"); - return RequestResult.Timeout; + + // 如果响应为null,可能是超时或网络错误 + // 在SendRequestWithDisposableUdp方法中已经记录了具体错误 + return RequestResult.NetworkError; } catch (Exception ex) { - Console.WriteLine($"发送UDP请求时发生错误: {ex.Message}"); + Console.WriteLine($"处理UDP请求结果时发生错误: {ex.Message}"); return RequestResult.ProcessingError; } } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs index a24a3f2..b89d72d 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/V8.cs @@ -30,9 +30,9 @@ namespace JoyD.Windows.CS.Toprie private enum CMD_TYPE { SHUTTER_CORRECTION = 0, - SET_AUTO_SHUTTER = 1, - // 根据设备实际通信协议,设置色彩模式的命令类型 - SET_COLOR_PLATE = 17, // 修正为17,以匹配设备实际接受的命令格式 + // 根据设备实际通信协议调整枚举值,避免冲突 + SET_COLOR_PLATE = 2, // 修正为2,与设备实际接受的命令格式匹配 + SET_AUTO_SHUTTER = 1, // 保持为1,不要与其他命令冲突 SET_MIRROR_VIDEO = 3, SET_VIDEO_MODE = 4, SET_AREA_POS = 5, @@ -47,7 +47,7 @@ namespace JoyD.Windows.CS.Toprie SET_EMAIL_SERVER = 14, SET_TFTP_SERVER = 15, SET_NETWORK_ETH = 16, - GET_PARAMETER = 17, + GET_PARAMETER = 20, // 修改为20,与a8_sdk保持一致 SET_FUSION_DISTANCE = 18, SET_ENVIR_PARAM = 19, SET_ALARM_PARAM = 20, @@ -144,25 +144,7 @@ namespace JoyD.Windows.CS.Toprie Disconnect(); } - // 连接设备 - private bool Connect() - { - try - { - // 注意:设备使用UDP协议通信,不需要建立TCP连接 - // 直接设置连接状态为true,表示准备好进行UDP通信 - // 这里仍然保持isConnected标志,以兼容现有代码逻辑 - isConnected = true; - Console.WriteLine($"UDP通信准备就绪,目标设备 {deviceIp}:18890"); - return true; - } - catch (Exception ex) - { - Console.WriteLine($"初始化UDP通信失败: {ex.Message}"); - isConnected = false; - return false; - } - } + // 断开连接(UDP模式下) private void Disconnect() @@ -224,7 +206,7 @@ namespace JoyD.Windows.CS.Toprie { // 使用UDP通信管理器发送请求,获取详细的请求结果 var result = UdpCommunicationManager.Instance.SendRequest(deviceIp, - Encoding.ASCII.GetBytes(cmd), out byte[] responseBytes, 18890, 200); + Encoding.ASCII.GetBytes(cmd), out byte[] responseBytes, 18890, 500); if (result == UdpCommunicationManager.RequestResult.Success && responseBytes != null) { @@ -270,7 +252,7 @@ namespace JoyD.Windows.CS.Toprie private int ParseResponseValue(string response) { if (string.IsNullOrEmpty(response) || !response.StartsWith("+RET:")) - return 0; + return -1; // 返回-1表示解析失败 try { @@ -283,7 +265,7 @@ namespace JoyD.Windows.CS.Toprie { Console.WriteLine($"解析响应失败: {ex.Message}"); } - return 0; + return -1; // 返回-1表示解析失败 } // SDK核心功能实现 - 不使用DllImport @@ -533,7 +515,7 @@ namespace JoyD.Windows.CS.Toprie { retryCount++; // 使用SDK格式获取色板: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$"; Log($"[色彩模式读取] 开始获取色彩模式值{(retryCount > 1 ? " (重试 " + retryCount + "/" + maxRetries + ")" : "")},发送命令: {command}"); @@ -544,7 +526,7 @@ namespace JoyD.Windows.CS.Toprie { int parsedValue = ParseResponseValue(response); - if (response != null && parsedValue != -1) // 确保响应有效且解析成功 + if (response != null && parsedValue != -1) // 确保响应有效且解析成功(现在parsedValue为-1表示解析失败) { Log($"[色彩模式读取] 解析成功,当前值: {parsedValue},上一次值: {_lastKnownColorPlate}"); _lastKnownColorPlate = parsedValue; @@ -558,7 +540,8 @@ namespace JoyD.Windows.CS.Toprie } else { - Log($"[色彩模式读取] 解析失败或响应无效,返回上次已知值: {_lastKnownColorPlate}"); + Log($"[色彩模式读取] 解析失败或响应无效,返回-1表示获取失败"); + resultValue = -1; // 失败时返回-1而不是上次已知值 } } catch (Exception ex) @@ -570,7 +553,8 @@ namespace JoyD.Windows.CS.Toprie } else { - Log($"[色彩模式读取] 解析异常: {ex.Message},返回上次已知值: {_lastKnownColorPlate}"); + Log($"[色彩模式读取] 解析异常: {ex.Message},返回-1表示获取失败"); + resultValue = -1; // 失败时返回-1而不是上次已知值 } } } @@ -581,18 +565,26 @@ namespace JoyD.Windows.CS.Toprie } else { - Log($"[色彩模式读取] 命令发送失败或超时,返回上次已知值: {_lastKnownColorPlate}"); + Log($"[色彩模式读取] 命令发送失败或超时,返回-1表示获取失败"); + resultValue = -1; // 失败时返回-1而不是上次已知值 } } - Log($"成功读取当前色彩模式值: {resultValue}"); // 添加一致的成功日志 + // 根据是否成功获取来记录不同的日志 + if (resultValue != -1) + { + Log($"成功读取当前色彩模式值: {resultValue}"); + } + else + { + Log($"获取色彩模式值失败"); + } return resultValue; } catch (Exception ex) - { - Log($"[色彩模式读取异常] {ex.Message},返回上次已知值: {_lastKnownColorPlate}"); - return _lastKnownColorPlate; - } + { Log($"[色彩模式读取异常] {ex.Message},返回-1表示获取失败"); + return -1; // 异常时返回-1而不是上次已知值 + } } } @@ -607,18 +599,25 @@ namespace JoyD.Windows.CS.Toprie { try { + // 首先尝试获取当前值 int currentValue = GetColor_plateWithoutLock(); - Log($"[色彩模式设置] 开始设置色彩模式值为: {value},当前值: {currentValue}"); + Log($"[色彩模式设置] 开始设置色彩模式值为: {value},尝试获取当前值: {currentValue}"); - // 如果值相同,不需要设置 - if (currentValue == value) + // 只有在成功获取到当前值(currentValue != -1)且与目标值相同时才跳过设置 + // 如果获取失败(currentValue == -1),仍然执行设置操作,避免因获取失败而跳过设置 + if (currentValue != -1 && currentValue == value) { Log($"[色彩模式设置] 当前色彩模式已为目标值,无需设置"); return true; } + // 如果获取失败,记录日志说明将继续执行设置 + else if (currentValue == -1) + { + Log($"[色彩模式设置] 获取当前值失败,将执行设置操作"); + } - // 使用SDK格式设置色板: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_COLOR_PLATE},{value}$"; + // 使用SDK格式设置色板: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_COLOR_PLATE},{value}$"; Log($"[色彩模式设置] 发送命令: {command}"); @@ -688,40 +687,28 @@ namespace JoyD.Windows.CS.Toprie { try { - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$"; + // 使用SDK格式获取色彩模式: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.COLOR_PLATE}$"; if (SendCommand(command, out string response)) { - return ParseResponseValue(response); + int result = ParseResponseValue(response); + // 如果解析结果不是特殊值-1,表示解析成功 + if (result != -1) + { + return result; + } } } catch (Exception ex) { Log($"[GetColor_plateWithoutLock异常] {ex.Message}"); } - return _lastKnownColorPlate; + // 返回特殊值-1表示获取失败,而不是返回_lastKnownColorPlate + // 这样SetColorPlate方法可以明确判断是否获取到了真实值 + return -1; } - /// - /// 安全地重启图像接收,避免重复停止和启动 - /// - private void SafeRestartImageReceiving() - { - try - { - // 注意:V8类不直接管理图像接收和连接检查 - // 这个方法被Color_plate属性调用,主要是为了在设置色彩模式后提供稳定的过渡时间 - Log("执行色彩模式变更后的稳定处理"); - - // 添加短暂延迟以确保设备有时间处理色彩模式变更 - System.Threading.Thread.Sleep(300); - - Log("色彩模式变更后的稳定处理完成"); - } - catch (Exception ex) - { - Log($"色彩模式变更后稳定处理过程中发生异常: {ex.Message}"); - } - } + public int Mirror_mode { @@ -729,8 +716,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式获取镜像模式: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.MIRROR_MODE}$"; + // 使用SDK格式获取镜像模式: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.MIRROR_MODE}$"; if (SendCommand(command, out string response)) { @@ -748,8 +735,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式设置镜像模式: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_MIRROR_VIDEO},{value}$"; + // 使用SDK格式设置镜像模式: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_MIRROR_VIDEO},{value}$"; if (SendCommand(command, out string response)) { @@ -773,8 +760,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式获取视频模式: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.VIDEO_MODE}$"; + // 使用SDK格式获取视频模式: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.VIDEO_MODE}$"; if (SendCommand(command, out string response)) { @@ -792,8 +779,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式设置视频模式: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_VIDEO_MODE},{value}$"; + // 使用SDK格式设置视频模式: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_VIDEO_MODE},{value}$"; if (SendCommand(command, out string response)) { @@ -915,8 +902,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式设置线位置: ip:param_mode,enable,sta_x,sta_y,end_x,end_y$ - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_LINE_POS},{value.enable},{value.sta_x},{value.sta_y},{value.end_x},{value.end_y}$"; + // 使用SDK格式设置线位置: +CMD:param_mode,enable,sta_x,sta_y,end_x,end_y$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_LINE_POS},{value.enable},{value.sta_x},{value.sta_y},{value.end_x},{value.end_y}$"; SendCommand(command, out _); } @@ -929,8 +916,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式获取线位置: ip:param_mode,0$ - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_LINE_POS},0$"; + // 使用SDK格式获取线位置: +CMD:param_mode,0$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_LINE_POS},0$"; if (SendCommand(command, out string response)) { @@ -1195,7 +1182,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SDK格式获取Y缩放: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.ISP_Y_SCALE}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.ISP_Y_SCALE}$"; if (SendCommand(command, out string response)) { @@ -1217,8 +1204,8 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式设置LED状态: ip:param_mode,param_value$ - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_LED},{value}$"; + // 使用SDK格式设置LED状态: +CMD:param_mode,param_value$ + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_LED},{value}$"; if (SendCommand(command, out string response)) { @@ -1360,9 +1347,9 @@ namespace JoyD.Windows.CS.Toprie { try { - // 使用SDK格式设置网络参数: ip:param_mode,param_value$ + // 使用SDK格式设置网络参数: +CMD:param_mode,param_value$ string paramsStr = $"{value.enable}"; - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_NETWORK_ETH},{paramsStr}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_NETWORK_ETH},{paramsStr}$"; if (SendCommand(command, out string response)) { @@ -1383,7 +1370,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_PARAMETER命令获取网络参数 - string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER}:{(int)PARAM_TYPE.NETWORK_ETH_CONFIG}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.NETWORK_ETH_CONFIG}$"; if (SendCommand(command, out string response)) { @@ -1431,7 +1418,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_PARAMETER命令获取融合距离 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.FUSION_DISTANCE}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.FUSION_DISTANCE}$"; if (SendCommand(command, out string response)) { @@ -1454,7 +1441,7 @@ namespace JoyD.Windows.CS.Toprie // 使用SET_ENVIR_PARAM命令设置环境参数 - SDK格式 // 构建参数字符串,包含所有环境参数 string paramsStr = $"{data.method},{data.num},{data.emissivity},{data.airTemp},{data.targetTemp},{data.atmosTrans},{data.distance},{data.infraredTemp},{data.infraredRadia}"; - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_ENVIR_PARAM},{paramsStr}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_ENVIR_PARAM},{paramsStr}$"; if (SendCommand(command, out string response)) { @@ -1476,7 +1463,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_AREA_ENVIR_PARAM命令获取区域环境参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_AREA_ENVIR_PARAM},{index}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_AREA_ENVIR_PARAM},{index}$"; if (SendCommand(command, out string response)) { @@ -1500,7 +1487,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_SPOT_ENVIR_PARAM命令获取点环境参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_SPOT_ENVIR_PARAM},{index}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_SPOT_ENVIR_PARAM},{index}$"; if (SendCommand(command, out string response)) { @@ -1524,7 +1511,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_LINE_ENVIR_PARAM命令获取线环境参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_LINE_ENVIR_PARAM}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_LINE_ENVIR_PARAM}$"; if (SendCommand(command, out string response)) { @@ -1548,7 +1535,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_GLOBAL_ENVIR_PARAM命令获取全局环境参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_GLOBAL_ENVIR_PARAM}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_GLOBAL_ENVIR_PARAM}$"; if (SendCommand(command, out string response)) { @@ -1572,7 +1559,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_ALARM_PARAM命令设置报警参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_ALARM_PARAM},{data.method},{data.num},{data.active},{data.condition},{data.captrue},{data.disableCalib},{data.email},{data.digital},{data.ftp},{data.threshold},{data.hysteresis},{data.thresholeTime}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_ALARM_PARAM},{data.method},{data.num},{data.active},{data.condition},{data.captrue},{data.disableCalib},{data.email},{data.digital},{data.ftp},{data.threshold},{data.hysteresis},{data.thresholeTime}$"; if (SendCommand(command, out string response)) { @@ -1870,64 +1857,32 @@ namespace JoyD.Windows.CS.Toprie } } - // 使用UDP协议发送心跳命令,与SDK保持一致 + // 使用SendCommand方法发送心跳命令,与SDK保持一致 public int Heartbeat() { - // 使用UDP通信管理器进行心跳检测,防止异步数据相互影响 try { // 根据SDK实际实现,心跳命令格式是 +CMD:24$ string command = $"{CMD_HEAD}:{(int)CMD_TYPE.HEARTBEAT}$"; - byte[] commandBytes = Encoding.ASCII.GetBytes(command); // SDK实现中会尝试3次心跳,这里也采用相同的策略 for (int retry = 0; retry < 3; retry++) { Console.WriteLine($"心跳检测...(尝试 {retry + 1}/3)"); - Console.WriteLine($"心跳命令: {command}"); - Console.WriteLine($"目标IP: {deviceIp}:18890"); - try + if (SendCommand(command, out string response)) { - // 使用UDP通信管理器发送心跳请求,设置500ms超时 - byte[] responseBytes = UdpCommunicationManager.Instance.SendRequest(deviceIp, - commandBytes, 18890, 500); - - Console.WriteLine("UDP心跳命令已发送,等待响应..."); - - if (responseBytes != null) + // SDK要求响应中必须包含 ":ok" 字符串才算成功 + if (!string.IsNullOrEmpty(response) && response.Contains(":ok")) { - string response = Encoding.ASCII.GetString(responseBytes); - - Console.WriteLine($"收到UDP心跳响应: {response}"); - // 不使用LINQ的Select方法,避免缺少System.Linq命名空间的问题 - string[] asciiValues = new string[response.Length]; - for (int i = 0; i < response.Length; i++) - { - asciiValues[i] = ((int)response[i]).ToString(); - } - Console.WriteLine($"响应长度: {response.Length} 字节,响应ASCII码: {string.Join(",", asciiValues)}"); - - // SDK要求响应中必须包含 ":ok" 字符串才算成功 - if (!string.IsNullOrEmpty(response) && response.Contains(":ok")) - { - Console.WriteLine("心跳成功: 响应包含':ok'"); - return 1; // 返回1表示成功,与DeviceManager中的heartbeatResult > 0判断一致 - } - else - { - Console.WriteLine($"心跳响应不包含':ok',验证失败。收到的响应: '{response}'"); - } + Console.WriteLine("心跳成功: 响应包含':ok'"); + return 1; // 返回1表示成功,与DeviceManager中的heartbeatResult > 0判断一致 } else { - Console.WriteLine("UDP心跳未收到响应或超时"); + Console.WriteLine($"心跳响应不包含':ok',验证失败。收到的响应: '{response}'"); } } - catch (Exception ex) - { - Console.WriteLine($"UDP心跳异常: {ex.Message}"); - } // 如果不是最后一次尝试,短暂延迟后重试 if (retry < 2) @@ -1943,7 +1898,6 @@ namespace JoyD.Windows.CS.Toprie catch (Exception ex) { Console.WriteLine($"心跳检测异常: {ex.Message}"); - Console.WriteLine($"异常堆栈: {ex.StackTrace}"); return -1; } } @@ -1953,7 +1907,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_UART命令设置串口参数 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_UART},{nSpeed},{nBits},{(int)nEvent},{nStop}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_UART},{nSpeed},{nBits},{(int)nEvent},{nStop}$"; if (SendCommand(command, out string response)) { @@ -2014,7 +1968,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_DEVICE_NAME命令设置设备名称 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_DEVICE_NAME},{data}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_DEVICE_NAME},{data}$"; if (SendCommand(command, out string response)) { @@ -2036,7 +1990,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_PARAMETER命令获取设备名称 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.DEVICE_NA}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_PARAMETER},{(int)PARAM_TYPE.DEVICE_NA}$"; if (SendCommand(command, out string response)) { @@ -2105,7 +2059,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_TEMP_FRAME命令设置温度帧 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_TEMP_FRAME},{(byte)value}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_TEMP_FRAME},{(byte)value}$"; SendCommand(command, out _); } @@ -2119,7 +2073,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用GET_TEMP_FRAME命令获取温度帧 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.GET_TEMP_FRAME}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.GET_TEMP_FRAME}$"; if (SendCommand(command, out string response)) { @@ -2241,7 +2195,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_TIME命令设置系统时间 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_TIME},{data.year},{data.month},{data.day},{data.hour},{data.minute},{data.second}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_TIME},{data.year},{data.month},{data.day},{data.hour},{data.minute},{data.second}$"; if (SendCommand(command, out string response)) { @@ -2264,7 +2218,7 @@ namespace JoyD.Windows.CS.Toprie try { // 使用SET_IMAGE_MODE命令设置图像模式 - SDK格式 - string command = $"{deviceIp}:{(int)CMD_TYPE.SET_IMAGE_MODE},{mode}$"; + string command = $"{CMD_HEAD}:{(int)CMD_TYPE.SET_IMAGE_MODE},{mode}$"; if (SendCommand(command, out string response)) {