Es posible construir un sistema que le permita controlar las clavijas del puerto paralelo a través de la red. Para hacer esto, necesita las siguientes partes en su sistema Linux:
Un servidor Web:
- Apache es el más usado, pero también se puede usar Boa.
- Las páginas Web de control de la interfaz (estas tiene que hacerlas usted mismo, posiblemente algunos formularios con botones de control)
- Un script CGI-BIN de control de puertos paralelos (tiene que escribirlo usted mismo)
- Un programa de control que controle los puertos paralelos (el programa Linux de control descrito más arriba sirve para este uso)
1. Los usuarios descargan una página Web de donde se encuentra la página Web (el navegador lo hace automáticamente con la dirección Web que se le da)
2. El navegador del usuario muestra la página descargada que tiene el control necesario (formularios, botones, etc.)
3. El usuario presiona el botón de control o el botón enviar de un formulario
4. La operación del usuario en el paso 3 provoca que el navegador envíe la información (que se ha pulsado la tecla o los datos que contiene el formulario) a la dirección Web donde este botón/formulario se encuentra (puede ser el mismo servidor u otro que el que se encuentra el formulario)
5. Un servidor Web en la dirección dada recibe los datos del navegador del usuario, comprueba que sean correctos y los envía con algún tipo de comando al hardware para llevar a cabo lo que sea requerido (esto podría ser una llamada al driver del hardware o señalando a alguna otra aplicación corriendo en algún sitio accesible por servidor Web)
La Web basada en la construcción de la interfaz se puede dividir en dos partes bien diferenciadas: la parte de la interfaz Web (obtener el formulario usado con la información de control al ordenador) y el control del hardware en sí mismo.
La primera parte incluirá el servidor Web, el control de las páginas Web y los scripts necesarios para recuperar los controles del usuario. Hay una gran selección de lenguajes de scripting que se pueden usar. Los más atractivos para este uso podrán ser Perl, PHP y UNIX Shell script (bash).
Todos estos se pueden usar para leer los controles del usuario. La segunda parte normalmente requiere ser escrita en el lenguaje C, porque la mayoría de lenguajes de scripting carecen de las opciones necesarias para el control directo de hardware.
Para esto el lenguaje C es generalmente la mejor opción. La idea es que el control de hardware de nivel bajo se hace con un programa C simple y después el script (en la parte 1) envía los controles a este programa C de alguna forma (en el caso más simple, ejecuta este programa C con los argumentos de línea de comandos correctos cada vez que el hardware necesita ser controlado).
Ejemplo simple de control CGI-BIN
En este ejemplo la idea es que usted hace una página Web que tiene los botones de control con los controles que usted quiere hacer. Los botones de control se establecen de forma que al presionarlos, el navegador del usuario envía el contenido del formulario a un script CGI-BIN. Esta llamada provoca que el servidor Web ejecute el script CGI-BIN especificado. El script CGI-BIN está escrito para llevar a cabo el control necesario, normalmente llamando al programa de control de puertos paralelos con los parámetros correctos.
Esta es la idea básica sobre cómo hacerlo.
Aquí hay un ejemplo simple de una aplicación de control Web. Haga lo siguiente para hacerla funcionar:
1. Asegúrese que su sistema está ejecutando un servidor Web Apache.
La mayoría de las distribuciones Linux modernas ya vienen con este software de servidor Web. Asegúrese que tiene instalado Apache. Los pasos siguientes requieren que usted está corriendo un sistema Linux con un servidor Apache correctamente configurado (la configuración por defecto de Red Hat 7.2 es válida).
Considero que las páginas relacionadas al material que estamos tratando se encuentran en el directorio /var/www/ (este es el caso típico en los sistemas Linux Red Hat, en otras distribuciones esta ruta puede ser diferente, cambie los ejemplos como sea necesario si este es su caso).
Asegúrese que su servidor Web se está ejecutando. Si no lo está, lo puede iniciar con el siguiente comando (en la mayoría de sistemas necesitará ser root para hacer esto):
Código: Seleccionar todo
/sbin/service httpd start
2. Compile el código fuente
Compile el código fuente lptout.c al programa binario lptout, copie el programa a su directorio /usr/sbin/ y establezca los derechos necesarios para que siempre se ejecute como root. Puede hacer esto identificándose como root y ejecutando los comandos siguientes:
Código: Seleccionar todo
gcc -O lptout.c -o lptout.c
cp lptout /usr/sbin/lptout
chmod +s /usr/sbin/lptout
Código: Seleccionar todo
/usr/sbin/lptout 0xff
Código: Seleccionar todo
/usr/sbin/lptout 0xff
3. Instale los scripts CGI para el control de los puertos paralelos.
Los scripts requeridos son lpton.cgi y lptoff.cgi
Código fuente lpton.cgi
Código: Seleccionar todo
#!/bin/sh
# Parallel port CGI script
#
# Send HTTP headers
echo Content-type: text/html;charset=ISO-8859
echo
# Do the controlling
/usr/sbin/lptout 0xff
# Output web page data
echo "<html><head></head><body>"
echo "Parallel port controlled<br>"
echo "<a href=\"/lpt/index.html\">Go back to controlling page</a>"
echo "</body></html>"
#
Código fuente lptoff.cgi
Código: Seleccionar todo
#!/bin/sh
# Parallel port CGI script
#
# Send HTTP headers
echo Content-type: text/html;charset=ISO-8859
echo
# Do the controlling
/usr/sbin/lptout 0x00
# Output web page data
echo "<html><head></head><body>"
echo "Parallel port controlled<br>"
echo "<a href=\"/lpt/index.html\">Go back to controlling page</a>"
echo "</body></html>"
#
A continuación, copie estos archivos al directorio CGI-BIN de su servidor Web y dé los los permisos de ejecución necesarios. Identifáquese como root y ejecute los comandos siguientes en el directorio donde haya guardado lpton.cgi y lptoff.cgi:
Código: Seleccionar todo
cp lpton.cgi /var/www/cgi-bin/lpton.cgi
cp lptoff.cgi /var/www/cgi-bin/lptoff.cgi
chmod go+rx /var/www/cgi-bin/lpton.cgi
chmod go+rx /var/www/cgi-bin/lptoff.cgi
Código: Seleccionar todo
http://elnombredesuservidor/lpt/index.html
Código: Seleccionar todo
<html>
<head>
<title>Parallel port controlling test page</title>
</head>
<body>
<h1>Parallel port controlling test page</h1>
<p>
<form action="/cgi-bin/lpton.cgi" method="get" name="on">
<input type=submit value="Set all data pins high">
</form>
<p>
<form action="/cgi-bin/lptoff.cgi" method="get" name="off">
<input type=submit value="Set all data pins low">
</form>
<p>
</body>
</html>
Código: Seleccionar todo
cd /var/www/html/
mkdir lpt
chmod go+rx lpt
Código: Seleccionar todo
cp index.html /var/www/html/lpt/index.html
chmod go+r /var/www/html/lpt/index.html
Dirija su navegador Web a la dirección
Código: Seleccionar todo
http://elnombredesuservidor/lpt/index.html
6. Pruebe a hacer clic en los botones de control
Pruebe a hacer clic en los botones de control y compruebe que las clavijas de salida del puerto paralelo cambian de estado como indican los botones.
Puede encontrar todos los archivos necesarios para este proyecto Web simple en un archivo tar llamado weblpt.tar. Simplemente descárguelo en su sistema Linux y descomprímalo a un directorio adecuado con el comando
Código: Seleccionar todo
tar xvf weblpt.tar
NOTA:
Esto es un ejemplo simple de control de puertos paralelos por la Web. Este ejemplo probablemente no sea la forma más conveniente o eficiente de hacer el control, pero ha funcionado para mí. Al hacer electrónica que será controlada a través de la Web, siempre hay que tener en cuenta la seguridad de la información relacionada, eso significa que hay que asegurarse que solo las personas que deberán pueden hacer el control y que nadie puede piratear fácilmente el sistema.
Este método tiene riesgos potenciales de seguridad porque el programa lptout siempre se ejecuta con privilegios de root (si alguien consigue hacerlo colgarse de alguna manera, puede causar problemas potenciales de seguridad). Para hacer todos los pasos mencionados en este documento necesita estar identificado como root en el sistema. Cuando uno está identificado como root puede hacer mucho daño a su sistema si comete errores estúpidos.
Control de puertos paralelos usando PHP
Aquí hay otro ejemplo de código fuente para el control de puertos paralelos. Este se me envió por Andrew Nickson para que lo incluyera en esta página Web. Se trata de un script php que permite la escritura de data en cualquier puerto paralelo. Requiere tener un servir Web Apache y una versión decente de PHP instalada en Apache. Muchas distribuciones de Linux ya incluyen estas herramientas si las selecciona al instalar su sistema (si no, tendrá que instalarlas usted mismo).
Hay dos archivos, uno es el mismo script php y el otro los datos del formulario usados para obtener los datos de entrada del usuario. Para que este script funcione necesita tener en su ordenador el mismo programa lptout del que se ha hablado en los otros ejemplos instalado en /usr/sbin/ con los derechos necesarios para que el servidor Web lo pueda ejecutar.
Aquí puede ver el código fuente de lptout.php / parallel.php:
Código: Seleccionar todo
<?php
/* Program: lptout.php
* Desc: Toma los datos del formulario y los envía al programa de control del puerto paralelo (lptout).
* Los valores deben ser introducidos en hex (0 - ff)
* Requiere que lptout se encuentre en /usr/sbin/
*
* Por Andrew Nickson (www.re-mastered.co.uk)
*/
?>
<?php
switch (@$_GET['do'])
{
case "update":
{
echo ("<center><br>Data sent to parallel port (0x$fvalue)</br></center>");
exec ("/usr/sbin/lptout 0x$fvalue");
include("parallel.inc");
}
break;
default:
include("parallel.inc");
}
?>
Aquí puede ver el código fuente del archivo parallel.inc file usado por el código fuente anterior. Este código fuente imprime el formulario que se muestra al usuario para el control del puerto paralelo.
<?php
/* Program: Parallel.inc
* Desc: Contiene los datos del formulario para el control del puerto paralelo
* Esto llamará a parallel.php.
*
* Por Andrew Nickson 2005 (www.re-mastered.co.uk)
*/
?>
<html>
<head><title>Controlador del Puerto Paralelo</title></head>
<body topmargin="0" leftmargin="0" marginheight="0"
marginwidth="0">
<center><form action="parallel.php?do=update" method="POST">
<table border="0">
<tr><td align=right><b>Value (HEX)</b></td>
<td><input type="text" name="fvalue"
size="5" maxsize="3">
</td></tr>
<br><input type="submit" name="Update"
value="Actualizar">
</td></tr>
</table>
</body></html>
La interfaz Web del software portcontrol es una interfaz Web moderna simple para el control de puertos paralelos. Este software está basado en software PHP corriendo en un servidor Linux y una aplicación cliente JavaScript corriendo en el navegador del usuario. De esta forma es posible obtener el estado de las clavijas de datos del puerto paralelo en la pantalla prácticamente a tiempo real y de forma bonita y flexible y fácil de controlar.
Por el lado del servidor encontramos un software de portcontrol constituido por unas pocas líneas de PHP. Portcontrol es un programa simple de control de puertos de entrada/salida para Linux de uso general. Este programa permite escribir y leer los puertos de entrada/salida suportados. Este programa permite escribir el valor especificado al puerto, leer un valor a una dirección entrada/salida dada e imprimirlo a la pantalla en diferentes formatos y la manipulación de los datos del puerto a nivel de bit.
El archivo control.php es el que se encarga de la magia del control del puerto. Una vez cargado, el usuario obtiene una página Web y código JavaScript user end. Este código JavaScript pregunta periódicamente (una vez cada 5 segundos) el estado del puerto paralelo al servidor (llamada AJAX) y si este ha cambiado actualiza la pantalla. También gestiona los botones de control. Cada clic sobre un botón de control hace que el software de control llame al servidor para llevar a cabo la función deseada (llamada AJAX). Cuando el control se ha llevado a cabo, el servidor devuelve el estado actual del puerto (es impreso en la pantalla).
Cuando el software de control esta escrito de esta forma, funciona bastante bien y se siente prácticamente como si fuera una aplicación que esta controlando los puertos paralelos directamente (a diferencia de la típica aplicación Web que requiere recargar la página cada vez que hace algo).
A parte del propio script de control PHP, también he escrito otra versión del archivo control.php. Este archivo controlfile.php funciona prácticamente de la misma forma, pero en vez de controlar el puerto paralelo, escribe y lee el estado de un archivo (status.txt en el mismo directorio que se encuentra el script). Puede usarlo para testear fácilmente el sistema de control basado en AJAX/PHP desde cualquier parte (no requiere que el ordenador tenga un puerto paralelo real). La aplicación AJAX de testeo de control de puertos basada en un archivo se puede ver como el siguiente código fuente de aquí:
Código: Seleccionar todo
<html>
<head>
<title>Port control</title>
<script>
// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_debug_mode = false;
var sajax_request_type = "GET";
function sajax_debug(text) {
if (sajax_debug_mode)
alert("RSD: " + text)
}
function sajax_init_object() {
sajax_debug("sajax_init_object() called..")
var A;
try {
A=new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
A=new ActiveXObject("Microsoft.XMLHTTP");
} catch (oc) {
A=null;
}
}
if(!A && typeof XMLHttpRequest != "undefined")
A = new XMLHttpRequest();
if (!A)
sajax_debug("Could not create connection object.");
return A;
}
function sajax_do_call(func_name, args) {
var i, x, n;
var uri;
var post_data;
uri = "/circuits/portcontrol/controlfile.php";
if (sajax_request_type == "GET") {
if (uri.indexOf("?") == -1)
uri = uri + "?rs=" + escape(func_name);
else
uri = uri + "&rs=" + escape(func_name);
for (i = 0; i < args.length-1; i++)
uri = uri + "&rsargs[]=" + escape(args[i]);
uri = uri + "&rsrnd=" + new Date().getTime();
post_data = null;
} else {
post_data = "rs=" + escape(func_name);
for (i = 0; i < args.length-1; i++)
post_data = post_data + "&rsargs[]=" + escape(args[i]);
}
x = sajax_init_object();
x.open(sajax_request_type, uri, true);
if (sajax_request_type == "POST") {
x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
x.onreadystatechange = function() {
if (x.readyState != 4)
return;
sajax_debug("received " + x.responseText);
var status;
var data;
status = x.responseText.charAt(0);
data = x.responseText.substring(2);
if (status == "-")
alert("Error: " + data);
else
args[args.length-1](data);
}
x.send(post_data);
sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
sajax_debug(func_name + " waiting..");
delete x;
}
// wrapper for portstatus
function x_portstatus() {
sajax_do_call("portstatus",
x_portstatus.arguments);
}
// wrapper for portcontrol
function x_portcontrol() {
sajax_do_call("portcontrol",
x_portcontrol.arguments);
}
function do_portstatus_cb(z) {
// update status field in form
document.getElementById("status").value = z;
}
function do_portstatus() {
x_portstatus(do_portstatus_cb);
setTimeout('do_portstatus();',5000); // executes the next data query in every n milliseconds
}
function do_portcontrol_cb(z) {
// update status field in form
document.getElementById("status").value = z;
}
function do_portcontrol(bit,value) {
x_portcontrol(bit,value,do_portcontrol_cb);
}
</script>
</head>
<body>
<SCRIPT LANGUAGE="JavaScript">
<!--
do_portstatus();
// -->
</SCRIPT>
<P>
<H1>Port control</H1>
<P>
<input type="text" name="status" id="status" value="No status yet" size="60">
<P>
Bit 0:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(0,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(0,0); return false;">
<BR>
Bit 1:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(1,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(1,0); return false;">
<BR>
Bit 2:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(2,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(2,0); return false;">
<BR>
Bit 3:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(3,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(3,0); return false;">
<BR>
Bit 4:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(4,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(4,0); return false;">
<BR>
Bit 5:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(5,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(5,0); return false;">
<BR>
Bit 6:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(6,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(6,0); return false;">
<BR>
Bit 7:
<input type="button" name="check" value="Set"
onclick="do_portcontrol(7,1); return false;">
<input type="button" name="check" value="Reset"
onclick="do_portcontrol(7,0); return false;">
<BR>
</body>
</html>
Código: Seleccionar todo
Port control software for Linux
Version 0.3
Copyright Tomi Engdahl 1996-2005
Introduction
This software package provides access to PC computer hardware
I/O ports under Linux operating system.
This softare package is designed to run on Linux system that
runs on normal PC hardware. The software has been tested to
run nicely on Fedora Core 4 Linux distribution.
You need GCC to compile the programs.
This package provides the following tools:
lptout simple program to control LPT1 printer port data pins
portcontrol general use I/O port reading and writing application
control.php AJAX/PHP based web interface for parallel port controlling
The software are provided with no guarantee of their correctness.
Use them at your own risk.
Compiling
Run:
make install
Installing
Log in as root.
Run:
make install
The software is now installed to /usr/local/sbin/ directory
Using lptout
The user has to have the root previledges to have access to the ports
for the program to run. For this reason the the program is installed
with SUID ROOT settings, meaning that every time the program is run
it is automatically run at root previledges no matter who runs it.
This program is designed to access LPT1 parallel port at I/O address
0x378 (normal address for parallel port integrated to motherboard)
For example command
/usr/local/sbin/lptout 0xFF
will turn all data pins in LPT1 port to high state (1).
Command
/usr/local/sbin/lptout 0x00
will turn all data pins to to low state (0).
Using portcontrol
portconrol is a simple general purpose I/O port control program for
Linux. It allows you to write and read the supported I/O ports.
The software allows writing specified value to port, reading
value at given I/O address and printing it out to screen in
different formats and bit-level manipulation of the port data.
Examples
/usr/local/sbin/portcontrol LPT1DATA read setbit 1 write
Reads parallel port data, set bit D1 to 1 and writes value back
Effectively sets the LPT1 pin D1 in parallel port to logic 1
/usr/local/sbin/portcontrol LPT1DATA read resetbit
Reads parallel port data, set bit D1 to 0 and writes value back
Effectively sets the LPT1 pin D1 in parallel port to logic 0
/usr/local/sbin/portcontrol LPT1DATA setvalue 0xff write
Writes value 0xff (255 dec) to the parallel port
Effectively sets all LPT1 data pins to logic 1
/usr/local/sbin/portcontrol LPT1DATA read print bin
Reads the parallel port data pin states and prints
the results as binary numbers to the screen (standard output).
/usr/local/sbin/portcontrol LPT1DATA read print bin
Reads the parallel port data pin states and prints
the results as binary numbers to the screen (standard output).
/usr/local/sbin/portcontrol LPT1DATA read printbits 021
Reads the parallel port data pin states and prints
the states of bits D0, D2 and D1 in that order to the
screen (standard output).
Supported port identifiers
LPT1DATA LPT1 port data lines controlling (0x378)
LPT1STATUS LPT1 printer status inputs register
LPT1HANDSHAKE LPT1 handstake output controlling
JOYSTICK Joystick port reading (only reading makes sense)
Supported commands
PRINT DEC Read data, gives output as decimal number
PRINT HEX Read data, gives output as hexadecimal number
PRINT BIN Read data, gives output as binary number
PRINTBITS bits Reads the specified bits in the specified order (0..7)
WRITE Writes register value to port
READ Reads value from specified port to register
SETVALUE value Sets the given value to register
AND value Performs AND with given value and register
OR value Performs OR with given value and register
XOR value Performs XOR with given value and register
SETBITS bits Sets given bits to 1 in register
RESETBITS bits Sets given bits to 0 in register
SETBIT bits same as SETBITS
RESETBIT bits same as RESETBITS
TOGGLEBITS bits Toggles specified bit values
value can be gives as decimal number or heaxadecimal starting with 0x
bits is a list of bit position identifiers from 0 to 7
Port names are ment to be written at high case.
Commands at low case.
Using web interface
The web interface for controlling paralle port is simple
modern web based interface for controlling parallel port.
To make it you need to have the following parts in your system:
- Apache web server with PHP5 support working with it
- portcontrol software installed to the default install directory
- SAJAX Simple Ajax Toolkit by ModernMethod
- Modern web browser that supports JavaScript (IE6, Mozilla Firefox)
Installing the web interface is simple. All you need is
to copy the control.php file to a suitable place
on your web directory you want it to be copy the Sajax.php
file from the SAJAX package to the same directory where you
have the control.php.
Then just go to the URL where you have that control.php
accessable. You should see status line plus a set
of control buttons. The status bar shoudl automatically update
every 5 seconds with the parallel port status and current
time on the server computer.
Pressing the buttons will change the parallel port bit states.
Note that on some systems the PHP script might hot have
enough rights to run the portconrol software.
Check your access rights to make sure that rights are correct
(the system did not work on my Fedora Core 4 system when
I had SELinux security enabled).
SAJAX Simple Ajax Toolkit by ModernMethod can be downloaded from
http://www.modernmethod.com/sajax/
NOTE: There is an another version of the control.php file available.
This file controlfile.php work pretty much in the same way, but
instead of controlling parallel port writes and reads the status
from a file (status.txt in the same directory as the script is).
It can be used to test the AJAX/PHP based control system.
Código: Seleccionar todo
http://www.modernmethod.com/sajax/