"Después del juego es antes del juego"
Sepp Herberger

miércoles, 6 de mayo de 2015

OpenWrt+USBIP+Smartboard 680 (Episodio II)

Recapitulemos: ya teníamos nuestra pizarra conectada al USB del router y compartida por IP a través del servicio usbipd. Ahora nos falta un cliente que se conecte a ella.

En el caso que me ocupa, el cliente era un ordenador con Windows, asi que me bajo el fichero "usbipwindowsv0.2.0.0signed.zip" desde

http://sourceforge.net/projects/usbip/files/usbipwindows/.

Descomprimiendo el fichero vemos que su contenido es:

  • USAGE
  • usbip.exe
  • usb.ids
  • usbipenum.cat
  • USBIPEnum.inf
  • USBIPEnumx64.sys
  • USBIPEnumx86.sys

USAGE es un pequeño manual de instalación del driver usbip, mientras que usbip.exe es el programa cliente que usaremos para conectarnos al servidor usbip remoto. El resto de ficheros son el driver en si, que debemos instalar en nuestro sistema operativo para que todo funcione. Hemos dicho que dentro de USAGE está el manual de instalación, copio el contenido aquí:

To install the virtual usb bus driver on Windows XP:

1. Uncompress the downloaded binary package to a directory.
2. Double-click the 'Add Hardware' wizard in Control Panel.
3. At the 'Welcome to the Add Hardware Wizard', click 'Next'.
4. Select 'Yes, I have already connected the hardware', then click Next.
5. Select 'Add a new hardware device' from the list, then click Next.
6. Select 'Install the hardware that I manually select from a list(Advanced)', and then click next.
7. Select 'System Devices', then click Next.
8. Click 'Have Disk', click 'Browse', choose the uncompressed directory, and click OK.
9. Click on the 'USB/IP Enumerator', and then click Next.
10. At 'The wizard is ready to install your hardware', click Next.
11. Click Finish at 'Completing the Add/Remove Hardware Wizard.' 

For Window 7 :
1. (Only necessary for custom builds: For x64 allow unsigned drivers: Enter "bcdedit /set testsigning on" in an administrative cmd window)
2. Uncompress the downloaded binary package to a directory.
3. Start a the Device Manager
4. Click Any hardware node
5. Choose "Add Legacy Hardware" from the "Action" menu
6. At the 'Welcome to the Add Hardware Wizard', click 'Next'.
7. Select 'Install the hardware that I manually select from the list'
8. click 'Next'
9. Click 'Have Disk', click 'Browse', choose the uncompressed directory, and click OK.
10. Click on the 'USB/IP Enumerator', and then click Next.
11. At 'The wizard is ready to install your hardware', click Next.
12. Click Finish at 'Completing the Add/Remove Hardware Wizard.'

Básicamente la instalación consiste en meter el driver a mano como si instalásemos un dispositivo que no es plug'n'play, ya que no hay proceso de autodetección que valga. Una vez instalado el driver tenemos que reiniciar el sistema. Yo ademas copio el fichero usbip.exe a la ruta c:\windows, para tener el ejecutable accesible siempre. Cuando hemos reiniciado, podemos probar a mirar el equipo remoto abriendo una ventana de comandos y tecleando:

c:\> usbip -l 192.168.1.1

Asumimos que 192.168.1.1 es la dirección del router, que cada cual ponga la que corresponde en su caso. Esto nos dará:

usbip for windows ($Id$)

- 192.168.1.1
    1-1: unknown vendor : unknown product (0b8c:0001)
    : /sys/devices/platform/ifxusb_hcd/usb1/1-1
    : (Defined at Interface level) (00/00/00)
    :  0 - unknown class / unknown subclass / unknown protocol (03/00/00)

Como vemos, ahi está la pizarra, con su identificador 0b8c:0001. Si queremos conectarnos a ella lo mejor es hacer un pequeño script .bat que pondremos en el escritorio:

rem conectar-pizarra.bat
@echo off
c:\windows\usbip -a 192.168.1.1 1-1

Al ejecutar el script veremos que el Windows y la pizarra reaccionan como si los hubiésemos conectado el uno al otro por un cable USB directamente. En la pizarra el led pasa de rojo a verde estable, indicando que ha sido detectada e inicializada por el driver.

En el Windows veremos que aparece un nuevo dispositivo HID llamdo SMART Board en el administrador de dispositivos:

Y que en el system tray, el icono correspondiente a la pizarra Smart (el círculo blanco dentro de un recuadro azul) se activa y muestra un tooltip de aviso de que se ha detectado un dispositivo. Ni que decir tiene que previo a todo esto debemos haber instalado el software Smart Notebook con sus drivers en el Windows que estamos usando.

Con esto ya podemos trabajar con la pizarra a un porrón de metros del ordenador y conectada a través del túnel usbip como si hubiese una conexión directa: todas las pulsaciones son recibidas en el PC cliente.

Antes de acabar con esta parte, comentar un pequeño problema: una vez está conectada la pizarra, si intentamos cerrar sesión o apagar el ordenador la cosa se queda como bloqueada, sin llegar a cerrarse nunca. La causa es que antes de salir hay que desconectar la pizarra con este script de desconexión:

rem desconectar-pizarra.bat
@echo off
c:\windows\usbip -d 1

Al ejecutarlo sería como si quitásemos el cable usb, quedando la pizarra con su luz roja:

Y el PC  el icono de SmartBoard en el systray con el aspa roja:

En ese momento ya se puede cerrar sesión o apagar el PC sin problema.

En cuanto a Linux como cliente.... la historia es mas escabrosa, ya que no he podido hacer funcionar un cliente usbip. El primer problema es que hay dos versiones del paquete usbip, una en Debian Wheezy y otra en Ubuntu-Mint.

En Wheezy sería:

# apt-get install usbip
# dpkg -l | grep usbip
ii  usbip  1.1.1+3.2.17-1   i386  USB device sharing system over IP network
# usbip version
usbip (usbip-utils 1.1.1)
# usbip list -r 192.168.1.1
Exportable USB devices
======================
 - 192.168.1.1
	1-1: SMART Technologies Inc. : unknown product (0b8c:0001)
	   : /sys/devices/platform/ifxusb_hcd/usb1/1-1
	   : (Defined at Interface level) (00/00/00)
	   :  0 - Human Interface Device / No Subclass / None (03/00/00)
#

Como vemos, es la versión 1.1.1, la misma que en vimos en el Openwrt:

openwrt# opkg update
openwrt# opkg list-installed | grep usbip
kmod-usbip - 3.10.49-1
kmod-usbip-client - 3.10.49-1
kmod-usbip-server - 3.10.49-1
usbip - 1.1.1-2
usbip-client - 1.1.1-2
usbip-server - 1.1.1-2
openwrt# usbip version
usbip (usbip-utils 1.1.1)

Ahora si queremos enlazar desde Wheezy con el servidor usbip remoto haremos:

# usbip attach -h 192.168.1.1 -b 1-1
usbip: error: open vhci_driver
usbip: error: query

Hemos olvidado cargar el driver en memoria, lo haremos con:

# modprobe usbip_core vhci_hcd 
# usbip attach -h 192.168.1.1 -b 1-1
# lsusb
Bus 006 Device 002: ID 05e3:0716 Genesys Logic, Inc. USB 2.0 Multislot Card Reader/Writer
Bus 009 Device 002: ID 0b8c:0001 SMART Technologies Inc. 
#

Bueno, pues se supone que tenemos conectada a nuestro Debian la pizarra como dispositivo usb local a traves del túnel IP, pero lo cierto es que no funciona. El software y el driver de la pizarra dicen que no hay nada. Para despejar dudas probé con otros dispositivos USB: pendrives, webcams, impresoras usb, ratones y siempre tenía problemas de todo tipo, no llegando a funcionar ninguno. Por ejemplo, el pendrive decía en el syslog:

hub 9-0:1.0: Cannot enable port 1.  Maybe the USB cable is bad?"

Y no funcionaba. La webcam no llegaba a crear el dispositivo /dev/video0, y así sucesivamente. No se si estoy haciendo algo mal o es que la implementación del cliente usbip en Linux es peor que la de Windows, pero es lo que hay.

En cuanto a la versión cliente de Ubuntu/Mint, la cosa es peor:

# apt-get install usbip
# dpkg -l | grep usbip
ii  libusbip0   0.1.7-3  i386     USB device sharing system over IP network 		(shared library)
ii  usbip       0.1.7-3  i386     USB device sharing system over IP network
#  usbip -v 
usbip 0.1.7 ($Id: vhci_attach.c 42 2007-09-07 12:07:51Z hirofuchi $)

Como vemos, es una versión antiquísima que ni siquiera permite listar los dispositivos usb remotos:

# usbip -l 192.168.1.1
- 192.168.1.1
usbip err: usbip_network.c: 119 (usbip_recv_op_common) recv op_common, -1
usbip err: vhci_attach.c: 202 (query_exported_devices) recv op_common
usbip err: vhci_attach.c: 417 (show_exported_devices) query
# usbip -a 192.168.1.1 1-1
usbip err: usbip_network.c: 119 (usbip_recv_op_common) recv op_common, -1
usbip err: vhci_attach.c: 324 (query_import_device) recv op_common
usbip err: vhci_attach.c: 362 (attach_device) query
pc usbip # 

Nótese que la sintaxis del comando usbip es diferente de la sintaxis de la versión de Debian Wheezy, mucho mas "moderna". Después de la sorpresa inicial estuve investigando y  comprobé que la causa de esto es que el paquete usbip (0.1.7-3) que viene con ubuntu está obsoletísimo y siguen metiéndolo en repositorios. En este hilo hablan del tema y de la solución: el paquete usbip obsoleto sigue ahi hasta que alguien lo purgue. Los comandos usbip y usbipd correctos vienen ahora en otros paquetes distintos de utilidades relacionadas con el núcleo, siendo así:           

Otra opción es la descarga independiente de unos paquetes actualizados desde este repositorio PPA.

El hecho de que tengamos las versiones correctas de usbip y usbipd en Ubuntu no hace que funcionen: fallarán como fallaban en Wheezy. Me sabe mal decir que algo pensado originalmente para Linux me funciona en Windows y no en Linux, pero hay que ser honestos y dar al César lo que es del César. Si algún día encuentro el porqué de este malfuncionamiento y lo soluciono lo postearé aquí, hasta entonces ajo y agua.

Y con esto acaba mi segunda historia con OpenWrt. Si hago funcionar como repetidor wifi un OpenWrt en un router similar lo contaré en estos lares.

No hay comentarios:

Publicar un comentario