JMGO-projector-controller
更新于 2026-11-03 13:50:02
项目简介
JMGO-projector-controller 是一个只有几十行的 Python 小工具:通过局域网 TCP 向坚果(JMGO)投影仪发送二进制控制指令,实现开关机、音量调节与遥控按键模拟,不依赖官方 App。
作者的思路很直接——抓取「坚果控」App 与投影仪(实测机型 JMGO-N1S Ultra-0087)之间的 TCP 报文,反推出各按键对应的 protobuf 风格指令,再把字节序列硬编码进 Projector.py 的 commands 字典。
工作原理
- 投影仪在局域网内开放 TCP 控制端口(由调用方传入,社区常见 7777 / 8383 一类端口,需按机型自行确认)。
- 每个按键由「按下 / 抬起」两段报文组成,例如电源键:
"power": [b"\x09\x12\x07\x0a\x05\x08\xc3\x05\x10\x01",
b"\x09\x12\x07\x0a\x05\x08\xc3\x05\x10\x00"]
\x10\x01 与 \x10\x00 分别表示按下与释放,两段之间间隔约 100ms。
- 音量控制更接近业务请求,报文里直接内嵌 JSON:
{"req":"setVolume","param":"0|20|100"},因此脚本对<10、==100和其它三种情况做了分支处理。
快速上手
from Projector import Projector
p = Projector("192.168.x.x", 7777) # 换成你的投影仪 IP 与端口
p.power() # 开关机
p.ok() # 确认
p.up() # 上
p.set_volume(30)
仓库里还有 use_template.py 作为最小调用示例。README 只有一句「用你的投影仪 IP 替换 host」,使用前需要确认端口和机型是否匹配。
支持的指令
电源、主页(mongo)、返回、设置、确认、上下左右、选项,以及三档音量设置。指令表集中在 commands 字典中,新增按键只需补一条字节序列。
适用场景与局限
适合:想把坚果投影仪接入 Home Assistant、树莓派或自建 Web 面板,做「一句话开投影仪」这类自动化的折腾党。代码极简、几乎零依赖,阅读和改造成本很低。
局限:
- 协议来自单一机型抓包,不同固件/型号的指令码可能不一致,需要重新抓包验证;
- 没有状态回读,只能盲发指令,查不到真实开关机状态或音量;
- 未处理重连与异常,长期运行建议自行加 socket 超时与重试;
- 仓库未声明 License,商用或二次分发前建议先联系作者。
二开建议
- 把
Projector封装成 CLI 或 HTTP 接口(FastAPI / Flask),方便被自动化平台调用; - 补上
try/except与断线重连,避免投影仪休眠后 socket 失效; - 用 MQTT 做桥接,即可在 Home Assistant 中直接暴露为
button/number实体; - 换机型时用 Wireshark 抓「坚果控」App 的 TCP 流量,沿用同样的字节结构扩展指令表。