wxpRelay


Current version: 1.0.0, updated Feb. 3 '05


Download

All downloads and project-version information can be found on the sourceforge project page, here [sourceforge.net].

README.txt
DISCLAIMER (READ FIRST!)
------------------------

I, the author, am not responsible for any damages that running, using, or even
downloading this program incurs. If your toaster explodes killing your dog, 
that's real tough luck, and i'm simply not repsonsible. By downloading this
program you agree to read this file first; by reading this file you agree to
be bound by the terms outlined in this paragraph before you use the program;
by using this program you free me of any liability towards you, the user.

License-wise this software is protected by the GNU Public License (GPL), see 
LICENSE.txt for more information.

I am in no way affiliated with webcamXP, webcamXP-PRO, tanukisoftware; these 
are names copyrighted and trademarked by their respective owners.




WTF IS wxpRelay ?!
------------------


Good question. 

Brief terminology: 
- the "cam PC" is the computer that has the webcam attached to it with a legal
version of webcamXP-PRO (or any program that serves a series of JPGs on a given 
port in HTTP)
- the "server PC" is a computer that is either connected directly to the 
internet (not behind a hardware firewall/router of any sort), or is behind a 
firewall/router that you have administrative access to.

wxpRelay is for anyone who doesn't have control of the router that their cam PC 
is behind, but who do have control of another computer that fits the description 
of the server PC.  Say you have a laptop with a webcam, and you go off for a  
vacation in New Brunswick to the town of Fredericton, where there is bountiful 
free wireless internet. You could easily run webCamXP on your laptop and have it 
upload pictures to your website via HTTP POST or FTP, no problemo. But, if you 
wanted to allow people to see live video, how would you do it? You don't have 
access to the City of Fredericton's wireless routers, so you can't forward any 
ports through to you -- no one can make an incoming connection to you, your 
laptop has to make the outgoing connection first. That's where wxpRelay comes 
in; wxpRelay allows you to have incoming connections for video even in 
situations like the above.

One of the really useful features of wxpRelay is that all bandwidth is used at 
the server, ie. if three people are requesting video all at the same time when 
wxpRelay is being used, the video is replicated on the server PC, so only one 
connection to the cam PC is ever used. This is good because if the cam PC is 
wirelessly roaming as above, it'll probably have reduced bandwidth so you 
don't want any more than 1 stream of video emanating from it.


REQUIREMENTS
------------

- a webcam program that provides quickly changing jpgs and has its own 
web-server; webcamXP is recommended but many programs do this
- Java. I use J2SE 5.0 update 1 but only JRE 1.2 is required; see the how to
run section for more info if you don't understand what I mean. The class files
the package comes with have been compiled with backwards compatibility for Java
JRE 1.2, so you don't have to upgrade on my behalf.



HOW DOES wxpRelay WORK?
-----------------------


wxpRelay is comprised of three parts:
1. the HttpServer, which runs on the server PC
2. the ControlServer, which runs on the server PC
3. the client, which runs on the cam/client PC

These roles are described as follows:
- the HttpServer takes incoming requests from the internet when Joe Schmoe says 
"gimme your video feed" by using his browser (Internet Explorer, Firefix, etc), 
and gives back a series of JPGs that create video. This is pretty much exactly 
the same thing that webCamXP PRO's web-server does. By default the HttpServer 
runs on port 8080 (just like webCamXP PRO's web-server does), but you can change 
this (read on)
- the ControlServer receives the stream of JPGs directly from the client, and 
brokers them to the HttpServer. As mentioned earlier, there's only ever one 
stream of video going from the client to the ControlServer
- the client sits on the cam PC, repeatedly grabbing pictures from webCamXP-PRO's 
internal server, and sending them to the ControlServer.

Now for some nitty gritty details; let's talk about a request for video from the
internet and how things happen.

First, even before the request, the server and client get started up. When the 
server starts, it starts the ControlServer and HttpServer, each listening on a 
separate port. The HttpServer will take an incoming HTTP request, and give back
a JPG: if the client hasn't connected yet then it'll send the offline jpg; if
the client is connected it'll first send the loading jpg and then start sending 
live jpgs. It does this by telling the ControlServer that someone is requesting
video, so the ControlServer tells the client to start sending jpgs. Since there's
no way with HTTP to know when people have stopped requesting video, there's a 
timer that goes off every 5 seconds; if it detects that no one has requested a jpg
in that time it sets the state as unrequested, which means that the ControlServer
drops the connection to the client. The client will immediately reconnect.

If at any point something goes wrong (say the cam PC is a laptop and loses WiFi
connectivity), then the ControlServer goes back to waiting for a connection, and
the client tries to initiate an outgoing connection to the ControlServer every 
60 seconds.




LIMITATIONS
-----------


The HttpServer is not a real HTTP server. It only sends jpgs, it doesn't actually
understand the HTTP protocol -- it doesn't even bother understanding the HTTP text
that a web-browser sends it.

You have to use wxpRelay with a webcam program that has its own HTTP server built-in,
and serves up jpgs (not some other kind of video like MPEG video or whatever). I 
use webcamXP-PRO, a fantastic program you can try/buy from http://www.webcamxp.com

No sound - wxpRelay doesn't do audio of any sort. Maybe in a later version if enough
people request it.



HOW TO RUN / USE
----------------

PART A: GETTING JAVA

First, if you don't hava Java, get Sun's implementation of Java. A quick explanation
of terms that Sun uses:
	- J2SE - the Java 2 Standard Edition, which is what you want. Ignore the '2'.
	- JRE - Java Runtime Environment - A distribution of the J2SE, this is what 
you want if you're running compiled java code, not compiling your own. So, if you're 
just using wxpRelay but not making any changes to the .java files, then this is the 
one for you.
	- JDK - Java Development Kit - A distribution of the J2SE, this is what you 
want if you're compiling any java code, like changing wxpRelay's .java files. Note 
that the JDK contains the JRE so you don't need both.

So, go grab the newest version of the JRE or JDK as you see fit, which are free from 
http://java.sun.com . Install it as per Sun's instructions, and then make sure it's
in the path; to test this start a command prompt in Windows or a shell in Linux, and
type "java". If you get java's cmd-line options, you have it in the path. Note that 
versions before 1.5 (aka 5.0) of Java didn't add themselves to the path, but it seems
like 1.5 (aka 5.) does, nice.


PART B: RUNNING wxpRelay

**IMPORTANT: READ THIS BEFORE ATTEMPTING TO RUN wxpRelay!**
There are two ways to run wxpRelay: from the cmd-line, or as a Windows service. The
latter is accomplished by using "Wrapper", an open-source program found here:
http://wrapper.tanukisoftware.org

I have spent painstaking hours setting up wrapper for you. Granted it should have 
been easy but I made a stupid mistake and it took ages to figure out how to configure
it properly :) Needless to say, it's all done for you. So, here's how you do either:

1) RUNNING wxpRelay FROM THE CMD-LINE

I'm guessing that the majority of you aren't familiar with Java, so i've created
batch and shell files you can run. You absolutely must run them from the directory
they are in (this must be their "start dir"), and they assume that the executable 
"java" is in the path.

If you're in Windows you can type either:

CMD-LINE: STARTING THE CLIENT

startClient.bat myhost.dyndns.org 8071 true localhost:8080
... where:
	myhost.dyndns.org is the IP of the Server (computer w/ Control+HtppServers)
	8071 is the ControlServer port (chosen when you start the Server)
	true is the debugging level, either "true" or "false"; false will report only
		errors and serious things that go wrong, true gives enough to debug
	localhost:8080 is the IP and port (must be in IP:port form) of the webCamXP 
		or other JPG-serving webcam HTTP server. Note that you could have this
		residing on a machine other than where the Client runs, but I don't 
		see why you'd want to do this.

CMD-LINE: STARTING THE SERVER (ControlServer, HttpServer, all Server components)

startServer.bat 8070 8071 true
... where:
	8070 is the port the HttpServer listens on, ie. where you're going to direct
		incoming requests from the internet to (you are choosing it here)
	8071 is the ControlServer port (you are choosing it here)
	true is the debugging level, as explained above

If you're in Linux (java must still be in the path!), then the commands are exactly the
same, except replace .bat with .sh

By default the output of wxpRelay is to standard output (stdout); if you want this to
go to a file "wxpOutput.txt", overwrite Logger.java with Logger.java.toFile and re-
compile.


2) USING WRAPPER TO RUN wxpRelay AS A WINDOWS SERVICE

** If you use this, please consider a donation to the Wrapper project! See
   http://wrapper.tanukisoftware.org for details.

Note that this probably requires Windows NT/2000/XP/2003 or newer.
I recommend you get things working from the cmd-line first! Then try the service...

- First you have to configure the settings properly. Go into the conf/ directory, and 
you'll find two files, one obviously for the server, the other for the client. Open
the appropriate one in a text-editor, and find the clearly spaced section that has 
# wxpRelay users ... 
... as the comment. You need to set the options here; they are exactly the same as
the options when you run wxpRelay from the cmd-line, so refer above to see what all
the parameters are/do.

- Next you need to install the service itself. Go into the bin/ directory and execute
the appropriate Install-wxpRelay-service-* batch file. That'll make your service.

- Now you can try starting the service. In Windows XP (and possibly 2k?) go start, 
run, and type in "services.msc". Up pops the services window. Start up the service
you've just installed, which will be wxpRelay(client or server).

The output is going to logs/wrapper.log ! If things start going wrong, that's where
to look.

An important note: should you want to change the files in conf/ and you've already 
installed the service(s), it is VITAL that you uninstall the service(s) first BEFORE
modifying the conf files! To do this, use the Uninstall-wxpRelay-service-* batch files.
After you've uninstalled the service(s) you can modify the conf/ files, and reinstall
if desired.

Don't pester me with wxpRelay-running-as-a-windows-service problems, it'll be a 
Wrapper related issue. You can check their website for help (address above).


PART C: TRYING IT OUT!

So you've got the client hooked up with webcamXP on one computer and the server running
on another, and you want to try it out? I've included a modified version of an HTML file
that webcamXP comes with, which you can use as a starting point. It's in the resources/
directory and it's called wxpRelaySampleHTML.html, and you need to change one thing in it.
Change the localhost:8070 part on this line:
	var wxpHost = "http://localhost:8070/";
... to reflect the Server IP:port of the machine the Server is running on. Then, try 
loading this up in your browser, from any machine you want. If everything works you should
see some jpg-video ! If not take a look at the output from the Client and Server, and see
if you can spot anything you missed.

You can use the jpg stream any way you see fit. One way (like the sample html talked about
above) has an HTML file repeatedly pulling jpg data, another would be to write your own 
front-end that uses HTTP to grab the jpgs whenever you need; this method is simpler than
it sounds, because the HttpServer isn't actually doing real HTTP, it's sending the same
jpg response every time (see limitations section for more details). Experiment!




CONFIGURABLE THINGS (COMPILE-TIME SETTINGS)
-------------------------------------------


There are a few things that are configurable other than the options taken as runtime
parameters (see how to run section). They are broken up into the files they are found
in. Note that if you change any of 'em, you've gotta recompile (out of scope of this 
document)

ControlServer.java:
    public final static long CAM_TIMEOUT_MILLIS = 5000;
This is the timeout in milliseconds after the last person requests a jpg from the
HttpServer that the system drops the connection to the client (stops receiving jpgs)

    public final static int KEEPALIVE_TIMEOUT = 5;
The number of seconds until a keepalive packet is sent from the ControlServer to the
client, to make sure the connection isn't dropped

    public final static int MAX_JPG_SIZE = 20000;
This is the largest size jpg that the system will deal with. There is about 1k of 
overhead, so add 1k to what you'd put here. My webcam using webcamXP-PRO takes jpgs
that are about 10k or less in size, so 20k is a safe setting. The only benefit of 
setting this as low as possible is a slight memory efficiency (only 3 or 4 times this
amount are ever allocated simultaneously).

Messages.java:
    public static final int BUFFER_SIZE = 1024;
This is the amount of data that's sent in a single TCP packet from the client to 
the ControlServer or from the HttpServer to someone's browser.

ClientMain.java:
    public static final int RANDOM_SEED = 12745;
A seed for the random number generator, no need to change this

    public static final int ERROR_THRESHOLD = 10;
The number of socket recv/send errors before dropping the connection

By default the output of wxpRelay is to standard output (stdout); if you want this to
go to a file "wxpOutput.txt", overwrite Logger.java with Logger.java.toFile and re-
compile.


DONATIONS
---------

If you find this software useful, feel free to make a donation to help me pay off
my student loans. If you're a student, I forbid you from doing so :) Any size 
donation is welcome and appreciated!

You can donate to me using PayPal, my email/userid is cygnusx__1@hotmail.com (note
the double-underscore). Or, you can find a link to do so directly from my website
on the USB keyfob page: http://fuzzymunchkin.dyndns.org/tdot/usbkeyfob/index.php3

Thanks!



TROUBLESHOOTING
---------------


Q: On Windows, why do I get "Address already in use: connect" and/or 
"received was <=0 (end of stream) in receiveString()" ?

A: Because you are probably using the program on a LAN, and getting very fast
speeds; this uses ports faster than Windows can handle. Windows will be using
ephemeral ports (temp ones) between 1024-5000, and those ports have a default
timeout after they are closed of 4 minutes; therefore if you exhaust those ~4k 
ports in < 4 minutes (very easy, I do so on my Windows machine in <1min!) then 
you start getting these errors. The solution, if necessary for further testing 
on the LAN, is to either change what constitutes an ephemeral port, or making 
the timeout shorter. For testing purposes I set the timeout on my Windows XP 
computer to 30 seconds, and this problem was fixed. You can find out how to 
do those things here:

http://support.microsoft.com/default.aspx?scid=kb;EN-US;196271
http://support.microsoft.com/kb/149532/EN-US/


Q: I get the same picture again and again / the video isn't changing
A: Probably because webcamXP has gone wrong. Ensure that your cam is properly
connected to webcamXP; try restarting webcamXP. For example, disconnecting your
cam and reconnecting it will cause this to happen on my version of webcamXP


Q: Help ! It just doesn't work for me !
A: You can try emailing me. Remember to include all the relevant info, such as 
version of webcamXP or other program, the logs of wxpRelay (have it write to
wxpOutput.txt and send me that), the detailed explanation of what you think should
happen that doesn't, or what is happening that shouldn't, etc. My address is
rush2112 at gmail DDDDOT com.


Hey, I actually like/use this software!

Excellent! Please do as many of the following as you wish:




Take a look at my main website, fuzzymunchkin.com

Hosting provided by the generous and venerable SourceForge:
SourceForge.net Logo