Node.js中如何存储十六进制命令并通过Socket发送给设备
解决Node.js通过Socket发送十六进制设备命令无响应的问题
我来帮你搞定这个设备通信的难题!你遇到的核心问题大概率是没有把十六进制命令正确转换成Node.js Socket能识别的二进制数据(Buffer)。直接发送字符串或者错误转换格式,设备肯定认不出。下面给你两种可靠的实现方式,以及常见错误的避坑点:
方法一:直接用Buffer.from转换十六进制字符串
这是最简洁的方式,利用Buffer.from()的hex编码参数,直接把你的十六进制命令字符串转换成对应的二进制Buffer:
const net = require('net'); // 关键:把十六进制字符串转为Buffer,指定编码为'hex' const deviceCommand = Buffer.from('01030064007A85F6', 'hex'); // 替换成你的设备实际IP和端口 const client = net.createConnection({ host: '192.168.x.x', port: 502 }, () => { console.log('成功连接到设备'); // 发送Buffer格式的命令,这才是设备能识别的二进制数据 client.write(deviceCommand); }); // 监听设备返回的响应 client.on('data', (response) => { console.log('设备响应(十六进制):', response.toString('hex')); console.log('设备响应(ASCII):', response.toString('ascii')); }); // 处理连接错误 client.on('error', (err) => { console.error('连接出错:', err.message); }); client.on('end', () => { console.log('设备连接已关闭'); });
方法二:手动构造字节数组再转Buffer
如果你更习惯用数组管理每个字节,也可以先把十六进制拆分成单个字节的十进制数值,再转成Buffer:
const net = require('net'); // 把每个十六进制字节转成十进制数值,比如0x01就是1,0x64就是100 const commandBytes = [0x01, 0x03, 0x00, 0x64, 0x00, 0x7A, 0x85, 0xF6]; const deviceCommand = Buffer.from(commandBytes); // 后续的连接、发送逻辑和方法一完全一致 const client = net.createConnection({ host: '设备IP', port: 设备端口 }, () => { console.log('已连接设备'); client.write(deviceCommand); }); // ... 监听响应、错误等逻辑同上
你之前可能踩过的坑
- 直接发送十六进制字符串:比如
client.write('01030064007A85F6'),这会被Node.js当成UTF-8编码发送,每个字符对应一个字节(比如'0'是0x30,'1'是0x31),和设备需要的二进制数据完全不符。 - 错误的Buffer编码:比如用
Buffer.from('01030064007A85F6')(没指定'hex'),同样会按UTF-8处理,导致数据错误。
额外检查点
如果按上面的方法还是没响应,建议排查:
- 设备的IP和端口是否正确,确保和你的Node.js程序在同一网络。
- 设备是否开启了对应的通信端口,有没有防火墙/路由器拦截。
- 命令的校验和是否正确(你的命令最后两位是85F6,确认是设备要求的CRC校验值)。
内容的提问来源于stack exchange,提问作者k-kundan
相关产品推荐
相关产品推荐

