Dart 实现TCP连接智能设备发送请求后无响应如何解决?
问题排查与解决方法
核心问题根因
原有JavaScript代码中使用Buffer.from(data, 'hex')将十六进制格式的字符串转换为原始字节流发送,而Dart的Socket.write()方法默认会将输入的字符串按UTF-8编码转换为字节,二者发送的字节内容完全不同,智能设备无法识别非法请求,因此不会返回响应。
修复步骤
1. 修正数据编码逻辑
新增十六进制字符串转字节数组的工具方法,发送时直接传递原始字节而非调用write方法:
import 'dart:io'; import 'dart:typed_data'; // 十六进制字符串转Uint8List Uint8List hexStrToBytes(String hexStr) { hexStr = hexStr.replaceAll(RegExp(r'\s'), ''); // 可选:去除hex字符串中的空格、换行等空白符 List<int> byteList = []; for (int i = 0; i < hexStr.length; i += 2) { byteList.add(int.parse(hexStr.substring(i, i + 2), radix: 16)); } return Uint8List.fromList(byteList); }
修改后的完整通信代码:
// 建立连接 Socket socket = await Socket.connect(ip, port); // 转hex为原始字节后发送 socket.add(hexStrToBytes(data)); // 强制刷新缓冲区,确保数据立即发送 await socket.flush(); // 读取首次响应 Uint8List dataFromDevice = await socket.first; print(dataFromDevice); // 通信完成后关闭连接 await socket.close();
2. 其他可能问题排查
- 确认传参顺序:Dart
Socket.connect方法第一个参数为IP地址,第二个为端口,与JSnet.connect的参数顺序相反,需要确认传参没有颠倒。 - 校验字节内容:可以分别打印JS端
Buffer.from(data, 'hex')和Dart端hexStrToBytes(data)的输出,确认二者字节序列完全一致。 - 增加超时机制:避免设备无响应时代码永久阻塞,可对读取响应操作增加超时限制:
Uint8List dataFromDevice = await socket.first .timeout(const Duration(seconds: 5), onTimeout: () { throw Exception("设备响应超时"); });
内容的提问来源于stack exchange,提问作者Guy Luz
相关产品推荐
相关产品推荐

