迈瑞BS240生化分析仪TCP连接频繁断开重连问题排查求助
我正在开发针对迈瑞BS240生化分析仪的TCP通信程序,目前遇到的问题是该分析仪每隔30秒就会断开并重新连接。以下是我的代码及日志信息,请问我遗漏了什么?
private void startTcpListner() { try { var port = settings.LisPort; IPAddress localAddr = IPAddress.Parse(settings.LisIpAddress); // TcpListener server = new TcpListener(port); server = new TcpListener(localAddr, port); // Start listening for client requests. server.Start(); // Buffer for reading data var bytes = new byte[256]; String data = null; LogManager.GetCurrentClassLogger().Info("Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also use server.AcceptSocket() here. var client = server.AcceptTcpClient(); LogManager.GetCurrentClassLogger().Info("Connected !"); data = null; // Get a stream object for reading and writing stream = client.GetStream(); // Enter the listening loop. while (true) { while (!stream.DataAvailable) ; int i; // Loop to receive all the data sent by the client. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { // Translate data bytes to a ASCII string. var line = Encoding.UTF8.GetString(bytes, 0, i); LogManager.GetCurrentClassLogger().Info("Received: {0}", line); data += line; if (line.Length > 3 && line[line.Length - 2] == Hl7Helper.FileSeparator && line[line.Length - 1] == Hl7Helper.CarriageReturn) { handleMessage(data); data = null; } } } } catch (SocketException e) { LogManager.GetCurrentClassLogger().Error("SocketException: {0}", e); } catch (Exception e) { LogManager.GetCurrentClassLogger().Error(e); } finally { // Stop listening for new clients. server.Stop(); } }
日志内容:
Waiting for a connection... Connected !
缺少心跳/应答机制:迈瑞BS240这类医疗设备通常会定期发送心跳包(比如30秒间隔),如果服务端未及时回复对应应答,设备会判定连接失效并触发重连。你的代码仅处理数据接收,未实现心跳应答逻辑。需查阅设备通信协议文档,确认心跳包格式,收到心跳后立即回复指定应答,或主动发送维持连接的数据包。
阻塞逻辑导致连接状态无法检测:代码中
while (!stream.DataAvailable) ;是阻塞式等待数据,线程会一直卡在该位置,无法实时检测连接是否存活。当设备断开时,stream.Read返回0,程序会陷入外层while(true)死循环,无法重新监听新连接。建议改用异步读取(如stream.BeginRead),或在循环中加入client.Connected状态检测,连接断开后及时清理资源并重新调用AcceptTcpClient()等待重连。未处理连接断开后的重监听逻辑:设备断开后,
stream.Read返回0,当前代码不会主动关闭旧连接、释放资源,也不会重新等待新连接。需在stream.Read返回0时,关闭client和stream,然后重新执行server.AcceptTcpClient(),让程序回到等待连接的状态。编码格式可能不匹配:代码用
Encoding.UTF8解析数据,但医疗设备多采用ASCII或ISO-8859-1编码,编码不匹配会导致数据解析异常,设备得不到正确应答从而断开连接。可尝试替换为Encoding.ASCII,或查阅协议文档确认指定编码格式。
内容的提问来源于stack exchange,提问作者SidAhmed

