pjlink communication videoprojector panasonic tcp

Sep 20, 2008 at 1:05pm

pjlink communication videoprojector panasonic tcp


I’m wondering if anyone had already tried to communicate via ethernet with a panasonic projector. It works fine on a web browser but I’d like to do it in max.
It uses the “pjlink” protocol. (http://pjlink.jbmia.or.jp/english/index.html)
It’s uses TCP on port 4352.
After several tried with the mxj net.tcp.send object, I didn’t succeed. Each time I’m sending something in it, it returns the message via the failure outlet.
Can anyone help me?


Benoit SIMON.

Sep 21, 2008 at 5:34pm

I dont think you can send raw data with net.tcp.send. It probably
sends atoms, which of course the projector will not understand. You
would need to make a custom mxj object that communicates with the
projector using whatever protocol it expects. There is a lot of stuff
about java client/server socket programming on the internet so it
shouldnt be too difficult.

On Sep 20, 2008, at 06:05 AM, benoit simon wrote:

> Hi,
> I’m wondering if anyone had already tried to communicate via
> ethernet with a panasonic projector. It works fine on a web browser
> but I’d like to do it in max.
> It uses the “pjlink” protocol. (http://pjlink.jbmia.or.jp/english/
> index.html)
> It’s uses TCP on port 4352.
> After several tried with the mxj net.tcp.send object, I didn’t
> succeed. Each time I’m sending something in it, it returns the
> message via the failure outlet.
> Can anyone help me?
> Regards.
> Benoit SIMON.

Sep 23, 2008 at 10:16am

When dabbling in the realm of communications over the various infra-, intra-, and inter- nets, you must always be sure of the following: proxy settings)
What can I say about these. Well, they’re of the utmost importance, first and foremost.
java/servlet api implementation)
this is crucial. communication protocol is square 1. Now, there may be a time or two when various conflicting protocols can cause some interference-say jpg data ran through a gif codec, for one, or, further, jpg data ran through a mp3 codec, if you please.
yeah, yeah, you’ve heard it all before. but i can not stress this enough. make sure you’re going from point a on one system to point a on another. stuff can get all mixed up in a harry.
being a oft-overlooked technolgical specification, vmts are nebulous, charitably put. but, if all goes well, everything should go through, there.

Mar 24, 2009 at 1:52pm

Here is what I just made in JAVA at the Danish National Gallery.

I made a java package called pjLink. Within this package i made following 2 classes. When execute as compiled it tells how to use it.

* Remember to update line “pjLinkSocket = new Socket(“172.20.X.X”, 4352);” with the correct IP-Address
* Only works on Projector without Password. Haven’t implemented the md5 authentication.


package pjLink;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import pjLink.Projector.*;

 * @author Nicolai Bob Zachariassen
 * @year 2009
 * Application to turn power on / off of a projector using PJLink protocol
public class PjLinkCom {

	 * @param args
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Projector projector = new Projector();

		for (String s: args) {
			// Turn power on
			if (s.equals("on") && projector.POWR == PowerState.undefined){
				projector.POWR = PowerState.on;
				System.out.println("Turning Power On");

			// Turn power off
			if (s.equals("off") && projector.POWR == PowerState.undefined){
				projector.POWR = PowerState.off;
				System.out.println("Turning Power Off");

			// Switch Input to: rgb1
			if (s.equals("rgb1") && projector.INPT == InputState.undefined){
				projector.INPT = InputState.rgb1;
				System.out.println("Switching Input to RGB1");
			// Switch Input to: rgb2
			if (s.equals("rgb2") && projector.INPT == InputState.undefined){
				projector.INPT = InputState.rgb1;
				System.out.println("Switching Input to RGB2");
			// Switch Input to: video
			if (s.equals("video") && projector.INPT == InputState.undefined){
				projector.INPT = InputState.rgb1;
				System.out.println("Switching Input to VIDEO");
			// Switch Input to: svideo
			if (s.equals("svideo") && projector.INPT == InputState.undefined){
				projector.INPT = InputState.rgb1;
				System.out.println("Switching Input to S-VIDEO");
			// Switch Input to: dvi
			if (s.equals("dvi") && projector.INPT == InputState.undefined){
				projector.INPT = InputState.rgb1;
				System.out.println("Switching Input to DVI-D");

		Socket pjLinkSocket;
		try {
			System.out.println("Opening connection");
			pjLinkSocket = new Socket("172.20.X.X", 4352);

            DataOutputStream ostream = new DataOutputStream(pjLinkSocket.getOutputStream());
	        BufferedReader istream = new BufferedReader(new InputStreamReader(pjLinkSocket.getInputStream()));			


	        if (projector.INPT == InputState.undefined && projector.POWR == PowerState.undefined){
    	        System.out.println("tTurn on/off projector: java pjLink.PjLinkCom on|off");
    	        System.out.println("tSwitch input on projector: java pjLink.PjLinkCom rgb1|rgb2|video|svideo|dvi");
    	        System.out.println("ntExample: java pjLink.PjLinkCom on rgb2");

    		if (projector.INPT == InputState.undefined){
    	        ostream.writeBytes("%1INPT ?r");
    		}else if (projector.INPT == InputState.rgb1){
	        	ostream.writeBytes("%1INPT 11r");
    		}else if (projector.INPT == InputState.rgb2){
	        	ostream.writeBytes("%1INPT 12r");
    		}else if (projector.INPT == InputState.video){
	        	ostream.writeBytes("%1INPT 21r");
    		}else if (projector.INPT == InputState.svideo){
	        	ostream.writeBytes("%1INPT 22r");
    		}else if (projector.INPT == InputState.dvi){
	        	ostream.writeBytes("%1INPT 31r");

    		if (projector.POWR == PowerState.undefined){
    	        ostream.writeBytes("%1POWR ?r");
    		}else if (projector.POWR == PowerState.on){
    	        ostream.writeBytes("%1POWR 1r");
    		}else if (projector.POWR == PowerState.off){
    	        ostream.writeBytes("%1POWR 0r");


		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
		} catch (IOException e) {
			// TODO Auto-generated catch block


CLASS Projector

package pjLink;

public class Projector {
	protected enum PowerState{
		on, off, undefined
	protected enum InputState{
		rgb1, rgb2, video, svideo, dvi, undefined
	protected PowerState POWR;
	protected InputState INPT;

		POWR = PowerState.undefined;
		INPT = InputState.undefined;

May 15, 2009 at 6:21pm

Hi Nicolai,

Sorry for the late reply, but I just took the time to look at your job.
Have you already try your classes in max?
I haven’t succeed to work with.
There are missing lines before compiling:

import com.cycling74.max.*;


public class PjLinkCom extends MaxObject{

The compiling was successful after adding these but the “mxj pjLink.PjLinkCom” object doesn’t understand rgb1 or another strings…

If you will have few time to give me some advices, I would appreciate.



May 16, 2009 at 10:18am

Nicolai’s code will additional need some small changes to run under mxj as well as extending MaxObject:

main() needs to be changed to a method that will take input from the max environment. Given the way the code is written, the quickest way to do this would be to change it to a handler for a list of symbol atoms.

Feb 11, 2011 at 8:18pm


I searched the forums today for PJ LINK, since I am also wanting to control a Panasonic projector from Max… this thread is a year old, but I was wondering if anyone had any further success, using the java code or otherwise? The command structure itself is more like a serial string then anything else. I just wish the serial object had an option to send over a tcp connection :)

any help appreciated

Johnny DeKam

Feb 11, 2011 at 10:09pm

PS I’m fairly java illiterate — could someone take a whack at converting the javacode earlier in the thread to mxj?

I am all setup to test it here with the projector on the network. The only functionality I am really after is turning the power on and off.

many thanks


Jul 14, 2011 at 2:37am

More on this saga, I put this on the back burner some time ago, using an rs-232 implementation instead for that particular project, but now I am about to add more projectors for a new project, and need to revisit PJLINK.

Today I found some new GPL java pjlink code, haven’t had a chance to try it yet in max… but anyone care to take a look at compatibility / portability?

package pjlinkApp;

import java.net.*;
import java.security.*;
//import java.util.*;
import java.io.*;
//import java.lang.*;

* @author sebastiaan

public class PjlinkApp {
private String IP;
private String Password;

public void PjlinkSetting(String projectorIp,String ProjectorPw){

public void projectorOn(){
this.sendRecvData(new JLinkDataSend(“POWR”,”1″));

public void projectorOff(){
this.sendRecvData(new JLinkDataSend(“POWR”,”0″));

public String projectorHours(){
JLinkDataRecv recv=this.sendRecvData(new JLinkDataSend(“LAMP”,”?”));
if(recv==null){System.out.println(“recv null”);return null;}
if(recv.arg==null){System.out.println(“arg null”);return null;}
String[] lamphours=recv.arg.split(” “);

System.out.println(“lamp testing”);
return “Total lamp hours: “+ lamphours[0];

public String projectorName(){
JLinkDataRecv recv=this.sendRecvData(new JLinkDataSend(“NAME”,”?”));
if(recv==null)return null;
return recv.arg;

private String readSocketData(BufferedReader in){
return in.readLine();
} catch (IOException e){
System.out.println(“Read failed”);
return null;

private JLinkDataRecv sendRecvData(JLinkDataSend dataOut){
PrintWriter out=null;
BufferedReader in=null;
Socket PJsock = null;
JLinkDataRecv recvd=null;
String[] Data=null;

PJsock=new Socket();
PJsock.connect(new InetSocketAddress(IP,4352), 2000);
out = new PrintWriter(PJsock.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(PJsock.getInputStream()));
} catch (UnknownHostException e) {
System.out.println(“Unknown host: “+IP);
return null;
} catch (IOException e) {
System.out.println(“Cannot connect to ip: “+IP);
return null;

Data=readSocketData(in).split(” “);
System.out.println(“projector did not send out magic PJLINK”);
System.out.println(“projector uses secured link”);
String secureComp= new String(Data[2]+this.Password);
MessageDigest md5 = MessageDigest.getInstance(“MD5″);
byte[] digested=md5.digest();
String tmp = “”;
String res = “”;

for (int i = 0; i < digested.length; i++) {
tmp = (Integer.toHexString(0xFF & digested[i]));
if (tmp.length() == 1) {
res += “0″ + tmp;
} else {
res += tmp;
System.out.println(“adding secured MD5 digest: “+res);
}catch(NoSuchAlgorithmException nsae){
System.out.println(“could not find MD5 digest”);

System.out.println(“sending to beamer: “+dataOut.outData);
//Receive text from server
String dataIn=readSocketData(in);
System.out.println(“received from beamer: “+dataIn);
recvd=new JLinkDataRecv(dataIn);
System.out.println(“received a NULL string from beamer!”);

System.out.println(“closing socket”);
try {
} catch (IOException e) {
System.out.println(“failure on socket close”);
return recvd;

class JLinkDataRecv{
public String cmd;
public String arg;
public JLinkDataRecv(String data){
class JLinkDataSend{
public String outData;
public JLinkDataSend(String cmd,String arg){
outData=”%1″+cmd+” “+arg;
public void AddSecurityData(String addData){


Sep 26, 2011 at 4:05pm

You can use standard mxj net.tcp.send object to remote Panasonic Videoprojectors with PJLink protocol.

Here is a simple patch which open and close the shutter…

I hope it will help…

max v2;
#N vpatcher 440 104 746 364;
#P origin 0 -47;
#P toggle 8 29 19 0;
#P window setfont “Sans Serif” 9.;
#P window linecount 1;
#P newex 23 184 51 196617 tosymbol;
#P newex 23 163 40 196617 itoa;
#P newex 23 142 55 196617 append 13;
#P newex 23 121 40 196617 atoi;
#P newex 23 206 254 196617 mxj net.tcp.send @address @port 4352;
#P message 8 94 67 196617 %1AVMT 30;
#P message 23 74 67 196617 %1AVMT 31;
#P newex 8 53 41 196617 sel 0 1;
#P connect 8 0 0 0;
#P connect 0 0 2 0;
#P connect 0 1 1 0;
#P connect 2 0 4 0;
#P connect 1 0 4 0;
#P connect 4 0 5 0;
#P connect 5 0 6 0;
#P connect 6 0 7 0;
#P fasten 7 0 3 0 28 204 28 204;
#P pop;

Oct 21, 2013 at 3:34pm


the thread is old, but it is exactly about what I am looking for help for. Did anybody succeed in controlling a projector with PJLink and max? Anybody can confirm Reno’s method does work? I tried with it, but with no luck.



You must be logged in to reply to this topic.