Flutter中int转原始字节经TCP/IP对接PLC、RTC通信问题咨询
Flutter/Dart TCP发送原始字节对接PLC设备实现方案
核心问题说明
- 需求场景:Windows端Flutter应用开发中,需要将int值转换为单字节/多字节原始格式,通过TCP/IP发送至PLC设备,设备要求按绝对字节索引读取数据,不接受编码后的字符串格式内容。
- 常见错误实现及问题:
- 直接拼接字符串调用
socket.write()发送
对应代码如下:
- 直接拼接字符串调用
final server = await ServerSocket.bind(ip,port); try{ server.listen((Socket socket) { int a = 10; // line feed int b = 36; // $ int c = 122; // z const sec = Duration(seconds:1); Timer.periodic(sec,(Timer t) { socket.write('data : $a,$b,$c'); }); } on SocketException catch(ex) { print(ex.message); }
该实现的问题:发送内容会被按字符串逐字符转ASCII传输,比如int值10会被拆分为字符'1'、'0'对应的两个ASCII字节,接收端得到的序列为|d|a|t|a| |:|1|0|,|3|6|,|1|2|2|,无法得到预期的|d|a|t|a| |:|0x0A|,|$|,|z|原始字节序列。
2. 通过String.fromCharCode()转换int值后调用write()发送
对应代码如下:
int a = 0; for(;;){ socket.write(String.fromCharCode(a)); a++; if(a>=256)a=0; }
该实现的问题:write()方法默认对字符串做UTF-8编码,数值大于127的单字节会被编码为双字节,出现C2、C3前缀的异常值,完全不符合PLC单字节读取要求。同时字符串传输搭配分隔符的方案会让工业协议场景下的数据传输量膨胀至少4倍,效率极低。
- 旧冗余方案:之前为绕开字节操作问题,额外搭建Java服务端处理底层位/字节逻辑与PLC通信,Flutter端通过JSON和Java服务交互,架构冗余,维护成本高。
已验证可行方案
Dart的Socket类提供add()方法,直接传入存储字节值的List<int>即可发送未经任何编码的原始字节,完全满足PLC按索引读取原始字节的要求,无需额外中转服务。
注意:单字节传输时,列表内int值需保持在0-255区间;如需传输16位、32位等多字节整数,只需按照协议要求的大小端顺序将数值拆分为单字节,按序加入列表后调用
add()发送即可。
已实测通过的代码示例:
try { client.listen((Socket socket) { debugPrint('New TCP client ${socket.address.address}:${socket.port} connected.'); List<int> bytes = List.empty(growable: true); for (var i = 0; i < 255; i++) { bytes.add(i); } Timer.periodic(const Duration(seconds: 1), (Timer t) { for (var i = 0; i < 255; i++) { socket.add([bytes[i]]); } }); }); } on SocketException catch (ex) { debugPrint(ex.message); Timer.periodic(const Duration(seconds: 1), (Timer t) { startServer(); }); }
内容的提问来源于stack exchange,提问作者DenysM
相关产品推荐
相关产品推荐

