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.
| Item | Value |
|---|---|
| Transport | TCP |
| Port | 4352 |
| Encoding | ASCII |
| Line terminator | CR (0x0D) β not CRLF |
| Session | One 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\nas the start of a malformed second command. Send\ronly.
- 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 on0x0D.
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 noncePJLINK 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 + CRWorked 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
| Command | Purpose | Parameter | Response |
|---|---|---|---|
%1POWR 1 | Power on | 1 | OK / ERRx |
%1POWR 0 | Power off (standby) | 0 | OK / ERRx |
%1POWR ? | Power status | ? | 0 standby Β· 1 on Β· 2 cooling Β· 3 warming up |
%1INPT n | Switch input | see below | OK / ERRx |
%1INPT ? | Current input | ? | e.g. 31 |
%1AVMT 30 | AV mute off (shutter open) | 30 | OK |
%1AVMT 31 | AV mute on (shutter closed) | 31 | OK |
%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 digit | Input type |
|---|---|
1 | RGB |
2 | Video |
3 | Digital (DVI / HDMI) |
4 | Storage |
5 | Network |
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
| Value | Meaning |
|---|---|
11 | Video mute on |
21 | Audio mute on |
30 | AV mute off |
31 | AV 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
βββββββ FanEach 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 hoursMulti-lamp projectors repeat the pair: %1LAMP=1200 1 850 1.
Error Responses: ERR1βERR4
| Code | Meaning | What it actually tells you |
|---|---|---|
ERR1 | Undefined command | You sent a command this projector doesn't implement β often a Class 2 command to a Class 1 device. Check %1CLSS ? |
ERR2 | Out-of-parameter | The command is valid but the parameter isn't. Usually an input number that doesn't exist on this model β query %1INST ? |
ERR3 | Unavailable time | The projector is busy or in a transition state. Very common in the first 30β60 seconds after power-on |
ERR4 | Projector failure | Hardware 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.