RickB
November 8th 03, 08:44 PM
I just got a TrackerPod with the newest 4.13 software. It's a great idea,
but the software implementation is horrible, and the documentation is worse.
For those unfamiliar with the TrackerPod, it is basically a robotic tripod
that plugs into a USB port. It comes with software to control the
trackerpod itself, as well as any Webcam that you want to mount on it.
However, there are multiple deficiencies:
1) The TrackerPod has it's own embedded Web server on the default port of
8090. This by itself is not bad. If you control your own firewall you can
open up port 8090 and access from the Web. The problem is their idea of
"security". The Java applets send user ids and passwords in clear text, and
the embedded Web server doesn't support SSL. So anyone viewing packets
along the route can get your user id and password. At the end of this
message is the captured packet. The user id is "webuser" and the password
is "mypassword". Also, there is no way to tell how secure the embedded Web
server itself is, since it is not well known and has never been evaluated.
2) #1 would not be an issue if you could host the pages in your existing web
server, since you could then enable permissions on the directories and
enable SSL to encrypt the packets. I installed PHP (most of the
TrackerPod's pages use PHP) and created a virtual directory to point to the
TrackerPods root web directory. All the pages ran fine, but none of the
configured user credentials can be found, so you can't log in. I found the
user password file, but there is no documentation to tell you how the
location of that file relates to your Web root. I suspect that the
TrackerPod binary just knows where it is and loads it, separate from the
backend PHP stuff.
3) So I decided to create a small backend program to access the trackerpod
myself. This seems silly since the TrackerPod comes with everything I need,
albeit without any way to run it securely. There is a (poorly written) MFC
C++ program and a Visual Basic program. The C++ program allows you to enter
the IP address of the TrackerPod machine as well as a user id and password,
but this seems dubious, since it will only work on the machine running the
TrackerPod with "localhost" as the address. The command strings are not
documented anywhere. You have to debug through the program and see what
strings are being created for each command. The Visual Basic program is
better (maybe because it wasn't written by the TrackerPod people) but you
still have to eyball the source code to determine the command structure.
Come on guys, we're talking about maybe 20 lines of documentation here.
Surely you could provide it explicitly.
4) Even the TrackerPod binary is needlessly obtuse. Yes, you can figure it
out. But it completely ignores the notion of "progressive discoverability".
In other words, it is just as difficult to figure out how to perform a
common action as it is one that you will do only once or twice. It is
poorly organized. executed, and scattered about.
My conclusion is that the TrackerPod software is useless across the Internet
unless you are completely unconcerned about security, and needlessly
diffcult to use locally. Having said that, the hardware is inexpensive and
does what it says, as advertised. For my use, I will have to write a Web
front end with a backend that communicates with the TrackerPod via a TCP
connection simply to control pan and tilt. That seems liek I have to do an
awful lot to get basic functionality safely over the Internet. This is due
to the architectural choices made by the TrackerPod development team. If
they has simply provided a way for their applets to access their access
control list, or provided a way to deactivate user/password control and turn
off thier embedded Web server, I could simply place thier Web directory
structure under an existing Web server and been done with it.
Following is the packet capture showing the clear text user id (webuser) and
password (mypassword):
Frame: Base frame properties
Frame: Time of capture = 11/8/2003 15:15:3.929
Frame: Time delta from previous physical frame: 0 microseconds
Frame: Frame number: 92
Frame: Total frame length: 292 bytes
Frame: Capture frame length: 292 bytes
Frame: Frame data: Number of data bytes remaining = 292 (0x0124)
ETHERNET: ETYPE = 0x0800 : Protocol = IP: DOD Internet Protocol
ETHERNET: Destination address : 000102998208
ETHERNET: .......0 = Individual address
ETHERNET: ......0. = Universally administered address
ETHERNET: Source address : 00304870155B
ETHERNET: .......0 = No routing information present
ETHERNET: ......0. = Universally administered address
ETHERNET: Frame Length : 292 (0x0124)
ETHERNET: Ethernet Type : 0x0800 (IP: DOD Internet Protocol)
ETHERNET: Ethernet Data: Number of data bytes remaining = 278 (0x0116)
IP: ID = 0x85C4; Proto = TCP; Len: 278
IP: Version = 4 (0x4)
IP: Header Length = 20 (0x14)
IP: Precedence = Routine
IP: Type of Service = Normal Service
IP: Total Length = 278 (0x116)
IP: Identification = 34244 (0x85C4)
IP: Flags Summary = 2 (0x2)
IP: .......0 = Last fragment in datagram
IP: ......1. = Cannot fragment datagram
IP: Fragment Offset = 0 (0x0) bytes
IP: Time to Live = 128 (0x80)
IP: Protocol = TCP - Transmission Control
IP: Checksum = 0xF145
IP: Source Address = 192.168.0.251
IP: Destination Address = 192.168.0.140
IP: Data: Number of data bytes remaining = 258 (0x0102)
TCP: .AP..., len: 238, seq: 326580888-326581126, ack:3821987721, win:14060,
src: 2498 dst: 8090
TCP: Source Port = 0x09C2
TCP: Destination Port = 0x1F9A
TCP: Sequence Number = 326580888 (0x13773A98)
TCP: Acknowledgement Number = 3821987721 (0xE3CEE789)
TCP: Data Offset = 20 (0x14)
TCP: Reserved = 0 (0x0000)
TCP: Flags = 0x18 : .AP...
TCP: ..0..... = No urgent data
TCP: ...1.... = Acknowledgement field significant
TCP: ....1... = Push function
TCP: .....0.. = No Reset
TCP: ......0. = No Synchronize
TCP: .......0 = No Fin
TCP: Window = 14060 (0x36EC)
TCP: Checksum = 0x2A50
TCP: Urgent Pointer = 0 (0x0)
TCP: Data: Number of data bytes remaining = 238 (0x00EE)
00000: 00 01 02 99 82 08 00 30 48 70 15 5B 08 00 45 00 ...??..0Hp.[..E.
00010: 01 16 85 C4 40 00 80 06 F1 45 C0 A8 00 FB C0 A8 ..?Ä@.?.ñEÀ¨.ûÀ¨
00020: 00 8C 09 C2 1F 9A 13 77 3A 98 E3 CE E7 89 50 18 .?.Â.?.w:?ãÎç?P.
00030: 36 EC 2A 50 00 00 50 4F 53 54 20 2F 6C 6F 67 69 6ì*P..POST /logi
00040: 6E 2E 70 68 70 33 20 48 54 54 50 2F 31 2E 30 0D n.php3 HTTP/1.0.
00050: 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 54 72 61 .User-Agent: Tra
00060: 63 6B 65 72 43 61 6D 48 74 74 70 2F 31 2E 30 0D ckerCamHttp/1.0.
00070: 0A 41 63 63 65 70 74 3A 20 77 77 77 2F 73 6F 75 .Accept: www/sou
00080: 72 63 65 3B 20 74 65 78 74 2F 68 74 6D 6C 3B 20 rce; text/html;
00090: 69 6D 61 67 65 2F 67 69 66 3B 20 2A 2F 2A 0D 0A image/gif; */*..
000A0: 43 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 61 70 70 Content-type:app
000B0: 6C 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 lication/x-www-f
000C0: 6F 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0D 0A orm-urlencoded..
000D0: 43 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 Content-length:
000E0: 36 30 0D 0A 0D 0A 77 68 69 63 68 62 75 74 74 6F 60....whichbutto
000F0: 6E 3D 52 65 6D 6F 74 65 43 6F 6E 74 72 6F 6C 26 n=RemoteControl&
00100: 75 73 65 72 49 44 3D 77 65 62 75 73 65 72 26 70 userID=webuser&p
00110: 61 73 73 77 6F 72 64 3D 6D 79 70 61 73 73 77 6F assword=mypasswo
00120: 72 64 0D 0A rd..
but the software implementation is horrible, and the documentation is worse.
For those unfamiliar with the TrackerPod, it is basically a robotic tripod
that plugs into a USB port. It comes with software to control the
trackerpod itself, as well as any Webcam that you want to mount on it.
However, there are multiple deficiencies:
1) The TrackerPod has it's own embedded Web server on the default port of
8090. This by itself is not bad. If you control your own firewall you can
open up port 8090 and access from the Web. The problem is their idea of
"security". The Java applets send user ids and passwords in clear text, and
the embedded Web server doesn't support SSL. So anyone viewing packets
along the route can get your user id and password. At the end of this
message is the captured packet. The user id is "webuser" and the password
is "mypassword". Also, there is no way to tell how secure the embedded Web
server itself is, since it is not well known and has never been evaluated.
2) #1 would not be an issue if you could host the pages in your existing web
server, since you could then enable permissions on the directories and
enable SSL to encrypt the packets. I installed PHP (most of the
TrackerPod's pages use PHP) and created a virtual directory to point to the
TrackerPods root web directory. All the pages ran fine, but none of the
configured user credentials can be found, so you can't log in. I found the
user password file, but there is no documentation to tell you how the
location of that file relates to your Web root. I suspect that the
TrackerPod binary just knows where it is and loads it, separate from the
backend PHP stuff.
3) So I decided to create a small backend program to access the trackerpod
myself. This seems silly since the TrackerPod comes with everything I need,
albeit without any way to run it securely. There is a (poorly written) MFC
C++ program and a Visual Basic program. The C++ program allows you to enter
the IP address of the TrackerPod machine as well as a user id and password,
but this seems dubious, since it will only work on the machine running the
TrackerPod with "localhost" as the address. The command strings are not
documented anywhere. You have to debug through the program and see what
strings are being created for each command. The Visual Basic program is
better (maybe because it wasn't written by the TrackerPod people) but you
still have to eyball the source code to determine the command structure.
Come on guys, we're talking about maybe 20 lines of documentation here.
Surely you could provide it explicitly.
4) Even the TrackerPod binary is needlessly obtuse. Yes, you can figure it
out. But it completely ignores the notion of "progressive discoverability".
In other words, it is just as difficult to figure out how to perform a
common action as it is one that you will do only once or twice. It is
poorly organized. executed, and scattered about.
My conclusion is that the TrackerPod software is useless across the Internet
unless you are completely unconcerned about security, and needlessly
diffcult to use locally. Having said that, the hardware is inexpensive and
does what it says, as advertised. For my use, I will have to write a Web
front end with a backend that communicates with the TrackerPod via a TCP
connection simply to control pan and tilt. That seems liek I have to do an
awful lot to get basic functionality safely over the Internet. This is due
to the architectural choices made by the TrackerPod development team. If
they has simply provided a way for their applets to access their access
control list, or provided a way to deactivate user/password control and turn
off thier embedded Web server, I could simply place thier Web directory
structure under an existing Web server and been done with it.
Following is the packet capture showing the clear text user id (webuser) and
password (mypassword):
Frame: Base frame properties
Frame: Time of capture = 11/8/2003 15:15:3.929
Frame: Time delta from previous physical frame: 0 microseconds
Frame: Frame number: 92
Frame: Total frame length: 292 bytes
Frame: Capture frame length: 292 bytes
Frame: Frame data: Number of data bytes remaining = 292 (0x0124)
ETHERNET: ETYPE = 0x0800 : Protocol = IP: DOD Internet Protocol
ETHERNET: Destination address : 000102998208
ETHERNET: .......0 = Individual address
ETHERNET: ......0. = Universally administered address
ETHERNET: Source address : 00304870155B
ETHERNET: .......0 = No routing information present
ETHERNET: ......0. = Universally administered address
ETHERNET: Frame Length : 292 (0x0124)
ETHERNET: Ethernet Type : 0x0800 (IP: DOD Internet Protocol)
ETHERNET: Ethernet Data: Number of data bytes remaining = 278 (0x0116)
IP: ID = 0x85C4; Proto = TCP; Len: 278
IP: Version = 4 (0x4)
IP: Header Length = 20 (0x14)
IP: Precedence = Routine
IP: Type of Service = Normal Service
IP: Total Length = 278 (0x116)
IP: Identification = 34244 (0x85C4)
IP: Flags Summary = 2 (0x2)
IP: .......0 = Last fragment in datagram
IP: ......1. = Cannot fragment datagram
IP: Fragment Offset = 0 (0x0) bytes
IP: Time to Live = 128 (0x80)
IP: Protocol = TCP - Transmission Control
IP: Checksum = 0xF145
IP: Source Address = 192.168.0.251
IP: Destination Address = 192.168.0.140
IP: Data: Number of data bytes remaining = 258 (0x0102)
TCP: .AP..., len: 238, seq: 326580888-326581126, ack:3821987721, win:14060,
src: 2498 dst: 8090
TCP: Source Port = 0x09C2
TCP: Destination Port = 0x1F9A
TCP: Sequence Number = 326580888 (0x13773A98)
TCP: Acknowledgement Number = 3821987721 (0xE3CEE789)
TCP: Data Offset = 20 (0x14)
TCP: Reserved = 0 (0x0000)
TCP: Flags = 0x18 : .AP...
TCP: ..0..... = No urgent data
TCP: ...1.... = Acknowledgement field significant
TCP: ....1... = Push function
TCP: .....0.. = No Reset
TCP: ......0. = No Synchronize
TCP: .......0 = No Fin
TCP: Window = 14060 (0x36EC)
TCP: Checksum = 0x2A50
TCP: Urgent Pointer = 0 (0x0)
TCP: Data: Number of data bytes remaining = 238 (0x00EE)
00000: 00 01 02 99 82 08 00 30 48 70 15 5B 08 00 45 00 ...??..0Hp.[..E.
00010: 01 16 85 C4 40 00 80 06 F1 45 C0 A8 00 FB C0 A8 ..?Ä@.?.ñEÀ¨.ûÀ¨
00020: 00 8C 09 C2 1F 9A 13 77 3A 98 E3 CE E7 89 50 18 .?.Â.?.w:?ãÎç?P.
00030: 36 EC 2A 50 00 00 50 4F 53 54 20 2F 6C 6F 67 69 6ì*P..POST /logi
00040: 6E 2E 70 68 70 33 20 48 54 54 50 2F 31 2E 30 0D n.php3 HTTP/1.0.
00050: 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 54 72 61 .User-Agent: Tra
00060: 63 6B 65 72 43 61 6D 48 74 74 70 2F 31 2E 30 0D ckerCamHttp/1.0.
00070: 0A 41 63 63 65 70 74 3A 20 77 77 77 2F 73 6F 75 .Accept: www/sou
00080: 72 63 65 3B 20 74 65 78 74 2F 68 74 6D 6C 3B 20 rce; text/html;
00090: 69 6D 61 67 65 2F 67 69 66 3B 20 2A 2F 2A 0D 0A image/gif; */*..
000A0: 43 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 61 70 70 Content-type:app
000B0: 6C 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 lication/x-www-f
000C0: 6F 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0D 0A orm-urlencoded..
000D0: 43 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 Content-length:
000E0: 36 30 0D 0A 0D 0A 77 68 69 63 68 62 75 74 74 6F 60....whichbutto
000F0: 6E 3D 52 65 6D 6F 74 65 43 6F 6E 74 72 6F 6C 26 n=RemoteControl&
00100: 75 73 65 72 49 44 3D 77 65 62 75 73 65 72 26 70 userID=webuser&p
00110: 61 73 73 77 6F 72 64 3D 6D 79 70 61 73 73 77 6F assword=mypasswo
00120: 72 64 0D 0A rd..