Node.js通过Telnet向路由设备传输JSON数据的实现方案求助
核心实现说明
- 你当前代码连接的22端口是SSH协议默认端口,Telnet默认端口为23,首先确认你的路由器Telnet服务实际监听的端口,避免连接错误
- Telnet协议基于明文文本传输,路由器的Telnet服务通常要求先完成身份认证(输入用户名、密码),之后才能执行指令,传输JSON前需要先完成认证交互
- 绝大多数路由器的Telnet服务默认只接受特定格式的命令字符串,直接传输JSON前需要确认你的路由器是否支持接收JSON格式指令,否则需要先把JSON序列化为路由器支持的命令格式
示例实现代码
const net = require('net'); const client = new net.Socket(); // 替换为你路由器的Telnet实际端口和IP地址 const TELNET_PORT = 23; const ROUTER_IP = '192.168.1.1'; // 替换为你的路由器登录账号密码,末尾的换行符不可省略 const USERNAME = 'admin\n'; const PASSWORD = 'your_password\n'; // 要发送的JSON数据 const payload = { action: 'set_wifi', params: { enable: true, ssid: 'Home_WiFi' } }; // 序列化JSON为字符串,根据路由器要求补充结束标识(通常为换行符) const jsonStr = JSON.stringify(payload) + '\n'; client.connect(TELNET_PORT, ROUTER_IP, () => { console.log('Telnet连接已建立'); }); // 按交互流程处理服务端返回数据 let authStep = 0; client.on('data', (data) => { const res = data.toString(); console.log('收到设备响应:', res); // 匹配登录提示输入账号 if (authStep === 0 && res.includes('Login:')) { client.write(USERNAME); authStep = 1; return; } // 匹配密码提示输入密码 if (authStep === 1 && res.includes('Password:')) { client.write(PASSWORD); authStep = 2; return; } // 认证完成匹配命令提示符后发送JSON if (authStep === 2 && res.includes('#')) { client.write(jsonStr); authStep = 3; return; } // 收到JSON发送后的响应,关闭连接 if (authStep === 3) { client.destroy(); } }); client.on('error', (err) => { console.error('连接异常:', err); }); client.on('close', () => { console.log('连接已关闭'); });
注意事项
- 不同品牌型号的路由器Telnet交互逻辑、命令提示符、支持的输入格式均有差异,以上代码中的登录提示字段(
Login:、Password:)、命令提示符(#)需要根据你的路由器实际返回内容调整 - 部分路由器会对传输的内容做长度限制、特殊字符转义要求,JSON序列化后如果包含特殊字符需要提前做对应转义处理
- 如果你的路由器不支持直接接收JSON格式指令,需要先把JSON参数转换为路由器支持的命令行格式再发送
内容的提问来源于stack exchange,提问作者Dev Node
相关产品推荐
相关产品推荐

