CR1000X数据记录仪无法通过UDPDataGram向Node.js UDP服务器发数据求助
排查CR1000X数据记录仪UDP数据发送失败问题
已知你的Node.js UDP服务器能正常接收其他Node.js客户端的UDP数据,但CR1000X通过UDPDataGram("192.168.31.112",6787,"test",100,0,0)发送的数据无法被服务器接收,以下是针对性的排查步骤:
1. 确认CR1000X与服务器的网络连通性
- 在CR1000X的程序中添加
Ping()命令,测试和服务器IP192.168.31.112的连通性,确保两者在同一网段,子网掩码、网关配置正确,没有路由或防火墙阻断UDP流量。 - 检查服务器所在设备的防火墙,确认UDP 6787端口的入站规则允许CR1000X所在网段访问,排除CR1000X的IP被单独拦截的可能。
2. 核对CR1000X的UDPDataGram参数
CR1000X的UDPDataGram参数格式为UDPDataGram(IPAddress, Port, OutString, Timeout, DestIPType, LocalPort),重点检查:
- 超时参数(第4位)设为100毫秒过短,UDP发送需要一定时间,建议调整为1000毫秒或更长,避免因超时导致发送失败。
- 尝试将
LocalPort(第6位)从0改为固定端口(比如6788),避免自动分配端口时出现异常。 - 简化测试字符串,比如把
"test"改成"a",排除字符串编码或长度问题。
3. 验证服务器监听配置
- 当前服务器用
server.bind(6787)默认监听所有IPv4地址(0.0.0.0),但可以显式指定server.bind(6787, '0.0.0.0'),确保不会意外只监听localhost。 - 检查服务器的
listening日志,确认输出的监听地址是0.0.0.0:6787,而非127.0.0.1:6787(后者只会接收本地请求)。
4. 抓包确认数据是否发出
在服务器所在设备或同一网段的其他设备上用Wireshark抓包,过滤规则设为udp.port == 6787:
- 如果没抓到来自CR1000X的UDP包,说明问题出在CR1000X的程序执行或网络配置,需要查看CR1000X的运行日志。
- 如果抓到了包但服务器没输出日志,说明数据在传输路径中被拦截,检查交换机、路由器的UDP过滤规则。
5. 检查CR1000X的程序执行状态
- 通过LoggerNet或Device Configuration Utility查看CR1000X的程序运行日志,确认
UDPDataGram命令是否执行成功,有没有报错信息。 - 确保
UDPDataGram命令是在循环中被周期性调用,或者有触发条件(比如定时触发),如果只在程序初始化时执行一次,可能测试时命令已经执行完毕。
你的服务器代码
const dgram = require('node:dgram'); const server = dgram.createSocket('udp4'); server.on('connect', () => { console.log(`connect`); server.close(); }); server.on('close', () => { console.log(`close`); }); server.on('error', (error) => { console.log(`error ${error}`); }); server.on('listening', () => { const address = server.address(); console.log(`server listening ${address.address}:${address.port} - :${address.family}`); }); server.on('message', (msg, rinfo) => { console.log(`Received message: ${msg} from ${rinfo.address}:${rinfo.port}`); }); server.bind(6787);
CR1000X测试命令
UDPDataGram("192.168.31.112",6787,"test",100,0,0)
测试用Node.js客户端代码
const dgram = require('dgram'); const client = dgram.createSocket('udp4'); const message = Buffer.from('Hello World!'); client.send(message, 6787, "192.168.31.112", (err) => { console.log(err) client.close(); }); client.on('message', (msg, rinfo) => { console.log(`Received response from ${rinfo.address}:${rinfo.port}: ${msg}`); });
内容的提问来源于stack exchange,提问作者Dung Do
相关产品推荐
相关产品推荐

