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

Node.js中通过Telnet指令控制Optoma投影仪开关的问题

Optoma投影仪网络控制脚本问题排查

问题背景

拥有一台Optoma投影仪,已确认设备可ping通,Node.js脚本能成功建立TCP连接,但无法实现开关操作,当前使用的代码如下:

const net = require('net');

// Some sample projector control codes
var NEC = {
    port: 23,
    ip: "xxx.xxx.x.xxx", // ip address
    on: Buffer.from([0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31]),
    off: Buffer.from([0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x32])
};

var device = NEC;
var command = device.on;

const client = new net.Socket();

client.connect(device.port, device.ip, () => {
    console.log(`Connected to projector at ${device.ip}:${device.port}`);
    client.write(command);
});

client.on('data', (data) => {
    console.log(`Received data from projector:`, data.toString("hex"));
    client.end();
});

client.on('error', (err) => {
    console.log('Error:', err.message);
});

client.on('end', () => {
    console.log("Connection ended");
});

client.on('close', () => {
    console.log("Connection closed");
});

结合Optoma官方控制文档及参考信息,以下是问题分析与修正方案:


核心问题:指令格式错误

你当前使用的是NEC设备的控制码,而非Optoma投影仪的标准指令。根据Optoma的控制协议规范,开关指令需要补充回车结束符(ASCII 0x0D),完整格式应为:

  • 开机指令:~0000 1\r(对应Buffer:[0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x0D])
  • 关机指令:~0000 2\r(对应Buffer:[0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x32, 0x0D])

你的代码中缺少了末尾的0x0D结束符,导致投影仪无法识别指令。


脚本实现的优化点

  1. 变量命名修正:将NEC改为Optoma,避免设备类型混淆
  2. 增加连接超时处理:防止因网络问题导致脚本挂起
  3. 延迟关闭连接:部分投影仪需要时间处理指令,发送后不要立即断开连接
  4. 完善响应日志:同时打印十六进制和ASCII格式的响应,便于排查

修改后的示例代码

const net = require('net');

// Optoma投影仪控制配置
var Optoma = {
    port: 23,
    ip: "xxx.xxx.x.xxx", // 替换为你的投影仪IP
    on: Buffer.from([0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x0D]), // 补充回车结束符
    off: Buffer.from([0x7E, 0x30, 0x30, 0x30, 0x30, 0x20, 0x32, 0x0D])
};

var device = Optoma;
var command = device.on;

const client = new net.Socket();
const connectionTimeout = 5000; // 5秒连接超时阈值

// 设置连接超时定时器
const timeoutTimer = setTimeout(() => {
    console.log('Connection timeout');
    client.destroy();
}, connectionTimeout);

client.connect(device.port, device.ip, () => {
    clearTimeout(timeoutTimer);
    console.log(`Connected to projector at ${device.ip}:${device.port}`);
    client.write(command);
    // 发送指令后延迟2秒关闭连接,确保设备完成处理
    setTimeout(() => {
        client.end();
    }, 2000);
});

client.on('data', (data) => {
    console.log(`Received data from projector:`);
    console.log(`  Hex: ${data.toString("hex")}`);
    console.log(`  ASCII: ${data.toString()}`);
});

client.on('error', (err) => {
    console.log('Error:', err.message);
    clearTimeout(timeoutTimer);
});

client.on('end', () => {
    console.log("Connection ended");
});

client.on('close', () => {
    console.log("Connection closed");
});

额外排查建议

  1. 确认设备协议版本:部分Optoma型号可能要求指令末尾添加校验字节,需对照官方文档确认完整格式
  2. 手动测试指令有效性:先用PuTTY等工具手动发送完整指令,验证开关功能正常后再移植到脚本中

内容的提问来源于stack exchange,提问作者ksatione

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:40:31