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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:44:47