Páginas

Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

lunes, 3 de febrero de 2014

Instalando por enésima vez LAMP y phpMyAdmin, pero esta vez en Raspberry

No es la primera vez, ni será la última que me propongo instalar el paquete LAMP. Pero hace ya bastantes años que con anterioridad a LAMP, instalé WAMP. Eran los tiempos en que aún utilizaba Windows y que empezaba a hacer mis pinitos con Linux. Lo que LAMP significa para el entorno Linux, WAMP lo es para Windows.
LAMP no deja de ser un acrónimo que en su origen significaba: Linux (sistema operativo) , Apache (servidor Web), MySQL (Gestor de base de datos) y PHP ( lenguaje de programación diseñado para el desarrollo web de contenido dinámico). Y si cambiamos la L inicial por la W, se entiende lo de las siglas WAMP para el entorno Windows.
El conjunto de estas 4 piezas de software hizo posible desarrollar portales dinámicos capaces de atender simultáneamente decenas de miles de usuarios en red, a un coste ridículo.
Los cuatro elementos que componen LAMP pertenecen al mundo del Software libre y de Código abierto, una garantía para el usuario de no terminar a la larga siendo cautivo de intereses abusivos.
Con el tiempo, este paradigma de programación ha ido evolucionando e integrando otros módulos pero, a pesar de todo, conservando el acrónimo. Así para la letra P se han incorporado el lenguaje Perl o Python, para la M las bases de datos MariaDB y MongoDB, elementos que han continuado siendo de Software libre y Código abierto.
Aunque existen multitud de páginas (ver en la sección de Enlaces en esta misma entrada) que nos explican con todo lujo de detalles el procedimiento que hay que seguir para instalar este conjunto de programas, voy a intentar describir el modo en el que yo lo he hecho, ampliando algunos apartados que en estas páginas no venían descritas.

Procedimiento de instalación de LAMP

Lo vamos a realizar desde un terminal remoto conectándonos por ssh a Raspberry. Para ello, indicaremos el usuario con el que queremos conectarnos y averiguaremos la dirección IP en la que dentro de nuestra red local se encuentra nuestro RaspPi, pasando a ejecutar la sentencia ssh. Introduciremos la contraseña, lo que nos permitirá conectarnos a la RaspPi de forma remota.
¿Cómo he averiguado la dirección IP? Existen múltiples posibilidades. Si nos vamos al router de nuestra red local podremos averiguar la IP del equipo que tiene por nombre raspberry. Yo utilizo Fing, porque me es más cómodo, y porque tengo la aplicación instalada en mi Android. En este caso, el RaspPi me aparece como Edimax Technology. Pero ¿cómo sé que corresponde mi adaptador WiFi con Edimax Technology? Muy sencillo. Utilizo la instrucción lsusb de Linux para ver los dispositivos USB que tengo instalado en mi RaspPi.
Y de ahí identifico el vendedor del WiFi-USB, y con la aplicación Fing saco la dirección IP, asociada al vendedor identificado. Pero, qué duda cabe, es mucho más rápido utilizar la instrucción de linux ifconfig desde el propio terminal del RaspPi.
 Lo siguiente que vamos a hacer será instalar todos estos paquetes, tecleando por el terminal remoto lo siguiente:
sudo su
apt-get update && apt-get upgrade
apt-get install apache2 php5 mysql-client mysql-server
En el proceso de instalación de mysql se nos pedirá que introduzcamos una contraseña para el usuario root que se crea por defecto, lo que deberemos hacer, guardando en nuestra memoria la que hemos utilizado. Será la única manera de poder acceder a los servicios proporcionados por mysql.
Y ahora pasemos a probar si se nos han instalado y funcionan bien. Para ello, en un navegador introduciremos la dirección a la que responderá el servidor Web recién instalado en RaspberryPi, que coincide con su dirección IP. Se nos mostrará la página por defecto, que podemos editar para dejarla a nuestra entera satisfacción:
sudo nano /var/www/index.html
Al invocar este fichero desde un navegador (fichero que se abrirá como indicábamos con anterioridad simplemente introduciendo la dirección IP del RaspPi) podremos ver la página Web:
Prueba superada. Funciona el servidor Apache Web.
Ahora pasemos a probar que nos funciona el gestor de bases de datos que hemos instalado. En este caso, vamos a utilizar un acceso remoto a través del uso del comando ssh, como ya hemos hecho en otras ocasiones. Una vez hayamos establecido el acceso remoto con nuestro RaspPi, nos conectaremos al servidor mySQL, tecleando mysql --user=root -p. Si tecleamos correctamente la contraseña que nos solicita, que debe coincidir con la que introdujimos en fase de instalación de mySQL, entraremos en el monitor mySQL a nivel de comandos, tal como se muestra en la imagen siguiente. A partir de ahí podremos hacer uso de mysql, crear bases de datos, tablas, usuarios, introducir registros y todo aquello que solemos hacer con una base de datos.
Otra prueba superada. También funciona el servidor/gestor de bases de datos mySQL. Ahora, el siguiente en discordia, el que tenemos que probar que se ha instalado y funciona a la perfección, va a ser el PHP. Con tal fin, vamos a crearnos un fichero con el editor nano y con el contenido que se muestra en la imagen siguiente. Una vez guardado, lo invocaremos desde el navegador que utilicemos.
sudo nano /var/www/test.php
Lo llamamos desde el navegador que utilicemos y, si la instalación del PHP ha sido correcta y funciona, nos aparecerá lo siguiente:
Ya tenemos los tres paquetes básicos que conforman LAMP (además del sistema operativo Linux) funcionando a la perfección. Es el momento de instalar phpMyAdmin, una utilidad muy potente que se apoya en LAMP y que nos permite gestionar la base de dato MySQL desde un navegador.

Instalación de phpMyAdmin

De nuevo vamos a hacer uso de la consola remota para instalar phpMyAdmin.
sudo apt-get install phpmyadmin
Durante la instalación se nos pedirá que indiquemos 1) el servidor Web que utilizará phpAdmin por defecto, 2) los datos para crear la base de datos asociada a phpMyAdmin para su funcionamiento, y 3) la contraseña a utilizar por el usuario root, creado al instalar mySQL. Podemos utilizar la misma contraseña que introducimos. Ya tendremos tiempo de cambiarla o de crear nuevos usuarios con contraseñas y permisos específicos. En cuanto a la base de datos, yo he dejado los valores que por defecto sugiere utilizar.
Para que phpMyAdmin sea reconocido por el servidor Apache tendremos que editar el siguiente fichero:
sudo nano /etc/apache2/apache2.conf
Nos iremos al final del fichero y añadiremos la siguiente línea:
Include /etc/phpmyadmin/apache.conf
Finalmente reaarracaremos el servidor Apache:
sudo /etc/init.d/apache2 restart
y comprobaremos que phpMyAdmin es accesible desde nuestro navegador tecleando:
<IP del RaspPi>/phpmyadmin/
apareciéndonos en nuestro navegador lo siguiente:
Introduciremos el usuario (En este momento solo podemos acceder como usuario root) y la contraseña que hayamos considerado en la instalación de phpMyAdmin, redirigiéndonos a la página principal de gestión de bases de datos de MySQL:
A partir de ahora podremos gestionar MySQL de dos maneras: 1) utilizando la consola de comandos, tecleando mysql --user=root -p,  o 2) utilizando phpMyAdmin. Dependerá de lo que realmente queramos hacer para que nos decantemos para un modo u otro de gestión.
Podríamos continuar con ejemplos de cómo importar bases de datos, crear nuevos usuarios, acceder desde una aplicación JAVA que hayamos desarrollado. Pero por hoy considero suficiente lo avanzado, dejándolo para otra entrada los ejemplos que he propuesto.
Como siempre, estoy a las sugerencias de todos los lectores, que me propongan nuevos entradas o simples ampliaciones o mejoras a estas entradas existentes.

Enlaces

- LAMP (software bundle) en Wikipedia
- Software Libre y de Código Abierto, en Wikipedia
- RPi A Simple Wheezy LAMP install
- How to install LAMP on Raspberry Pi
- Raspberry Pi : Instalando LAMP y phpMyAdmin
- Turning your Raspberry Pi into a personal web server
- A vueltas con LAMP
- Fing - Network Tools (en play store)
- Apache HTTP Server
- MySQL
- phpMyAdmin
- Tutorial – Install PhpMyAdmin on your Raspberry Pi
- lsusb


viernes, 15 de noviembre de 2013

El portátil que quería ser autista y no lo consiguió

Reciclando un portátil

El paso del tiempo no solo lo sufren las personas. También, y en mayor medida, y porque la sociedad de consumo nos ha acostumbrado a ello, lo que en su momento era lo más novedoso, en muy poco tiempo pasa a ser una antigualla.
Me refiero a un portátil, sí de un portátil, de cuando aún los portátiles estaban de moda.
El portátil en cuestión era y es, porqué aún no se ha estropeado, el modelo Inspiron 1721 de la marca Dell, del año 2007. Las características básicas del equipo son las siguientes:
Procesador:  AMD Turion(TM) 64 X2 Mobile Technology TL-60 x 2
Memoria:     4 Gbytes
Disco Duro:  160 Gbytes
Tarjeta
Gráfica:     ATI RADEON Xpress1270 HyperMemory
Tamaño:
pantalla:    17"
Resolución:  1440 X 900 píxeles
además de venir equipado con WiFi, Bluetooth, conector RJ45, modem, DVD, WebCAM y varias entradas USB. No estaba nada mal. El hardware era suficientemente potente, adecuado para el uso que se le iba a dar.
Pero había un pero. Venía equipado, como era casi lo normal, con Windows, en aquel momento con la versión de Vista. En principio, a pesar de que en aquella época el pasar de Windows XP a Vista suponía un pequeño esfuerzo, era un esfuerzo asumible, aunque no fuese nada evidente adivinar el porqué del cambio ni las mejoras que comportaban este mini salto cuántico. Posiblemente, sería cuestión de marketing ¿no? y de aspecto...y, sobre todo, incordiar a los sufridos usuarios acostumbrados a un entorno, Windows XP, que prácticamente dominaban lo suficiente para lo que tenían que hacer.
Pero como ocurría y ocurre con todas las versiones del sistema operativo Windows, el paso del tiempo no es que hace que el equipo se vuelva obsoleto, que sí ocurre pero lentamente, sino que el equipo se vuelve lento ¿de reflejos?, pesado ¿engorda? , le cuesta arrancar ¿dormilón?, etc., etc. y para un usuario normal, esta degradación del sistema se le hace enojoso e insufrible.

Primera opción

Y llega el día en que alguien propone una cura de adelgazamiento. Lo primero que se hace es desinstalar todo lo que no se utiliza. Después, se bloquean todos aquellos servicios que no sirven para nada y que se activan nada más arrancar el portátil. Y finalmente, se limpia el Registro del sistema (algo delicado pero que sorprende por la cantidad de basura que se va acumulando - parece la evolución del ADN con cadenas que aparentemente no sirven para nada.
Y no nos olvidemos del tan sufrido pero necesario programa que debemos tener activo en un entorno de Windows: el ANTIVIRUS, el que nos protege de los ataques exteriores, de los troyanos, del malware. Eso es peor que una guerra. Cambiamos de antivirus y aparenta funcionar mejor, pero no, es solo aparente.
Y esta cura de adelgazamiento, como todas las curas de adelgazamiento, no hace milagros. Será que nada más hacer la cura de adelgazamiento, algo se nota, pero los defectos propios del sistema permanecen y en poco tiempo vuelve a ralentizarse y desesperar al desgraciado usuario esclavo del sistema operativo Windows.

Segunda opción

Ampliar la memoria RAM como primera medida, para que los programas que hemos ido actualizando y requieren más memoria puedan funcionar más alegremente. Pero el sistema que es un portátil ya venía con el máximo de memoria admisible por hardware. Opción desechada.

Tercera opción

Cambiar el portátil por otro más actual, que venga con una CPU mucho más potente, memoria RAM de 8 Gbytes o más, y de disco duro, de varios TeraBytes. Pero claro, esta opción es cara pero se opta por dar el salto y gastarnos unos eurillos con tal de mantenernos al día y podamos seguir utilizando las aplicaciones que nos son precisas. Dicho y hecho.
Ahora tenemos un portátil más potente, evidentemente con Windows, y corriendo todas las aplicaciones que utilizábamos en el antiguo. La sensación es que hemos mejorado claramente. El portátil responde mejor a nuestros requerimientos, parece que vuela, parece como que fuera el portátil viejo cuando era joven. Pero no, no era eso. Era que las aplicaciones habían aumentado en requerimientos y eso obligaba a reponer el hardware por otro más potente.
Pero el problema persistía. El sistema operativo Windows se va volviendo lentorro y progresivamente insufrible...pero así está el panorama...actualmente.

Opción final...pero con problemas

Llegados a este punto teníamos dos portátiles, uno más actual y otro que teniendo la potencia de los smartphones y tablets actuales era más lento que el caballo del malo, y que se utiliza para ciertas cosillas: oír música y ver películas, siempre que te armes de valor y de paciencia.
Pero llega alguien y propone darle vida al viejo y obsoleto portátil, insuflarle una vitalidad que lo hagan de nuevo atractivo. ¿De qué manera? Instalándole un sistema operativo Linux, sistema operativo que está instalado en multitud de equipos que utilizamos sin saber que en sus tripas funciona el sistema operativo Linux, un descendiente del sistema UNIX, y que también ha servido como base para desarrollar otros sistemas como iOS (basado en UNIX) y Android (basado en LINUX).
Dicho y hecho. Se optó por instalar la versión de Ubuntu 12.04 LTS (Precise Pangolin). Y se instaló. Funcionaba casi a la perfección. Y más alegremente. Los vídeos se veían muy bien y la música también se oía de maravilla. ¿Sí? No. Los vídeos y la música que tuviéramos localmente, en el disco duro, se reproducían sin mayores problemas. Pero si queríamos oír música o ver vídeos que estuvieran en Red o en Internet, no era imposible. La conexión del portátil a Internet, o a la red local, por WiFi no era imposible.
Pero lo primero que hice fue reinstalar el Linux 12.10 (Quantal Quetzal). Como en la versión anterior, se instaló sin problemas, desde un pendrive. Pero como en la instalación reconoció la red Ethernet, opté porque fuese actualizando el software que fuera pertinente. Al final de la instalación se reinició el equipo; y continuó funcionando en red cableada. Pero la conexión vía WiFi no funcionaba. Al menos no estaba peor que antes de la reinstalación, ya que conservaba una conexión, la RJ45 cableada, funcionando, lo que me permitió actualizar, aún más, todo el software que se había instalado, y que me proponía el sistema que hiciera. Y eso que pensaba que se había actualizado todo durante la instalación. Pero no, aún faltaban más actualizaciones, actualizaciones que se cargaron la conexión RJ45 por cable.
¿Qué podía hacer? Tenía que haber una solución. Y como siempre había que buscarla en Internet

Solución

Parece ser que el problema estaba en el tipo de chip que utilizaba para gestionar la red WiFi, el BCM4311, que esta versión de Ubuntu no lo contempla adecuadamente.
Después de experimentar con varias propuestas encontradas en la Red, encontré la que realmente funcionó:
sudo apt-get remove --purge bcmwl-kernel-source
apt-get purge bcmwl-kernel-source
sudo apt-get install linux-firmware-nonfree
Con estas tres líneas resolví ambas conexiones, la de por cable RJ45 y la de  WiFi. Pero al principio tuve mis dudas de cómo hacerlo. Hay que tener en cuenta que me había quedado sin ningún tipo de conexión. Afortunadamente la primera sentencia no requería conexión. Ni la segunda, Y, también afortunadamente, una vez ejecutada la primera línea, recuperé la conexión por cable. Ejecuté la tercera sentencia y automáticamente me reconoció todas las redes WiFi existentes en la zona. Introduje la contraseña de mi red WiFi y se conectó sin mayores problemas.
Entre paso y paso, estuve reiniciando el Portátil varias veces.
Y eso es todo. Era preciso hacer una 'pequeña' introducción y confío que no haya sido excesivamente larga. Si es así es cuestión de ir directamente a este apartado.
Ahora mi amiga tiene un Portátil que funciona perfectamente, que es alegre, que responde con prontitud y que se conecta a la red sin ningún problema. Y confío en que con el paso del tiempo no se vaya ralentizando como probablemente ocurriría con Windows. En Linux esto no ocurre.
Por cierto, y se instaló sin problemas Spotify, que era una de las razones imprescindibles para tener WiFi funcionando.
sudo gedit /etc/apt/sources.list
añadimos al final del fichero la siguiente línea
deb http://repository.spotify.com stable non-free
y ejecutaremos las siguientes líneas desde un terminal
sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 94558F59
sudo apt-get update && sudo apt-get install spotify-client

Referencias

Aunque indique que es para las versiones 12.04 y 13.04 de Ubuntu, también funciona para la versión 12.10.
Broadcom STA driver broken after updates today
Este enlace y el siguiente me sirvió para documentarme del problema, de las posibles soluciones y de cómo preguntar a Google por una posible respuesta.
b43 and b43legacy
Los siguientes enlaces fueron consultados, me dieron cierta información, pero no los apliqué para solucionar el problema
Ubuntu 11 and Broadcom BCM4311
Dell:Repository/firmware
Dell:Manuals and Documents for Inspiron 1721
Como Instalar la tarjeta wireless Broadcom en Ubuntu 12.10 Quantal Quetzal
Broadcom Corp. BCM4313 Wireless not detected in Ubuntu 12.10

Instalar Spotify en Ubuntu 12.10 ‘Quantal Quetzal’

viernes, 19 de julio de 2013

Personalización del teclado externo inalámbrico RC12 de un miniPC MK808 basado en Android

Desde hace poco tiempo tengo un sistema multimedia, un smartTV MK808+RC12, basado en el sistema operativo Android, con el que puedo visionar las películas que tengo almacenadas en red o en un disco duro externo. El conjunto consta de un miniPC Android MK808, empaquetado en un pendrive, y de un teclado inalámbrico RC12, que consume uno de los dos puertos USB con el que viene equipado el MK808.
Al MK808 le he sustituido la ROM de origen y le he instalado una nueva, la Finless 2.1 con lo que pasa a tener la versión 4.2.2 de Android. Funciona a las mil maravillas.
La única 'pega' es de que el teclado es inglés, por lo que la disposición de las teclas no coincide con las de un teclado español, carece de algunas de ellas, como la 'ñ' o la 'ç' y complicado conseguir acentuar las vocales . Si el conjunto lo utilizara para edición de textos en español, podría tener un cierto problema, que solucionaría comprándome un teclado español.  Pero como el 'cacharro' lo he comprado para lo que lo he comprado, voy a tratar de remediar este inconveniente personalizando el teclado convenientemente y añadiéndole algunas funcionalidades más.
El teclado inalámbrico RC12 que vino junto al MK808 tiene el aspecto que muestra la siguiente imagen.

Desde mi punto de vista, el mayor problema de estos dispositivos radica en el modo de manejarlo, pues al no tener pantalla táctil, y no digamos si la tuviera, la mayoría de las aplicaciones que están desarrolladas para un móvil han sido desarrolladas pensando en una pantalla táctil, y son muy complicadas de utilizar con un teclado externo que pretenda simular la acción de los dedos sobre una pantalla táctil.
MUY IMPORTANTE:
Antes de continuar hay que tener en cuenta que para realizar todos los procedimientos que siguen, el dispositivo tiene que estar ROOTEADO. Este procedimiento ha sido probado en un sistema determinado, y que probablemente funcione sin mayores problemas en otro sistema Android. A pesar de ello, no me responsabilizo de los problemas que puedan surgir al aplicar lo que se indica en este blog.Los procedimientos que se indican en esta entrada del blog han funcionado en un sistema Android con versión 4.2.2. Probablemente funcione para versiones anteriores de Android 4.0 y superiores.
Como todo el mundo sabe, para encontrar en Google lo que nos interesa, hay que saber qué estamos buscando y cómo debemos preguntarle.
Lo primero que hice fue buscar en Internet si había alguna aplicación en Play Store que resolviese mi problema. Aunque no la he probado, parece existir una aplicación que personaliza los teclados externos - External Keyboard Helper Pro. Pero yo quería una solución que no fuera recurriendo a una aplicación.
Y el camino que seguí fue la de meterme en las entrañas del sistema operativo y ver la manera de alterar los drivers que manejan el teclado externo conectado al puerto USB. Sabía que el secreto estaba en el contenido de unos ficheros de configuración de los dispositivos externos que se conectan al sistema Android, con extensión .kcm y .kl, siglas de key character map y key layout, respectivamente. Y esto fue lo que busqué.
El primer enlace representativo que nos muestra la búsqueda en Google correspondió a http://source.android.com/devices/tech/input/overview.html en donde se describe el subsistema de entrada del sistema operativo Android. Ahí viene indicado claramente la existencia de los ficheros que gestionan los teclados externos y que son reconocidos por el sistema Android con unos nombres y unas ubicaciones bien determinados:

     /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
     /system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
en donde las 'xxxx' hay que sustituirlas convenientemente, una vez averigüemos sus valores. En el enlace anterior me fue imposible encontrar el modo de averiguarlos. Indagando más, encontré los siguientes dos enlaces que fueron realmente los que me resolvieron la mayoría de las dudas y me permitieron personalizarlos ficheros convenientemente, casi como los quería:
Veamos el primer enlace. En él podemos encontrar el modo de averiguar los códigos de Vendedor, Producto y Versión que requerimos para definir los nombres de los ficheros. Tenemos varias opciones:
- Utilizar la herramienta ADB (Android Debug Bridge), que existe tanto para un sistema Windows como para un Linux. Yo utilizo UBUNTU 13.04 y tengo instalado el sistema de desarrollo de Android en Eclipse por lo que esta herramienta no tuve que instalarla pues se instala cuando instalamos el sistema de desarrollo de Android. Si no se dispone de ella, es cuestión de buscarla en Internet (pe http://www.keyables.com/2012/06/how-to-install-and-use-adb-tool.html), especificando ADB windows o ADB linux.
- Utilizar un emulador de terminal desde Android, por ejemplo, el Android Terminal Emulator desde el que podremos hacer más o menos lo mismo que haríamos si nos conectásemos al dispositivo mediante la herramienta ADB.
- Utilizar la aplicación ES Explorador de Archivos, u otra similar, desde el propio Android, con la que copiaremos, renombraremos, editaremos y daremos los permisos oportunos a estos dos ficheros.

Utilizando la herramienta ADB

Primero debemos conectar el dispositivo Android por USB o por WiFi, para que podamos acceder mediante la herramienta ADB. Iremos a Ajustes->Opciones de Desarrollo y marcaremos la opción Depuración USB. Seguidamente conectaremos el Android al PC.
Si nos conectamos por WiFi, debemos instalar una aplicación en el miniPC Android, ADB WiFi, la arrancamos y activamos pulsando sobre la cucaracha, que pasará de rojo a ser verde, y anotamos el mensaje con la IP que aparece (pe 192.168.1.25). Nos vamos al PC, y tecleamos la dirección IP que muestra el mensaje:

user@pc-desktop:~$adb connect 192.168.1.25
a partir de este punto el procedimiento es el mismo tanto para una conexión por USB o vía WiFi. Eso sí, si es por USB, no nos olvidemos de conectar el miniPC al PC :).
Accedemos al miniPC tecleando desde una ventana de comandos del PC lo siguiente:

user@pc-desktop:~$ adb shell
con lo que pasamos a ser un usuario del miniPC Android.

Utilizando un emulador de terminal desde Android

Una vez con lo instalado el emulador de terminal, lo arrancamos, y pasamos a ser usuario del miniPC Android, con lo que podremos manejarlo como en el caso anterior.
Tanto si utilizamos la herramienta ADB o el emulador de terminal, a partir de este momento será como si estuviéramos manejando un sistema Linux a nivel de comandos, por lo que si nos interesa ver el contenido de un determinado fichero, seguimos tecleando lo siguiente:

root@android:/ # cat /proc/bus/input/devices
...
I: Bus=0003 Vendor=0c45 Product=7403 Version=0100
N: Name="SONiX USB Device"
P: Phys=usb-usb20_host-1/input0
S: Sysfs=/devices/platform/usb20_host/usb2/2-1/2-1:1.0/input/input2
U: Uniq=
H: Handlers=sysrq kbd event2 keychord
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f

I: Bus=0003 Vendor=0c45 Product=7403 Version=0100
N: Name="SONiX USB Device"
P: Phys=usb-usb20_host-1/input1
S: Sysfs=/devices/platform/usb20_host/usb2/2-1/2-1:1.1/input/input3
U: Uniq=
H: Handlers=kbd event3 keychord
B: PROP=0
B: EV=17
B: KEY=1f0000 0 2020000 3878 d801d001 1e0000000
B: REL=103
B: MSC=10
root@android:/ #
Si nos fijamos en los dos bloques mostrados, aparece la información que estoy buscando:
- el nombre del dispositivo "SONiX USB Device" (que realmente no necesitamos)
- El código del vendedor (Vendor=0c45)
- El código del producto (Product=7403)
- El código de la versión del producto (Version=0100) (que podemos, o no, considerar)
Podemos observar que estos dos bloques son muy similares. Uno corresponde al teclado y el otro al ratón externos, estando asociados a un mismo puerto USB, el puerto al que está conectado el RC12 (usb-usb20_host-1, input0 e input1).
Con estos datos, determinamos el nombre de los ficheros:

/system/usr/keylayout/Vendor_0c45_Product_7403.kl
/system/usr/keychars/Vendor_0c45_Product_7403.kcm
Ahora hay que definir el contenido de estos ficheros. Para ello partiremos de unos ficheros genéricos que encontraremos en el propio dispositivo Android y los copiaremos en el mismo lugar, asignándoles los nombres que hemos determinado:
root@android:/ # cd /system/usr/keylayout
root@android:/system/usr/keylayout # cp Generic.kl Vendor_0c45_Product_7403.kl
root@android:/system/usr/keylayout # cd /system/usr/keylayout
root@android:/system/usr/keychars # cp Generic.kcm Vendor_0c45_Product_7403.kcm
Si disponemos de un editor de textos en Android, podemos editar estos dos ficheros en el propio dispositivo Android. pero por comodidad es mejor copiarlos y editar en un PC:
user@pc-desktop:~$ adb pull /system/usr/keylayout/Vendor_0c45_Product_7403.kl
user@pc-desktop:~$ adb pull /system/usr/keychars/Vendor_0c45_Product_7403.kcm
Una vez los hayamos editado (ver siguiente apartado), y si lo hemos hecho externamente, desde un PC, los copiamos en el dispositivo Android, aplicando el siguiente procedimiento:

user@pc-desktop:~$ adb remount
user@pc-desktop:~$ adb push Vendor_0c45_Product_7403.kl /system/usr/keylayout/Vendor_0c45_Product_7403.kl
user@pc-desktop:~$ adb push Vendor_0c45_Product_7403.kcm /system/usr/keychars/Vendor_0c45_Product_7403.kcm
Con la primera instrucción, adb remount, conseguimos que la memoria del sistema operativo Android sea de lectura/escritura, y de este modo podemos copiar los ficheros en las carpetas correspondientes, indicadas en las dos siguientes instrucciones.

Utilizando el ES Explorador de Archivos

Con esta aplicación podemos hacer la mayoría de las acciones que hemos indicado en los párrafos anteriores:
- ver contenido de /proc/bus/input/devices, y al abrirlo para ver su contenido hay que considerarlo como un fichero tipo texto y abrirlo con el propio editor de texto del ES Explorador de Archivos.
- Anotar Vendor, Product, [Version]
- ir a /system/usr/keylayout/ y copiar el fichero Generic.kl y pegar en la misma carpeta asignándole el nombre apropiado, según hemos indicado en párrafos anteriores.
- ir a /system/usr/keychars/ y copiar el fichero Generic.kcm y pegar en la misma carpeta asignándole el nombre apropiado, según hemos indicado en párrafos anteriores.
- editar estos ficheros con el propio editor de textos del ES Explorador de Ficheros, considerando a estos ficheros de tipo texto.
- reiniciar el miniPC, y comprobar que el teclado externo RC12 funciona tal como deseábamos.

Edición de los ficheros kl y kcm

Ya hemos dicho que Android utiliza dos ficheros, con extensiones kl y kcm, para mapear las teclas físicas de un teclado a los caracteres que llegan a las aplicaciones:

teclado >>> fichero [.kl] >>> fichero [.kcm] >>> aplicación

El fichero kl

El teclado asocia un código -scancode- a cada una de sus teclas físicas, código que determina una línea del fichero kl:

...
key 28    ENTER
key 29    CTRL_LEFT
key 30    A
key 31    S
key 32    D
key 33    F
key 34    G
key 35    H
...
key 102   HOME  WAKE
key 158   BACK  WAKE_DROPPED
...
Si pulsamos la tecla 28, el fichero kl asociará la etiqueta ENTER a dicha tecla física. Y si es la tecla 30 la que pulsamos, la etiqueta asociada será la A. Y así para el resto de las teclas. Además de la etiqueta, la línea podrá completarse con un modificador, WAKE o WAKE_DROPPED. Estos modificadores activan el teclado 'dormido', y envía la tecla pulsada o descarta la tecla pulsada, respectivamente.
Para poder averiguar los códigos -scancodes, con o sin modificadores- se puede utilizar una aplicación de Android que nos los vaya mostrando en la pantalla del dispositivo android. Por ejemplo en Play Store podemos encontrar la aplicación KeyEvent Display, o también otra, KeyTest.apk, que podemos descargar e instalar.

El fichero kcm

Una vez conocida la etiqueta asociada, si abrimos el fichero kcm podemos observar el bloque asociado a la etiqueta A:

...
key A {
  label:            'A'
  base:             'a'
  shift, capslock:  'A'
}
...
Vemos que el bloque consta de varias líneas encerradas entre llaves '{}'. De forma general, un bloque es de la siguiente manera:
# cualquier comentario empieza por el carácter almohadilla
key [etiqueta] {
    label:                          '[etiqueta de la tecla]'
    base:                           '[tecla sin modificador]'
    [modificador]:                  '[tecla con modificador]'
    [modificador]+[modificador]:    '[tecla con ambos modificadores simultáneos]'
    [modificador],[modificador]:    '[tecla con algún modificador de entre los indicados]'
    [modificador]:                   fallback [tecla mágica] 
    [modificador],[modificador]:     none
}
Un [modificador] puede tomar, entre otros, los siguientes valores: ralt, lalt, alt (tecla ALT dcha/izda/indistinta) , rshift, lshift, shift (tecla SHIFT dcha/izda/indistinta) , rctrl, lctrl, ctrl (tecla CTRL dcha/izda/indistinta) , capslock, y rmeta, lmeta, meta (tecla WIN dcha/izda/indistinta) si existiera la tecla WIN.
Ambos ficheros utilizan solo caracteres ANSI. Por tanto, cualquier carácter específico de un idioma deberá indicarse por sus equivalente hexadecimal '\uXXXX', según el estándar de codificación UNICODE. En http://en.wikipedia.org/wiki/List_of_Unicode_characters podemos encontrar la lista de todos los caracteres UNICODE.
Las teclas mágicas son aquellas que al pulsarlas nos activan una de las funciones, o aplicación, predeterminada de Android. Por ejemplo, el siguiente contenido del fichero kcm asociaría las teclas funcionales F10, F11 y F12 a las funciones de SILENCIAR VOLUMEN , BAJAR VOLUMEN y SUBIR VOLUMEN, respectivamente.
  ...
key F10 {
    base:               fallback VOLUME_MUTE
}
key F11 {
    base:               fallback VOLUME_DOWN
}
key F12 {
    base:               fallback VOLUME_UP
}
... 
En el fichero Generic.kl pueden encontrarse la mayoría de las etiquetas que pueden utilizarse después del modificador fallback.

Caso práctico


Es un teclado para el mercado inglés y, por tanto, no tenemos grabadas en las teclas los caracteres específicos de nuestra lengua, la Ñ, ni el modo de acentuar las vocales, ni otros signos de puntuación utilizados por nosotros. Este teclado tampoco respondía a las funciones asociadas a las teclas funcionales.
Para añadirle toda esta funcionalidad, vamos a modificar los dos ficheros como se muestra en los siguientes párrafos.
En el fichero kcm dejaremos las líneas correspondientes a las teclas indicadas como se muestra a continuación:
...
key 68      VOLUME_MUTE       WAKE
key 87      VOLUME_DOWN       WAKE
key 88      VOLUME_UP         WAKE
... 
En el fichero kl dejaremos modificados los siguientes bloques:
...
key C {
    label:                'C'
    base:                 'c'
    shift, capslock:      'C'
    alt:                  '\u00e7'   # cedilla minúscula
    shift+alt:            '\u00c7'   # cedilla mayúscula
}
key E {
    label:                'E'
    base:                 'e'
    shift, capslock:      'E'
    alt:                  '\u0301'   # acento agudo en siguiente letra vocal
}
key I {
    label:                'I'
    base:                 'i'
    shift, capslock:      'I'
    alt:                  '\u0302'   # acento circunflejo en siguiente letra vocal
}
key N {
    label:                'N'
    base:                 'n'
    shift, capslock:      'N'
    alt:                  '\u0303'   # signo virgulilla sobre letra n/N
}
key S {
    label:                'S'
    base:                 's'
    shift, capslock:      'S'
    alt:                  '\u00df'   # letra beta (griega)
}
key U {
    label:                'U'
    base:                 'u'
    shift, capslock:      'U'
    alt:                  '\u0308'   # acento diéresis en siguiente letra vocal
}
key 4 {
    label:                '4'
    base:                 '4'
    shift:                '$'
    alt:                  '\u20ac'   # simbolo del EURO
}
key 6 {
    label:                '6'
    base:                 '6'
    shift:                '^'
    alt+shift:            '\u0302'   # acento circunflejo en siguiente letra vocal
}
key SPACE {
    label:                ' '
    base:                 ' '
    shift:                fallback HOME
    alt, meta:            fallback SEARCH
    ctrl:                 fallback LANGUAGE_SWITCH
}
key ESCAPE {
    base:                 fallback BACK
    alt, meta:            fallback HOME
    ctrl:                 fallback MENU
}
key F1 {
    base:                 fallback MENU
}
key F2 {
    base:                 fallback EXPLORER
}
key F3 {
    base:                 fallback SEARCH
}
key F4 {
    base:                 fallback HOME
}
key F5 {
    base:                 fallback ENVELOPE
}
key F6 {
    base:                 fallback MUSIC
}
key F7 {
    base:                 fallback MEDIA_PREVIOUS
}
key F8 {
    base:                 fallback MEDIA_PLAY_PAUSE
}
key F9 {
    base:                 fallback MEDIA_NEXT
}
key F10 {
    base:                 fallback VOLUME_MUTE
}
key F11 {
    base:                 fallback VOLUME_DOWN
}
key F12 {
    base:                 fallback VOLUME_UP
}
...
En la imagen inferior se muestran las teclas que han sido alteradas para darle la funcionalidad que queríamos y que corresponden con el listado anterior.
Una vez hayamos realizado todos los cambios en los ficheros kl y kcm, los hayamos copiado a las carpetas correspondientes, deberemos de asignarles unos permisos para que puedan ser utilizados por el sistema Android:
user@pc-desktop:~$ adb shell
root@android:/ # chmod 644 /system/usr/keychars/Vendor_0c45_Product_7403.kcm
root@android:/ # chmod 644 /system/usr/keylayout/Vendor_0c45_Product_7403.kl
Una vez llegados aquí, deberemos reiniciar el sistema Android, y si no nos hemos equivocado, el teclado externo funcionará como deseábamos.
Los siguientes enlaces corresponden a los ficheros generados y utilizados en mi sistema multimedia Android, conforme a la disposición que aparece en la imagen anterior.
Quedan algunas cosas pendientes de resolución, que en una futura entrada trataré de incluir. Por ejemplo, de qué manera invocamos aplicaciones específicas al pulsar una tecla funcional o tecla y modificador.