jueves, 11 de marzo de 2010

php y los puertos

que tan lejos está php de los puertos del pc
Aparentemente, php no puede acceder directamente a los puertos del hardware del pc, lo cual prometía cambios de rumbo de un proyecto. Tal vez usando otro lenguaje de script como python, o incluso C.

bajo C, se requieren funciones especiales como ioperm() para poder usar las funciones de acceso de bajo nivel.

Pero linux ofrece un archivo de dispositivo especial /dev/port, donde están mapeados todos los puertos a los cuales es posible acceder mediante seek, luego de abrir el archivo.

El detalle es que se recomienda que se abra con funciones que no sean f*(), ya que el método no funcionará bien usando funciones de archivos con buffer. Según la documentación se prometían resultados inesperados, osea cosas como colapso del sistema, tsunamis, la crisis mundial o el armagedón anunciado para estos días.

Sospecho que php incluye funciones f*(), con buffer, versiones simplificadas a sus pares en C, pero faltaba confirmar, aun así, debía poner a prueba toda esa espectativa y temores.

Este archivo debe ser accedido como root, tal como indica la documentación y mi S.O.:

por tanto el script debe ser llamado con sudo

/*    
 *      Acceso a los puertos - clase php 2010-03-11
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *     
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *     
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

class xzyports { //100308103317
    var $handle;
   
    function __construct() {
        $this->handle = fopen('/dev/port','r+');
    }
   
    function inp($port) {
        fseek($this->handle,$port);
        return fread($this->handle,1);
    }
   
    function outp($port,$data) {
        fseek($this->handle,$port);
        fwrite($this->handle,chr($data),1);
    }
   
    function __destruct() {
        fclose($this->handle);
    }
}

al hacer pruebas, aparentemente no hubieron los problemas que se podian anticipar por el uso de funciones de e/s con bufer; el problema que podría surgir sería la temporización, ya que php no es tan veloz como un lenguaje compilado como C.

Links
Linux PC ports - phpclasses

http://tldp.org/HOWTO/IO-Port-Programming.html
http://flyingtux.blogspot.com/2009/07/devport.html

No hay comentarios:

Publicar un comentario en la entrada