SoftControl
πŸ’‘ Industry Knowledge

PJLink Commands: Class 1 Reference, Port 4352 and Authentication

SoftControl Team2026-08-2412 min read
PJLinkprojector controlport 4352PJLink authenticationAV control protocols

What PJLink Actually Is

PJLink is a manufacturer-independent TCP protocol for controlling projectors. It was standardised by the JBMIA so that one control system can power on an Epson, a Panasonic, a Sony and an NEC projector using exactly the same command string β€” no per-brand driver, no RS-232 cable.

That matters on a job site. A hall with six projectors from three brands normally means three sets of serial commands, three cable runs and three sets of quirks. With PJLink it means one command set over the existing network.

The trade-off: PJLink covers the common denominator β€” power, input, AV mute, and status. Brand-specific features (lens memory, edge blending, geometry) are not in the standard. For those you still need the vendor's own RS-232 or IP protocol.

Connection: TCP Port 4352

PJLink runs over TCP on port 4352. This is fixed by the standard and you should not change it β€” most projectors do not even expose the setting.

ItemValue
TransportTCP
Port4352
EncodingASCII
Line terminatorCR (0x0D) β€” not CRLF
SessionOne command per connection is the safe pattern

Two things trip people up here:

  • The terminator is a bare carriage return. If your tool sends \r\n, some projectors will treat the trailing \n as the start of a malformed second command. Send \r only.

  • Responses are also \r-terminated. If you are parsing with a line reader that splits on \n, you will sit there waiting forever while the data is already in your buffer. Split on 0x0D.

The Handshake: PJLINK 0 vs PJLINK 1

When you open the socket, the projector speaks first. It sends one of two greetings:

PJLINK 0<CR>                  ← no password required
PJLINK 1 a8b7c6d5<CR>         ← password required, 8-digit hex nonce

  • PJLINK 0 β€” send your command directly.

  • PJLINK 1 β€” you must prefix your command with an authentication digest (below).

Practical note from the field: not every projector actually sends a greeting. Some units accept commands immediately on connect, and a client that blocks waiting for the greeting will time out against a projector that would have worked fine. A robust implementation treats a missing greeting as "no authentication" and proceeds, rather than failing.

Authentication: Building the Digest

The digest is straightforward and catches almost everyone out once:

digest = MD5( nonce + password )          ← plain concatenation, no separator
command_line = digest + command + CR

Worked example β€” nonce 498e4a67, password JBMIA, command %1POWR 1:

MD5("498e4a67JBMIA") = 8a36d09ab68186318cedf79297d3bd47
send: 8a36d09ab68186318cedf79297d3bd47%1POWR 1<CR>

The digest is lowercase hex, 32 characters, sent as ASCII text, and it is prepended directly to the command with no space. It is computed fresh from each new nonce, so it cannot be cached across connections.

If the digest is wrong, the projector replies:

PJLINK ERRA<CR>

Note that PJLINK ERRA is a standalone line, not a %1XXXX=ERRA response. Parsers that only look for =ERR will miss it and report a timeout instead of an authentication failure β€” which sends the installer off chasing a network problem that does not exist.

Command Format

%1POWR 1<CR>
β”‚β”‚β”‚β”‚β”‚ │└─ parameter (up to 128 bytes)
││││└──── separator (space)
│└──────── command (4 chars, uppercase)
└───────── header '%' + class '1'

A response echoes the command with =:

%1POWR=OK<CR>

Queries use ? as the parameter:

%1POWR ?<CR>   β†’   %1POWR=1<CR>

Class 1 Command Reference

CommandPurposeParameterResponse
%1POWR 1Power on1OK / ERRx
%1POWR 0Power off (standby)0OK / ERRx
%1POWR ?Power status?0 standby Β· 1 on Β· 2 cooling Β· 3 warming up
%1INPT nSwitch inputsee belowOK / ERRx
%1INPT ?Current input?e.g. 31
%1AVMT 30AV mute off (shutter open)30OK
%1AVMT 31AV mute on (shutter closed)31OK
%1AVMT ?Mute status?11 Β· 21 Β· 30 Β· 31
%1ERST ?Error status?6 digits, see below
%1LAMP ?Lamp hours & state?1200 1
%1INST ?Available inputs?e.g. 11 12 31 32
%1NAME ?Projector name?free text
%1INF1 ?Manufacturer?e.g. EPSON
%1INF2 ?Model?e.g. EB-L1075U
%1INFO ?Other information?free text
%1CLSS ?PJLink class?1 or 2

INPT β€” input numbering

The parameter is two characters: the first is the input type, the second is the index within that type.

First digitInput type
1RGB
2Video
3Digital (DVI / HDMI)
4Storage
5Network

So 11 = RGB 1, 12 = RGB 2, 21 = Video 1, 31 = Digital 1, and so on.

Do not guess the mapping. Which physical socket is 31 versus 32 is up to the manufacturer, and it differs between models in the same product line. Query %1INST ? first β€” it returns the list of inputs that projector actually supports, and you map them once during commissioning.

AVMT β€” mute values

ValueMeaning
11Video mute on
21Audio mute on
30AV mute off
31AV mute on

On projectors with a mechanical shutter, 31/30 drives the shutter. This is the command you want for "blank the screen between visitor groups" β€” it is far kinder to the light source than a power cycle, and it responds in under a second instead of the minutes a warm-up takes.

ERST β€” decoding the error status

%1ERST ? returns six digits, one per subsystem:

%1ERST=000000
       β”‚β”‚β”‚β”‚β”‚β”‚
       │││││└─ Other
       ││││└── Filter
       │││└─── Cover open
       ││└──── Temperature
       │└───── Lamp
       └────── Fan

Each digit: 0 = no error, 1 = warning, 2 = error.

This is the single most useful command for unattended installations. Polling %1ERST ? once a minute tells you a filter is clogging or a lamp is degrading before the projector fails in front of visitors.

LAMP β€” hours and state

%1LAMP=1200 1
        β”‚    └─ 0 = off, 1 = on
        └────── cumulative hours

Multi-lamp projectors repeat the pair: %1LAMP=1200 1 850 1.

Error Responses: ERR1–ERR4

CodeMeaningWhat it actually tells you
ERR1Undefined commandYou sent a command this projector doesn't implement β€” often a Class 2 command to a Class 1 device. Check %1CLSS ?
ERR2Out-of-parameterThe command is valid but the parameter isn't. Usually an input number that doesn't exist on this model β€” query %1INST ?
ERR3Unavailable timeThe projector is busy or in a transition state. Very common in the first 30–60 seconds after power-on
ERR4Projector failureHardware fault. Follow with %1ERST ? to find out which subsystem

ERR3 deserves special attention. It is not a failure β€” it means "ask me again shortly". A control system that treats ERR3 as a hard error will report projectors as broken every single morning during warm-up. The correct behaviour is to retry after a few seconds.

Why Your PJLink Command Gets No Response

In rough order of how often each one is the culprit:

1. PJLink is not enabled on the projector.
Most projectors ship with network control off. It lives in the network or standby menu, and it is frequently gated behind a second setting β€” standby power mode must be normal/high, not eco. In eco standby the network interface is powered down, which is why the classic symptom is: every command works while the projector is on, and power-on never works.

2. You are waiting on the wrong terminator.
The projector answered with \r and your reader is splitting on \n. See the connection table above.

3. Authentication failed but was reported as a timeout.
The projector sent PJLINK ERRA as a standalone line and the parser ignored it. Check for that literal string.

4. The projector never sent a greeting.
Some units skip it. Blocking on the greeting turns a working projector into a timeout.

5. The device answers, but not to this command.
ERR1 means the command doesn't exist on this model. Confirm the class with %1CLSS ? before assuming a network problem.

6. Firewall or VLAN.
Port 4352 is not a well-known port and gets filtered. Test with a plain TCP connect from the same subnet the controller will actually live on β€” not from the commissioning laptop on a different VLAN.

A practical debugging order: connect with a raw TCP tool from the same subnet, confirm the greeting arrives, send %1POWR ? (a query is safe and works in standby far more often than power-on), and only then move the working string into your control system. If the query returns and power-on doesn't, you have found the eco-standby setting from point 1.

Controlling PJLink Projectors with SoftControl

SoftControl speaks PJLink natively β€” port 4352, the PJLINK 0 / PJLINK 1 handshake and the MD5 digest are handled for you, including the two field cases above: projectors that skip the greeting, and PJLINK ERRA reported as an authentication failure rather than a timeout.

Because it also drives raw TCP, UDP, HTTP, RS-232 and Modbus, you can mix a PJLink projector, a serial-controlled display and a Modbus lighting relay on the same page β€” and use PJLink for what it is good at while falling back to the vendor protocol for the brand-specific features it doesn't cover.

See the projector control guide for the RS-232 side, or what a show control system does for how these fit into a full exhibition setup.

Try SoftControl Now

Free download, no registration required, starts with a 30-day trial

Download FreeView Features

Comments

Comments are reviewed manually before they appear. Abusive content will be removed.

    No comments yet β€” be the first to share your thoughts