PJLink 控投影:认证、Class 1/2、电源/输入/状态常用指令
- 搞清 PJLink 协议的定位:统一标准 vs 私有 RS232,什么时候选哪个
- 理解 PJLink 的认证流程(随机数 + MD5),以及不需要认证时怎么处理
- 区分 Class 1 和 Class 2 的功能差异,知道哪些设备支持 Class 2
- 掌握常用指令(POWR/INPT/AVMT/ERST/NAME 等)的格式和应答,能直接发调试
- 拿到指令速查表和故障排查表
展厅里有 12 台投影,来自 4 个不同品牌。如果每台都靠各家自己的私有 RS232 协议控制,你需要分别啃 4 份完全不同格式的手册,用 4 套完全不同的指令字节。现场调试时一台改设置影响另一台配置的概率极高,维护成本还不说。
PJLink 解决的就是这件事。它是日本 JBMIA(Business Machines and Information System Industries Association)在 2002 年发布的投影机统一控制标准,主流品牌的投影(爱普生、NEC、松下、索尼、三菱等)从商用系列开始基本都支持。统一标准的意思是:无论哪个品牌,只要支持 PJLink,你发 %1POWR 1 就是开机,%1POWR 0 就是关机,应答格式也一样。
当然 PJLink 也有边界——它能控的操作是"共性的"(电源、输入切换、静音、查询状态),各家投影的特有功能(色彩调整、几何校正、镜头调整等)PJLink 覆盖不了,那些还是要靠各家私有协议。
涉及网络设备控制(R2)。PJLink 协议规范(Class 1/2 指令格式、认证流程)以 JBMIA 官方 PJLink 规范文档为准(见文末来源);具体某台投影支持哪些 PJLink 指令、支持 Class 1 还是 Class 2,必须查该设备的手册或 PJLink 官方认证数据库,不是所有支持 PJLink 标识的投影都实现了全部指令。
PJLink 协议基础:TCP 4352,文本指令
PJLink 走 TCP 协议,端口 4352,这是 JBMIA 在 IANA 注册的固定端口,不需要查手册——见到 PJLink 投影,连 IP:4352 就对了。
指令格式全是 ASCII 文本(人可读),每条指令以 CR(回车,ASCII 0x0D)结尾,不是 \r\n,只有 \r。
PJLink 是客户端-服务器模式:中控(或调试工具)作为 TCP 客户端,投影作为服务器。每次操作:建立 TCP 连接(或使用持久连接)→ 发指令 → 收应答 → 根据需要发下一条或断开。
认证流程:随机数 + MD5
PJLink 支持两种模式:
无认证模式(Class 1 / Class 2 均可):连上 TCP 4352 后,投影主动发送:
PJLINK 0\r这里的
0表示本次不需要认证(设备配置了空密码或关闭了密码验证)。你直接发指令就可以,不需要任何额外步骤。有认证模式:连上后,投影发送:
PJLINK 1 <随机字符串>\r这里
1表示需要认证,<随机字符串>是一个 8 字节的随机十六进制字符串(投影随机生成,每次连接不同)。
有认证时的处理流程:
1. 客户端收到: PJLINK 1 D8B8C29C\r
随机字符串 = "D8B8C29C"
2. 把随机字符串和密码拼接(默认密码是 "JBMIAProjectorLink",
以实际配置为准):
认证字符串 = "D8B8C29C" + "你的密码"
(如果密码为空,则只用随机字符串)
3. 对认证字符串计算 MD5 哈希(32 位十六进制小写):
MD5("D8B8C29CJBMIAProjectorLink") → 某个 32 位哈希值
4. 在每条指令前加上这个 MD5 哈希:
发送: <MD5哈希值>%1POWR 1\r
投影验证 MD5 正确后执行指令
Python 计算 MD5 认证字符串:
import hashlib
def pjlink_auth(random_string: str, password: str = "") -> str:
"""
计算 PJLink 认证哈希
参数 random_string: 投影发来的随机字符串(如 "D8B8C29C")
参数 password: PJLink 密码(空字符串表示无密码)
返回: 32 位 MD5 哈希字符串(小写)
"""
auth_str = random_string + password
return hashlib.md5(auth_str.encode("ascii")).hexdigest()
# 示例(实际密码以投影配置为准)
random_str = "D8B8C29C"
password = "" # 空密码
auth_hash = pjlink_auth(random_str, password)
print(f"认证哈希: {auth_hash}")
# 有认证时的指令格式:
cmd = f"{auth_hash}%1POWR 1\r"
大多数展厅项目里,投影的 PJLink 密码配成空(禁用认证),中控直接发指令,不走 MD5 流程。如果你用调试工具连上后直接发指令没反应,先检查投影发来的第一条消息——如果是 PJLINK 1 ... 就说明需要认证,你要先发 MD5 哈希。收到 PJLINK 0 才能直接发指令。中控软件(SoftControl 等)通常支持配置 PJLink 密码,填上去就行;手动用网络调试助手调试时,要注意这个步骤。
Class 1 和 Class 2 的区别
PJLink 有两个版本:
| 对比项 | Class 1 | Class 2 |
|---|---|---|
| 发布时间 | 2002 年 | 2011 年 |
| 版本标识 | 指令前缀 %1 |
指令前缀 %2 |
| 覆盖功能 | 电源、输入切换、音视频静音、查状态、查型号 | Class 1 全部 + 冻结、背景色、镜头控制、多播查询等 |
| 设备支持 | 商用投影广泛支持 | 部分较新的中高端投影 |
Class 1 指令用 %1 前缀,Class 2 指令用 %2 前缀。Class 2 投影同时支持 Class 1 指令(兼容);只支持 Class 1 的投影不响应 %2 前缀的指令。
Class 2 新增的常用功能(以官方规范为准):
- 镜头控制(变焦、对焦、镜头移位):
%2LENS - 冻结画面:
%2FREZ - 投影机 Logo 背景:
%2LOGO - 多播:一条指令广播到网段内所有 PJLink 设备(UDP 4352)
实际使用建议:展厅控制用 Class 1 已经够用(电源、输入切换、静音、查状态)。如果投影手册明确标注支持 Class 2,且你需要镜头控制或冻结功能,再引入 Class 2 指令。不要假设所有投影都支持 Class 2。
常用指令速查表(Class 1)
指令格式:%1<命令> <参数>\r(发送);应答格式:%1<命令>=<结果>\r
| 命令 | 说明 | 发送示例 | 应答示例 | 备注 |
|---|---|---|---|---|
POWR |
电源控制 / 查询 | %1POWR 1\r |
%1POWR=OK\r |
1=开机,0=关机,?=查询状态 |
POWR ? |
查电源状态 | %1POWR ?\r |
%1POWR=1\r |
0=关机,1=开机,2=冷却中,3=预热中 |
INPT |
输入源切换 / 查询 | %1INPT 11\r |
%1INPT=OK\r |
输入源编码见下方,?=查询当前输入 |
AVMT |
音视频静音 / 查询 | %1AVMT 31\r |
%1AVMT=OK\r |
11=视频静音ON,12=OFF;21=音频ON;31=全部ON,30=全部OFF |
ERST |
查询错误状态 | %1ERST ?\r |
%1ERST=000000\r |
6位十六进制,每位对应一种错误(见下方) |
LAMP |
查询灯泡状态 | %1LAMP ?\r |
%1LAMP=1024 1\r |
灯时数+状态(1=开灯,0=关灯),可能有多组(多灯机) |
INST |
查询可用输入源列表 | %1INST ?\r |
%1INST=11 31\r |
返回该设备支持的所有输入源编码列表 |
NAME |
查询投影机名称 | %1NAME ?\r |
%1NAME=ProjectorA\r |
返回设备配置的名称 |
INF1 |
查询制造商名 | %1INF1 ?\r |
%1INF1=Manufacturer\r |
查询结果以实际设备返回为准 |
INF2 |
查询型号 | %1INF2 ?\r |
%1INF2=ModelXXX\r |
查询结果以实际设备返回为准 |
INFO |
查询其他信息 | %1INFO ?\r |
%1INFO=...\r |
返回内容由设备厂商定义 |
CLSS |
查询支持的 Class | %1CLSS ?\r |
%1CLSS=1\r 或 %1CLSS=2\r |
确认投影支持的 PJLink Class |
输入源编码说明
PJLink 用一个 2 位数字表示输入源,第一位是接口类型,第二位是同类接口的序号:
| 第一位(接口类型) | 含义 |
|---|---|
| 1 | RGB(VGA 类接口) |
| 2 | VIDEO(复合视频) |
| 3 | DIGITAL(数字接口,通常是 HDMI/DVI/DisplayPort) |
| 4 | STORAGE(存储设备,如 USB) |
| 5 | NETWORK(网络/局域网) |
例子:
11= RGB 第 1 路(VGA1)12= RGB 第 2 路(VGA2)31= DIGITAL 第 1 路(通常是 HDMI 1)32= DIGITAL 第 2 路(HDMI 2)
具体某台投影的输入源编码需要用 %1INST ? 查询实际支持的列表,不能照上面的对应关系硬套。比如某台投影的 HDMI 1 可能映射为 31,也可能因为该品牌的实现不同映射为其他值。先发 %1INST ?,看返回值,确认可用的输入源编码,再用 %1INPT 切换。
ERST 错误状态字节含义
%1ERST ? 返回 6 位十六进制字符串,每位对应一种错误类型(以 PJLink Class 1 官方规范为准):
| 位置 | 对应错误 |
|---|---|
| 第 1 位 | 风扇故障(0=无,1=警告,2=故障) |
| 第 2 位 | 灯泡故障(0=无,1=警告,2=故障) |
| 第 3 位 | 温度过高(0=无,1=警告,2=故障) |
| 第 4 位 | 覆盖盖板打开(0=无,2=故障) |
| 第 5 位 | 滤网故障(0=无,1=警告,2=故障) |
| 第 6 位 | 其他故障(0=无,1=警告,2=故障) |
%1ERST=000000\r 表示无任何错误。%1ERST=020000\r 表示灯泡故障(第 2 位 = 2)。
这个查询在展厅运维中非常实用:中控软件可以定期轮询 ERST,在灯泡到寿命前(警告状态 = 1)提前预警。
PJLink 应答的错误代码
如果指令本身格式有问题,投影会返回错误应答(以 PJLink 规范为准):
| 应答 | 含义 |
|---|---|
%1XXXX=OK\r |
指令执行成功 |
%1XXXX=ERR1\r |
命令无效(未定义的命令) |
%1XXXX=ERR2\r |
参数超出范围 |
%1XXXX=ERR3\r |
指定的时间内不可执行(如关机时发开关灯指令,投影在冷却中) |
%1XXXX=ERR4\r |
投影机故障 |
%1XXXX=ERRA\r |
认证错误(MD5 不匹配) |
ERR3 很常见:投影关机后有冷却期(风扇还在转),这段时间发开机指令会收到 ERR3,等冷却完成再发就好。
PJLink vs 私有 RS232:什么时候选哪个
这个问题展厅里经常遇到,给一个实用的判断框架:
| 场景 | 建议用法 |
|---|---|
| 投影有 PJLink 支持,中控软件支持 PJLink | 优先 PJLink,统一协议省维护成本 |
| 展厅多台不同品牌投影 | PJLink 更合适,不需要分别配各家私有指令 |
| 需要控制镜头移位、几何校正等专项功能 | 只能用各家私有协议(PJLink 覆盖不到这些) |
| 投影不支持 PJLink,只有 RS232 | 没有选择,用 RS232 私有协议 |
| 老旧投影没有网口 | RS232,配合串口服务器接进网络 |
| 投影有网口但品牌宣称支持 PJLink,实测不稳定 | 部分厂商实现不完整,考虑改用厂商自己的 TCP 协议(如果有的话)或换回 RS232 |
PJLink 是标准,但"支持 PJLink 标识"和"完整实现 PJLink"是两件事。部分品牌型号 PJLink 实现不完整,比如 LAMP ? 返回格式和规范不符、INPT 切换某些输入源时返回 ERR2,等。建议新项目第一次用某个型号时,先做一遍完整的指令测试(把你要用的每条指令都跑一遍,记录实际应答格式),发现不符合规范的地方在项目文档里记录,后续维护时不会踩坑。
调试步骤:用网络调试助手测 PJLink
(参考设备控制与指令调试的网络调试助手使用方法)
- 打开网络调试助手,选 TCP Client
- 目标 IP:投影的 IP 地址(查投影的网络设置菜单)
- 目标端口:4352
- 点"连接"
- 连接成功后,接收区应该立刻出现一行:
PJLINK 0\r→ 无认证,直接发指令PJLINK 1 xxxxxxxx\r→ 需要认证,先算 MD5
- 切换到 ASCII 发送模式,勾选"自动加回车"(等效于加
\r) - 发送
%1POWR ?,应收到投影返回当前电源状态 - 发送
%1POWR 1,投影开机(如已开机,返回 OK 不重复动作)
如果工具没有"自动加回车"选项,切换到 HEX 发送模式,把指令文本转成 ASCII 码后在末尾附上 0D(十六进制 CR)。比如 %1POWR ? 的十六进制是:25 31 50 4F 57 52 20 3F 0D。注意 PJLink 只用 CR(0x0D),不用 CRLF(0x0D 0A),多一个 0x0A 可能导致指令被忽略。
故障排查表
| 现象 | 最可能的原因 | 怎么查 / 怎么办 |
|---|---|---|
| TCP 连 4352 失败 | 投影网络未配置 / IP 填错 / PJLink 功能未开启 | 先 ping 投影 IP;进投影网络设置确认 PJLink 已启用,默认通常是关闭的 |
连上后不收到 PJLINK 开头的握手消息 |
投影固件版本不支持,或连接的端口不对 | 确认端口是 4352;查该型号手册确认 PJLink 端口 |
收到 PJLINK 1 但不知道密码 |
设备配置了 PJLink 密码 | 进投影 OSD 菜单或 Web 配置找 PJLink 密码,或复位设备密码(以手册为准) |
发指令收到 ERRA |
MD5 认证不通过 | 检查密码是否正确;确认随机字符串拼接顺序(随机字符串在前,密码在后) |
发 POWR 1 收到 ERR3 |
投影在冷却中,暂时不能开机 | 等冷却完成(通常 1~3 分钟)再发;或先发 POWR ? 查到状态 0 再开机 |
| 发指令无应答(TCP 已连接) | 缺 \r 结束符 |
确认发送工具加了 CR(0x0D);或用 HEX 模式手动在末尾加 0D |
| 指令格式对但投影不动 | 投影正在暖机预热中(状态 3),忽略指令 | 查 POWR ? 状态为 3 时等待预热完成,通常十几秒到几十秒 |
INPT 切换到某输入收到 ERR2 |
输入源编码不对 / 该接口不存在 | 先发 %1INST ? 查实际可用的输入源编码列表 |
| 中控软件显示 PJLink 已连接但状态不更新 | TCP 长连接断了(投影侧超时关闭) | 投影 PJLink 实现里有时有连接超时(30~60 秒无指令自动断连),中控需加保活或定时重连 |
部分功能返回 ERR1 |
投影不完整支持 PJLink,未实现该命令 | 确认该型号支持的指令列表(查设备手册或 JBMIA 认证数据库),改用该设备支持的指令 |
小结 · 你现在掌握了什么
- PJLink 走 TCP 4352,ASCII 文本指令,
CR(0x0D)结尾,连上后投影主动发握手消息。 - 认证:
PJLINK 0直接发指令;PJLINK 1 <随机数>时需要 MD5(随机数 + 密码)作为每条指令的前缀。 - Class 1(
%1前缀)覆盖电源/输入/静音/状态;Class 2(%2)额外支持镜头/冻结,需查设备是否支持。 - 常用指令:
POWR 1/0/?(电源)、INPT xx/?(输入,先查INST ?得可用编码)、AVMT 31/30/?(静音)、ERST ?(错误状态)。 - 应答格式:
OK=成功,ERR1~4=各类错误,ERRA=认证错误。
下一步:协议章的调试工具和综合故障排查,去看设备控制与指令调试:串口助手 / 抓包 / 排乱码 / 无响应 / 地址冲突——把协议知识和调试手法合起来用。
本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。