使用samsung-tv-control包控制三星Tizen电视遇WebSocket错误,无法获取Token与应用信息
解决三星Tizen电视控制的WebSocket错误及应用获取问题
核心问题分析
你遇到的RangeError: Invalid WebSocket frame: invalid status code 1005是因为WebSocket连接未正确建立,大概率是配置错误、电视权限未开启,或者方法调用时机不对导致的。同时token的获取需要完成电视端的授权流程,首次连接时无需手动填写。
必做前置设置(电视端)
- 开启远程控制(网络):电视设置→通用→外部设备管理器→远程控制→开启网络远程控制
- 开启开发者模式:电视设置→支持→关于此电视→连续按遥控器的
信息键5次,返回设置会出现开发者选项 - 开发者选项里:允许安装未知来源应用,开启远程调试
- 确保电视和你的Node.js服务在同一局域网
配置与代码修正
1. 修正config配置项
- 把
port改回默认的8002(Tizen电视的标准控制端口) - 移除
noServer: true(这个选项用于自定义WebSocket服务器,你不需要) - 首次运行时
token留空,等授权后填入返回的token
2. 调整代码逻辑(修复方法调用时机)
isAvailable仅检测电视是否在线,不代表WebSocket连接已建立。需要等待包的connect事件触发后,再调用getToken、getAppsFromTV这类需要连接的方法。
修正后的代码:
const express = require("express"); const { Samsung } = require("samsung-tv-control"); const app = express(); const config = { debug: true, ip: "xxx.xx.xxx.xxx", // 替换成你的电视IP mac: "xx:xx:xx:xx:xx:xx", // 替换成你的电视MAC nameApp: "NodeJS", port: 8002, // 改回默认端口 token: "", // 首次留空,授权后填入 }; const control = new Samsung(config); let isConnected = false; // 监听连接成功事件 control.on("connect", () => { isConnected = true; console.log("已连接到电视"); // 获取token(首次运行时电视会弹出授权框) control.getToken((token) => { console.info("获取到Token:", token); // 把这个token保存到config里,下次启动就不用再授权了 }); // 获取已安装应用 control.getAppsFromTV((err, apps) => { if (!err) { console.log("已安装应用列表:", apps); } else { console.error("获取应用失败:", err); } }); }); // 监听连接错误事件 control.on("error", (err) => { console.error("连接错误:", err); }); app.get("/", async (req, res) => { res.send("TV 控制服务运行中"); if (!isConnected) { // 尝试连接电视 control.connect(); } else { // 示例:启动指定应用(需要从getAppsFromTV的返回中获取appId) // control.launchApp("com.samsung.tv.hbo"); } }); app.listen(3000, () => { console.log("服务运行在 http://localhost:3000"); });
Token说明
- 首次运行代码时,电视屏幕会弹出授权提示框,选择允许后,控制台会输出token字符串
- 把这个token复制到config的
token字段中,下次启动服务时无需再授权,直接建立连接
启动应用的方法
从getAppsFromTV返回的应用列表中找到目标应用的appId,调用control.launchApp(appId)即可启动,比如:
// 启动Netflix control.launchApp("com.netflix.ninja");
内容的提问来源于stack exchange,提问作者user21744620
相关产品推荐
相关产品推荐

