You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 其他可能问题排查

  • 确认传参顺序:DartSocket.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:09:01