Está en la página 1de 51

Emulación X86 con Exagear • Juegos Android • Instalación de Meta Paquetes

ODROID
Año Dos
Num #14
Feb 2015

Magazine

Docker
SO Destacado:
Ubuntu Studio Cómo utilizar
contenedores preparados
para ejecutar entornos
complejos de sistemas

• Conectar ODROID-C1 a un relé de 16 canales Jugando con la Placa Meteorologica


• Instalación mínima en un ODROID-C1
• Configurar dispositivos para desarrollo Android
• Escritorio Remoto usando Guacamole
Qué defendemos.
Nos esmeramos en presentar una tecnología
punta, futura, joven, técnica y para la sociedad
de hoy.

Nuestra filosofía se basa en los desarrolladores.


Continuamente nos esforzamos por mantener
estrechas relaciones con éstos en todo el mundo.

Por eso, siempre podrás confiar en la calidad y


experiencia que representa la marca distintiva de
nuestros productos.

Simple, moderno y único.

Ahora estamos enviando los


dispositivos ODROID U3 a los
países de la UE! Ven y visita
nuestra tienda online!

Dirección: Max-Pollin-Straße 1
85104 Pförring Alemania

Teléfono & Fax


telf : +49 (0) 8403 / 920-920
email : service@pollin.de

Nuestros productos ODROID se pueden encontrar


en: http://bit.ly/1tXPXwe
EDITORIAL
A
hora que ODROID Magazine se encuentra en su segundo
año, nos hemos expandido a varias redes sociales con el
fin de facilitarte las cosas a la hora de hacer preguntas, re-
alizar sugerencias, enviar tus propuestas y para avisarte cuando
se publique el último número. Echa un vistazo a nuestra página
de Google+ en http://bit.ly/1D7ds9u,
nuestro foro Reddit en http://bit.
ly/1DyClsP y nuestro subforo Hard-
kernel en http://bit.ly/1E66Tm6.

Si has estado siguiendo las tendencias


recientes de Docker, estarás contento de sa-
ber que hay algunas imágenes Docker pre-
compiladas disponibles para ODROID, la cuales
están detalladas en la segunda parte de nuestra serie Docker
que comenzó el mes pasado. Para aquellos que quieran probar la emu-
lación x86, Tobías presenta una aplicación llamada Exagear, que permite que
muchas aplicaciones de Windows puedan ejecutarse sobre la arquitectura
ARM, incluyendo Skype. Venkat nos trae los detalles técnicos para instalar
guacamole, que permite la visualización de un escritorio remoto desde un
navegador, y Nanik continúa su serie de Desarrollo de Android con un análisis
sobre la configuración de los dispositivos.

Para aquellos interesados en la creación de una estación meteorológica, la


placa meteorológica ODROID (http://bit.ly/1wtPdgP) es la solución perfecta,
y gracias a ella Jussi ha disfrutado monitorizando a distancia las condiciones
meteorológicas. Los aficionados a las maquinitas podrán disfrutar conectan-
do un relé de 16 canales al C1. Los músicos y artistas podrán aprender más
sobre Ubuntu Studio, que es gratuito y se puede instalar en cualquier distribu-
ción Ubuntu, proporcionando una gran cantidad de herramientas multimedia
de código abierto para la creación y producción de arte, video y música.

Los Juegos para móviles y de Android se han vuelto muy populares en los úl-
timos años, y Bruno continúa presentando sus juegos favoritos para ODROID,
incluyendo Plants vs Zombies 2, Fish out of Water, y Pew Pew. Si tienes un
juego favorito al que te gustaría ver analizado, crear un post en el subforo
ODROID Magazine o pon una nota en nuestra página de Google+, ¡y tal vez lo
publiquemos en el próximo número!

ODROID Magazine, que se publica mensualmente en http://magazine.odroid.com/, es la fuente de todas las cosas
ODROIDianas. • Hard Kernel, Ltd. • 704 Anyang K-Center, Gwanyang, Dongan, Anyang, Gyeonggi, South Korea,
431-815 • fabricantes de la familia ODROID de placas de desarrollo quad-core y la primera arquitectura ARM “big.
LITTLE” del mundo basada en una única placa.
Únete a la comunidad ODROID con miembros en más de 135 países en http://forum.odroid.com/ y explora las
nuevas tecnologías que te ofrece Hardkernel en http://www.hardkernel.com/.

ODROID MAGAZINE 3
PERSONAL

ODROID Magazine
Rob Roy, Bo Bruno Doiche,
Editor jefe Lechnowsky, Editor
Editor Artístico
Soy un programa- Senior
dor informático Soy el presidente
que vive y trabaja de Respectech, Inc., Hizo un pacto con la no-
en San Francisco, CA, Consultoría tecnológi- via para barrer el suelo todos los días, así
en el diseño y desarrollo de aplica- ca en Ukiah, CA, EE.UU. que fundé que se puso una Rumba.
ciones web para clients locales sobre en 2001. Con mi experiencia en elec-
mi cluster de ODROID. Mis princi- trónica y programación dirijo a un
pales lenguajes son jQuery, angular JS equipo de expertos, además de de-
y HTML5/CSS3. También desarrollo sarrollar soluciones personalizadas a
sistemas operativos precompilados, empresas, desde pequeños negocios
Kernels persona-lizados y aplicacio- a compañías internacionales. Los
nes optimizadas para la plataforma ODROIDs son una de las herramien-
ODROID basadas en las versiones tas de las que dispongo para hacer fr-
oficiales de Hardkernel, por los cuales ente a estos proyectos. Mis lenguajes
he ganado varios Premios. Utilizo mi favoritos son Rebol y Red, ambos se
ODROIDs para diversos fines, como ejecutan en los sistemas ARM como
centro multimedia, servidor web, de- el ODROID-U3. En cuanto a aficio-
sarrollo de aplicaciones, estación de nes, si necesitas alguna, yo estaría en-
trabajo y como plataforma de juegos. cantado de ofrecerte alguna de la mías
Puedes echar un vistazo a mi colección ya que tengo demasiadas. Eso ayudaría
de 100 GB de software e imágenes a que tuviese más tiempo para estar
ODROID en http://bit.ly/1fsaXQs. con mi maravillosa esposa y mis cuatro
hijos estupendos.

Nicole Scott, James Manuel


Editor LeFevour, Adamuz,
Artístico Editor Editor
Artístico Español
Soy una exper-
ta en Producción Soy un especialista en Tengo 31 años y
Transmedia y Estrategia medios digitales que dis- vivo en Sevilla, España,
Digital especializa en la optimización fruta trabajando como freelance en y nací en Granada. Estoy casado con
online y estrategias de marketing, marketing de redes sociales y adminis- una mujer maravillosa y tengo un hijo.
administración de medios sociales tración de sitios web. Cuanto más apren- Hace unos años trabajé como técnico
y producción multimedia impresa, do sobre las posibilidades de ODROID informático y programador, pero mi
web, vídeo y cine. Gestiono múltiples más me ilusiona probar cosas nuevas trabajo actual está relacionado con la
cuentas con agencias y productores con él. Me traslade a San Diego desde gestión de calidad y las tecnologías
de cine, desde Analytics y Adwords el Medio Oeste de los EE.UU. Todavía de la información: ISO 9001, ISO
a la edición de vídeo y maquetación estoy bastante enamorado de muchos 27001, ISO 20000 Soy un apasionado
DVD. Tengo un ODROID-U3 que aspectos que la mayoría de la gente de de la informática, especialmente de los
utilizo para ejecutar un servidor web la Costa Oeste ya dan por sentado. Vivo microordenadores como el ODROID,
sandbox. Vivo en el área de la Bahía con mi encantadora esposa y nuestro Raspberry Pi, etc. Me encanta experi-
de California, y disfruta haciendo adorable conejo mascota; el cual man- mentar con estos equipos y traducir
senderismo, acampada y tocando tiene mis libros y material informático ODROID Magazine. Mi esposa dice
música. Visita mi web en http:// en constante peligro. que estoy loco porque sólo pienso en
www.nicolecscott.com. ODROID. Mi otra afición es la bici-
cleta de montaña, a veces participo en
competiciones semiprofesionales.

ODROID MAGAZINE 4
EMULACION X86 CON EXAGEAR - 6
INDICE
JUEGOS ANDROID: PEW PEW - 9

GESTIONAR META PAQUETES - 10

JEUGOS ANDROID: FISH OUT OF WATER - 11

ESCRITORIO REMOTO - 12

SO DESTACADO: UBUNTU STUDIO - 15

JUEGOS ANDROID: PLANTS VS. ZOMBIES - 18

PLACA METEOROLOGICA - 19

DESARROLLO ANDROID - 29

INSTALACION MINIMA EN CI - 32

ODROID MAGAZINE EN GOOGLE+ - 35

RELE - 36

FOROS ODROID - 40

DOCKER - 41

DEBIAN VS UBUNTU- 48

CONOCIENDO A UN ODROIDIAN - 49

ODROID MAGAZINE 5
EMULACION X86

EMULACION X86
ANALIZAMOS EXAGEAR
por Tobias Schaaf

E
ltechs ExaGear Desktop es una máquina virtual que
implementa un contenedor Linux x86 basado en soft-
ware sobre ARM, permitiéndote ejecutar directamente
aplicaciones x86 de Intel. Es como QEMU pero 4,5 veces más
rápido. Incluso puedes ejecutar aplicaciones de Windows en
tu dispositivo ARM si instalas Wine. Cuando ExaGear fue a-
nunciado por primera vez, tenía dudas sobre sus capacidades y
nunca pensé que realmente lo llegaría a usar. Sin embargo, me
sorprendió cuando lo instalé hace poco. Quiero compartir mi
experiencia y resultados con la emulación x86 sobre dispositi-
vos ARM utilizando ExaGear.

Información general
ExaGear no es gratuito, se ha de comprar una licencia de
Eltechs en http://bit.ly/YbPqc5. ExaGear viene con paquetes Exagear ejecuta aplicaciones x86 sobre dis-
de Debian y una reducida imagen x86 de Ubuntu 12.04. El positivos ARM, como los de la familia ODROID
paquete debería funcionar en todos los sistemas Debian, inclui-
das las imágenes oficiales de Ubuntu 14.04 de HardKernel, así que todas las funciones no estarán disponibles y los gráficos se
como en cualquier otra imagen de Debian, como mi imagen volverán un poco lentos.
ODROID GameStation Turbo. Por ejemplo, puedes instalar Steam en ODROID pero no
ExaGear permite ejecutar aplicaciones x86 en tu placa lo puedes ejecutar, porque le faltan algunas funciones y no po-
ODROID ARM usando el kernel y los drivers que lleva tu drá iniciarse. Cualquier aplicación que requiera muchos grá-
placa. Parece que simplemente traduce las funciones x86 a las ficos no se ejecutará, lo mismo ocurre con las aplicaciones de
equivalentes en ARM y la verdad es que lo hace muy bien. Windows. Aunque puede ejecutar muchas aplicaciones x86 de
Windows, las que utilizan componentes de DirectX como los
Qué puedes hacer juegos en 3D no van a funcionar o se ejecutaran muy lentos, de
Puesto que ExaGear viene con una mínima imagen de hecho provocarán que tu ODROID se caliente bastante.
Ubuntu 12.04, puedes instalar y ejecutar (teóricamente) cual-
quier programa que sea compatible con Ubuntu 12.04, lo cual Ejemplos reales
te da una amplia gama de posibilidades. Básicamente se puede Con todo lo dicho, tal vez te preguntes, ¿Cómo de bueno
instalar todo lo que se encuentra en el repositorio de Ubuntu, es ExaGear y qué puedo esperar de él? Mira la Figura 1, es
incluidas las aplicaciones que proceden de colaboradores exter- un ejemplo de cómo trabaja ExaGear. Como puedes obser-
nos de Ubuntu, como Zentyal y Steam. Por lo general, todo lo var, es muy capaz pero con algunas limitaciones.
que se ejecuta bajo un gestor de ventanas Linux nativo funciona He detectado que muchos programas tienen problemas de
sorprendentemente bien con ExaGear. sonido. Si hay varios sonidos ejecutándose al mismo tiempo,
se produce con cierto retraso. De modo que, aunque es po-
Qué no puedes hacer sible jugar hasta un cierto nivel, no esperes que sea perfecto.
Aunque puede instalar todo lo que aparece o existe para
Ubuntu 12.04, ExaGear presenta algunas limitaciones. Por Skype y TeamViewer
ejemplo, no se puede ejecutar aplicaciones aceleradas por hard- Una de las cosas más útiles que puedes hacer con ExaGear es
ware ya que los drivers no son compatibles. Cualquier cosa ejecutar aplicaciones que son utilizadas ampliamente en entor-
que requiera OpenGL, sólo se ejecutará en modo emulación a nos x86, pero que no existen para ARM. Skype y TeamViewer
través de la versión OpenGL del software MESA. Esto significa son dos buenos ejemplos. Como he comentado anteriormente,

ODROID MAGAZINE 6
EMULACION X86

Figura 1 – El juego Total Annihilation para Windows ejecutándose Figura 2 - Skype y TeamViewer ejecutándose simultáneamente
en el ODROID-XU3 usando ExaGear en un ODROID-U3

si un programa no necesita de ningún mecanismo especial, de terminal actual y escribe:


puede funcionar perfectamente en dispositivos ODROID.
Ambos programas se pueden usar sin ninguna limitación. $ ps aux | grep skype
He hecho llamadas con Skype en mi televisor utilizando un
ODROID U3, incluso con una cámara para la videollamada Encontrarás una línea similar a esta:
y funciona perfectamente. La misma experiencia tengo con
TeamViewer que de hecho utiliza Wine, lo cual significa que en odroid 3125 5.7 15.1 828424 314764 ? Sl
realidad estás ejecutando una aplicación de Windows directa- 16:00 2:59 /opt/exagear/bin/ubt_x32a32_al --path-
mente sobre ODROID. Como muestra la Figura 2, puedes prefix /opt/exagear/images/ubuntu-1204lts --vpaths-
ejecutar incluso Skype y TeamViewer simultáneamente. list /opt/exagear/images/ubuntu-1204lts/.exagear/
vpaths-list --hifd-base 4095 -f /usr/bin/skype –
Accesos directos skype
El modo”normal” de iniciar un programa con ExaGear es
abrir una sesión de Terminal y escribir el comando “exagear”. Si tu terminal es demasiado pequeño, es posible que no veas
Esto activará el entorn ox86, donde puedes iniciar ciertas apli- la línea de comandos completa. En tal caso, usa el siguiente co-
caciones a través de una línea de comandos, por ejemplo es- mando para guardar el resultado en un archivo llamado skype.
cribiendo “skype” para iniciar Skype. txt, el cual se puede abrir con cualquier editor de texto.
Aunque este método funciona, es un poco complicado, so-
bre todo porque no se puede cerrar esta ventana de terminal $ ps aux | grep skype > skype.txt
sin que primero finalices el programa x86. Por eso, quiero ense-
ñarte a iniciar directamente los programas desde tu entorno Entre otros datos, podemos ver el comando que se utiliza
ARM sin utilizar el comando exagear. para iniciar Skype:

Skype /opt/exagear/bin/ubt_x32a32_al --path-prefix /opt/


Lo primero que debes hacer es conocer cómo se inician los exagear/images/ubuntu-1204lts --vpaths-list /opt/
programas con ExaGear, y ver si podemos imitarlo. Para deter- exagear/images/ubuntu-1204lts/.exagear/vpaths-list
minar esto, iniciaremos Skype utilizando el método “normal”, --hifd-base 4095 -f /usr/bin/skype -- skype
se supone que ya has instalado Skype en tu entorno ExaGear.
En primer lugar, iniciar Skype desde el terminal: Vamos a hacer algunas pruebas para comprobar si realmente
funciona este comando. Salte de Skype y abre una nueva se-
$ exagear sión de terminal, de modo que ya no estés en el entorno de
ExaGear. Prueba el comando que has localizado en el archivo.
Inicia el intérprete en una imagen /opt/exagear/images/ Si todo funciona como es debido, verás que Skype se ini-
ubuntu-1204lts cia con normalidad, lo cual significa que lo has lanzado di-
rectamente desde tu entorno ARM sin tener que pasar primero
$ skype por el entorno de ExaGear. Aunque esto no supone una gran
diferencia, ya que todavía estamos utilizando el terminal para
Abre un nuevo terminal o una nueva pestaña en la ventana iniciar Skype, ya hemos dado un primer paso.

ODROID MAGAZINE 7
EMULACION X86

Para facilitar las cosas, vamos a crear un acceso directo para # Default-Start: 2 3 4 5
iniciar Skype. En realidad no supone mucho trabajo, puesto # Default-Stop: 0 1 6
que ya existe un iniciador en el entorno ExaGear. Lo vamos # Short-Description: starts teamvierwer deamon
a usar para no tener que reescribirlo todo. Para ello, abre un # Description: Starts the teamvierwer deamon for
nuevo terminal e inicia sesión como usuario root: teamviewer useage through exagear.
$ su ### END INIT INFO
Password: set -e
$ echo “/opt/exagear/bin/ubt_x32a32_al --path-prefix case “$1” in
/opt/exagear/images/ubuntu-1204lts --vpaths-list / start)
opt/exagear/images/ubuntu-1204lts/.exagear/vpaths- # only run as root
list --hifd-base 4095 -f /usr/bin/skype – skype” > / if [ `id -u` -eq 0 ];
usr/local/bin/skype then
$ chmod +x /usr/local/bin/skype /opt/exagear/bin/ubt_x32a32_al
$ cp /opt/exagear/images/ubuntu-1204lts/usr/share/ --path-prefix /opt/exagear/images/ubuntu-1204lts
applications/skype.desktop /usr/local/share/applica�
- --vpaths-list /opt/exagear/images/ubuntu-1204lts/.
tions/ exagear/vpaths-list --hifd-base 4095 -f /opt/team-
$ cp /opt/exagear/images/ubuntu-1204lts/usr/share/ viewer/tv_bin/teamviewerd -- /opt/teamviewer/tv_bin/
pixmaps/skype.png /usr/local/share/pixmaps teamviewerd
fi
Una vez completados estos pasos, ya tenemos todo lo que ;;
necesitamos para iniciar Skype. Si abres la lista de programas stop)
haciendo clic en el botón Inicio y navegas hasta Internet, de- PID=`ps aux | grep “/opt/exagear/bin/ubt_
berías encontrar un nuevo icono llamado “Skype”. A partir de x32a32_al --path-prefix /opt/exagear/images/ubuntu-
ahora, cada vez que quieras iniciar Skype simplemente haz clic 1204lts --vpaths-list /opt/exagear/images/ubuntu-
en ese icono, como si lo hicieras en un entorno x86 real. Tras 1204lts/.exagear/vpaths-list --hifd-base 4095 -f /
una breve espera, Skype se iniciará como una aplicación ARM opt/teamviewer/tv_bin/teamviewerd -- /opt/teamview-
nativa. er/tv_bin/teamviewerd” | grep -v grep | awk ‘{print
$2}’`
TeamViewer if [ ! -z $PID ];
Hacer que TeamViewer se ejecute directamente desde un then
acceso directo es similar a Skype, aunque un poco más com- kill $PID
plicado. TeamViewer tiene un pequeño problema, necesita un fi
servicio demonio de TeamViewer llamado teamviewerd, que se ;;
inicia antes que el programa TeamViewer en sí. El demonio *)
de TeamViewer sólo puede ser iniciado como root, así que te- echo “Usage: $N {start|stop}” >&2
nemos que iniciar ExaGear como usuario root y luego iniciar el exit 1
servicio teamviewerd. Después, iniciar sesión por segunda vez ;;
como usuario normal en ExaGear y finalmente iniciar Team- esac
Viewer. Queremos iniciar TeamViewer de la misma forma sen- exit 0
cilla y directa con la que ejecutamos Skype, así que vamos a EOF
aplicar un poco de magia Linux para conseguir que funcione. $ chmod +x /etc/init.d/teamviewerd_exagear
Para empezar, abre un nuevo terminal y crea el siguiente script: $ update-rc.d teamviewerd_exagear defaults
$ su
Password: Esto crea un script de servicio que se puede iniciar como
$ cat <<\EOF > /etc/init.d/teamviewerd_exagear root, también se ejecutará cada vez que inicies tu ODROID:
#! /bin/sh
### BEGIN INIT INFO $ service teamvierwerd_exagear start
# Provides: teamviewerd_exagear
# Required-Start: $local_fs $remote_fs Luego, creamos un acceso directo lanzador para Team
# Required-Stop: Viewer, como el que hicimos para Skype:
# X-Start-Before:

ODROID MAGAZINE 8
EMULACION X86

$ su Si realizas una actualización del sistema usando el comando


Password: “apt-get upgrade” y/o “apt-get dist-upgrade”, te puedes encon-
$ cp /opt/exagear/images/ubuntu-1204lts/usr/share/ trar con varios problemas, puesto que la imagen tiene muchas
applications/teamviewer-teamviewer10.desktop /usr/ modificaciones. He observado que han pasado por alto algunas
local/share/applications/ cosas, como alterar las herramientas initramfs para desactivar
$ cp /opt/exagear/images/ubuntu-1204lts/opt/team- la creación de un archivo initrd.img, que no es posible de to-
viewer/tv_bin/desktop/teamviewer.png /usr/local/ dos modos. Además, algunos paquetes no se podrán actualizar,
share/pixmaps/ lo cual requiere algo de experiencia con Linux para solucionar
$ cp /usr/local/bin/skype /usr/local/bin/teamviewer esta cuestión, aunque tal vez no sea necesario actualizar una vez
$ pico /usr/local/bin/teamviewer que todo funcione correctamente.
$ pico /usr/local/share/applications/teamviewer- Otra cuestión es que ExaGear distribuye las tareas sobre to-
teamviewer10.desktop dos los núcleos de la CPU, generalmente es algo muy bueno, ya
que utiliza todo el potencial que puede alcanzar, pero también
Para los dos últimos pasos, tenemos que editar unos archivos. puede provocar que la CPU se caliente con algunas aplicacio-
En el archivo /usr/local/bin/TeamViewer , sustituye la palabra nes. Por ejemplo, ejecuté una aplicación de Windows llamada
“skype” dos veces por la palabra “TeamViewer”. Después, guarda Blender en mi XU3 usando ExaGear y Wine, que provocó que
el archivo pulsando Ctrl-X y la techa “y”, Luego pulsar Intro los 8 núcleos funcionasen al 100% y el ventilador girase a su
dos veces. A continuación, en el archivo /usr/local/share/applica- máxima velocidad, ¡La temperatura llego a superar los 94 ° C
tions/teamviewer-teamviewer10.desktop cambiar el icono para (200 ° F)!
incluir solamente “TeamViewer” y nada más, guarda también En general, me gusta bastante ExaGear y aunque fue muy
este archivo. Ahora, podemos iniciar el servicio teamviewerd_ex- reacio cuando se anunció por primera vez, tengo que decir que
agear manualmente, o bien reiniciar ODROID y luego lanzar el trabajo que hace es muy bueno.
TeamViewer del mismo modo que Skype, usando el submenú
Internet del botón Inicio. Wine
Si utilizas ExaGear con Wine, un programa muy recomen-
Cuestiones importantes dable es PlayOnLinux, que te permite configurar e instalar fácil-
ExaGear tiene algunas peculiaridades que hacen que las mente aplicaciones de Windows bajo Wine. Si intentas ejecutar
cosas sean un poco más difíciles. Por ejemplo, el acceso a los aplicaciones a pantalla completa como juegos, es necesario con-
archivos en el entorno ExaGear es un tanto lento. Iniciar Team- figurar Wine para ejecutar un falto escritorio con un tamaño de
Viewer puede llegar a tardar hasta un minuto en un ODROID- 800x600 o 1024x768, en lugar de que se ejecute de forma nativa
U3, independientemente si usas un módulo eMMC o tarjeta en Linux. PlayOnLinux puede ayudante con estos problemas de
SD. De vez en cuando debe ejecutar “apt-get update” en tu resolución, especialmente con el C1, que no puede cambiar las
entorno ExaGear para actualizar la lista de paquetes, o porque resoluciones sobre la marcha. PlayOnLinux también te permite
algunos paquetes pueden no haber sido incluidos durante la recuperar con facilidad el control cuando un programa se cuelga,
instalación de TeamViewer o Skype. ya que es capaz de cerrar el programa específico.

PEW PEW JUEGOS ANDROID


UN DIVERTIDO SHOOTER EN EL
ESPACIO Y CON ASTEROIDES
por Bruno Doiche

C
uando los juegos clásicos son reinventados para dis-
positivos modernos, ¡Son simplemente mejores! Pew
Pew es un shooter multi-direccional para Android.
Megatones de enemigos con muchos y diferentes modos de
juego, combinado con suaves y simpáticos gráficos retro.
Gana medallas, desbloquea naves y compite en la jerarquía
online.

https://play.google.com/store/apps/
details?id=com.jyaif.pewpew
ODROID MAGAZINE 9
GESTIONAR META PAQUETES

TASKSEL
SENCILLA FORMA DE INSTALAR
META PAQUETES DESDE CLI
editado por Rob Roy

T
asksel es una herramienta compatible con Debian y
Ubuntu que facilita la instalación de múltiples paquetes
interrelacionandolos como una “tarea” coordinada en tu
sistema, permitiendo instalar con un simple click paquetes de
servidores web, entornos de escritorio y suites de software. La
función de instalación es similar a la de los meta-paquetes, y la
mayoría de las tareas disponibles en tasksel también están dis-
ponibles desde los gestores de paquetes de Ubuntu, como es el
Gestor de paquetes Synaptic.

Instalación
Si tasksel no está instalado, se puede descargar con el ¿A qué examinar los miles de paquetes disponibles para Ubuntu
siguiente comando: es como un cubo de 4 dimensiones? ¡Utiliza Tasksel en su lugar!

$ sudo apt-get install tasksel Argumentos línea de comandos


También puede especificar directamente qué tarea instalar
Uso sobre la línea de comandos. Por ejemplo, para añadir Apache-
Para ejecutar tasksel desde la línea de comandos, escribe lo MySQL-PHP a un sistema escribe:
siguiente en una ventana de terminal, aparecerá al menú que
ves a continuación: $ sudo tasksel install lamp-server

$ sudo tasksel Para ver todas las opciones, consulta el manual de tasksel:

$ man tasksel

Uso
Las tareas también se pueden instalar con apt-get:

$ sudo apt-get install <task_name>

Por ejemplo, los siguientes comandos instalarán Ubuntdesk-


top, Kubuntdesktop y el servidor LAMP, respectivamente:

$ sudo apt-get install ubuntu-desktop


El menú principal Tasksel permite instalar paquetes con un sólo clic $ sudo apt-get install kubuntu-desktop
$ sudo apt-get install lamp-server
Las tareas ya instaladas se indican con un asterisco al lado
del nombre. Selecciona una tarea desplazándote hacia abajo y Lista de tareas
presionando el espacio, de esta forma aparecerá asterisco al lado Las tareas se definen en archivos .desc ubicados en el di-
de la tarea seleccionada siendo marcada para su instalación. rectorio /usr/share/tasksel. La lista por defecto disponible en
Quitando el asterisco marcas la tarea para ser eliminada. Tras Ubuntu se puede ver con el siguiente comando:
pulsar “OK”, la instalación y/o eliminación de las tareas selec-
cionadas se llevarán a cabo usando apt-get. $ grep Task /usr/share/tasksel/ubuntu-tasks.desc

ODROID MAGAZINE 10
GESTIONAR META PAQUETES JUEGOS ANDROID

Descripción de los paquetes


A continuación se muestra una lista de las tareas en Ubuntu 14.04 Trusty Tahr
FISH OUT OF
que se pueden instalar usando el gestor de paquetes de tasksel. Los paquetes soporta- WATER
dos pueden cambiar entre las versiones de Ubuntu, así que asegúrate de ejecutar el
siguiente comando para ver la lista más reciente:
DESLIZA TU RATÓN
SOBRE LOS MARES
$ tasksel --list
VIRTUALES
server Basic Ubuntu server por Bruno Doiche
openssh-server OpenSSH server

S
dns-server DNS server i tiene ganas de probar un juego
lamp-server LAMP server divertido, echar un vistazo a Fish
mail-server Mail server Out of Water. No es el típico juego
postgresql-server PostgreSQL database que te engancha al momento, pero tiene
print-server Print server algo diferente. Simplemente lanza tus
samba-server Samba file server personajes por encima del agua e intenta
tomcat-server Tomcat Java server que se deslicen y lleguen tan lejos como
cloud-image Ubuntu Cloud Image (instance)
te sea posible para conseguir las más altas
virt-host Virtual Machine host
puntuaciones. Creado por Halfbrick, los
creadores del clásico juego Fruit Ninja,
ubuntustudio-graphics 2D/3D creation and editing suite
¡Este pasatiempo sin duda merece que le
ubuntustudio-audio Audio recording/editing suite
prestes algo de atención!
edubuntu-desktop-gnome Edubuntu desktop
kubuntu-active Kubuntu Active
https://play.google.com/store/
kubuntu-desktop Kubuntu desktop
apps/details?id=com.halfbrick.
kubuntu-full Kubuntu full FishOutOfWater
ubuntustudio-font-meta Large selection of font packages
lubuntu-desktop Lubuntu Desktop
lubuntu-core Lubuntu minimal installation
mythbuntu-desktop Mythbuntu additional roles
mythbuntu-frontend Mythbuntu frontend
mythbuntu-backend-master Mythbuntu master backend
mythbuntu-backend-slave Mythbuntu slave backend
ubuntustudio-photography Photograph touchup/editing suite
ubuntustudio-publishing Publishing applications
¡En este juego aparecen peces que
ubuntu-gnome-desktop Ubuntu GNOME desktop
llevan sombrero! ¿No es increíble?
ubuntu-desktop Ubuntu desktop
ubuntu-usb Ubuntu desktop USB
ubuntustudio-video Video creation and editing suite
xubuntu-desktop Xubuntu desktop
edubuntu-dvd-live Edubuntu live DVD
kubuntu-active-live Kubuntu Active Remix live CD
kubuntu-live Kubuntu live CD
kubuntu-dvd-live Kubuntu live DVD
lubuntu-live Lubuntu live CD
ubuntu-gnome-live Ubuntu GNOME live CD
ubuntustudio-dvd-live Ubuntu Studio live DVD
ubuntu-live Ubuntu live CD
ubuntu-usb-live Ubuntu live USB
xubuntu-live Xubuntu live CD

ODROID MAGAZINE 11
ESCRITORIO REMOTO

ESCRITORIO REMOTO
USANDO GUACAMOLE
por Venkat Bommakanti

P
or casualidad no estarás buscando una solución de escri-
torio remoto que use un navegador y no un cliente para
poder acceder a un ODROID como el C1 de forma
remota. ¡Guacamole es perfecto! Todo lo que necesita es un
navegador Web con soporte HTML5 para poder acceder a tu
dispositivo desde un smartphone, portátil o PC de escritorio, ya
FileZilla, TightVNC Viewer (MS Windows 7 +) y Terminal
que no se requiere ningún plugin o software cliente.
(Mac, Linux) desde una máquina de desarrollo.
6. Apache tomcat 6
Figura 1: Arquitectura típica 7. Guacamole 0.8.3
de un servidor Guacamole
Preparando Lubuntu
Guacamole es una apli- Instala la última imagen para C1 en el módulo eMMC,
cación web de escritorio re- después inserta el eMMC en el C1. Con la pantalla HDMI
moto basada en el estándar conectada, arranca el sistema. El primer paso es ejecutar
HTML5, compatible con ODROID Utility y expandir la partición de instalación para
varios protocolos de escrito- utilizar todo el módulo eMMC con la opción “Resize your
rio remoto como VNC, SSH root partition”. Reinicia y ejecuta ODROID Utility de nuevo
y RDP. La Figura 1, obtenida para configurar y actualizar los drivers de video y el kernel.
de guac-dev.org muestra su Liego, vuelve a reiniciar el sistema
arquitectura que básicamente
consta de tres (3) componen- Instalar el software relacionado
tes: Ejecuta los siguientes comandos para instalar el software de
aplicaciones web guacamole 0.8.3 necesario:
• Un programa de servidor guacamole alojado por Apache Tomcat
(contenedor) que procesa las solicitudes Web. $ sudo apt-get install guacamole guacamole-tomcat

• Un demonio guacd que comunica el protocolo guacamole con el pro- guacd

grama servidor. $ sudo apt-get install libguac-client-vnc0 libguac-

• un cliente guacamole, un completo componente residente en client-rdp0 libguac-client-ssh0

servidor, que sirve el contenido de la interfaz de usuario HTML5 .


Configurar cuentas de usuario
Requisitos El proceso de instalación instala los siguientes archivos:
1. Un ODROID-C1 – aunque este artículo se centra en el C1,
se puede aplicar a placas de la series U3 y XU3 $ cd /etc/guacamole

2. Accesorios para C1 como el cable HDMI, cable Ethernet $ ls -lsa

CAT 5E+ o adaptador WIFI 3, PSU y batería RTC 4 -rw-r--r-- 1 root root 1099 Sep 21

3. Un módulo eMMC 5.0 de 16GB+ con la última imagen 2013 guacamole.properties

del escritorio Lubuntu específica para C1 como ubuntu- 4 -rw-r----- 1 root guacamole-web 1030 Sep 21

14.04.1lts-lubuntuodroid-c1-20150102.img y/o una tarjeta 2013 user-mapping.xml

MicroSD clase 10 de 16 GB+ con un lector de tarjeta SD


4. Una red en la que el dispositivo tenga acceso a Internet Las cuentas de usuario deben ser configuradas en el archivo
y a los foros ODROID user-mapping.xml, editando el archivo para que coincida con
5. Acceso en red al C1 a través de utilidades como PuTTY, las siguientes líneas:

ODROID MAGAZINE 12
ESCRITORIO REMOTO

<user-mapping> La información de acceso a guacamole para este usuario es:


<!-- Example user configurations are given be-
low. For more information, username: odroid
see the user-mapping.xml section of the Guaca�
- password: odroid
mole configuration
documentation: http://guac-dev.org/Configur�
- El archivo guacamole.properties por defecto no necesita ser
ing%20Guacamole --> modificado para la configuración utilizada en este artículo. Sin
embargo, la identificación del usuario que tomcat6 requiere
<!-- Per-user authentication and config informa- necesita acceso a este archivo. Tras determinar la identificación
tion --> del usuario de tomcat6, configura el enlace al archivo utilizan-
<authorize username=”USERNAME” do los siguientes comandos:
password=”PASSWORD”>
<protocol>vnc</protocol> $ sudo cat passwd | grep tomcat
<param name=”hostname”>localhost</param> tomcat6:x:115:122::/usr/share/tomcat6:/bin/false
<param name=”port”>5900</param>
<param name=”password”>VNCPASS</param> $ sudo mkdir /usr/share/tomcat6/.guacamole
</authorize> $ sudo ln -s /etc/guacamole/guacamole.properties /
usr/share/tomcat6/.guacamole
<!-- Another user, but using md5 to hash the
password Ensure that the tomcat6 server’s connector configura-
(example below uses the md5 hash of the pass- tion (/etc/tomcat6/server.xml) matches the following
word “odroid”) --> code snippet, then reboot:
<authorize
username=”odroid” <Connector port=”8080” protocol=”HTTP/1.1” connec-
password=”54e6a0bc46148912360a9f6bd82352 tionTimeout=”20000” URIEncoding=”UTF-8” redirect-
aa” Port=”8443” />
encoding=”md5”>
<connection name=”vnc-conn”> Configurar el servidor x11vnc
<protocol>vnc</protocol> Guacamole necesita un servidor VNC, de forma que el u-
<param name=”hostname”>localhost</param> suario puede acceder al escritorio de forma remota. La imagen
<param name=”port”>5900</param> oficial para C1 ya incluye el servidor x11vnc y no es necesario
<param name=”password”>VNCPASS</param> instalar ningún otro servidor VNC. Para crear un sistema más
</connection> robusto y seguro, se recomienda deshabilitar el acceso directo
<connection name=”ssh-conn”> al sistema a través de puertos como el 5900. En este sentido,
<protocol>ssh</protocol> habilita únicamente el acceso directo al servidor vnc desde loc-
<param name=”hostname”>localhost</param> alhost, como se muestra en las figuras 2 y 3.
</connection>
</authorize> Configuración
</user-mapping> del servidor
X11VNC
Ten en cuenta que esta configuración utiliza la cuenta de
usuario ODROID, que coincide con la cuenta de usuario de
Linux por defecto del C1, por comodidad. Esta cuenta tiene
dos opciones: vncconn y ssh-conn, las cuales permiten distintas
posibilidades de conexión. El puerto vnc y la contraseña vnc
utilizados para la instalación del servidor vnc x11vnc son 5900
y VNCPASS respectivamente. Su contraseña es la equivalente
MD5 a la contraseña ODROID:

$ echo -n odroid | md5sum


54e6a0bc46148912360a9f6bd82352aa -

ODROID MAGAZINE 13
ESCRITORIO REMOTO

Otra En el primer acceso, la sección Recent Connections apa-


configuración recerá en blanco, así que primero haz clic en la opción de ssh-
del servidor conn y se abrirá una sesión similar a terminal sobre el C1. In-
X11VNC troduce la información de acceso y continúa con la conexión

Conexión SSH

SSH, se abrirá una


nueva pestaña como
La contraseña usada aquí es VNCPASS, la misma que se es- esta imagen. Tras
pecifica en el archivo de configuración de usuario de guacamo- experimentar con
le. Guarda los cambios y continuar con la siguiente paso para esta sesión, cierre la
asegurarte de que el servidor VNC funciona correctamente. pestaña SSH y vuelve a la pestaña de sesión original. A con-
tinuación, haz clic en la opción de ssh-conn, se volverá a abrir
Acceso al escritorio
La aplicación web guacamole está configurada para escuchar
Escritorio a
el puerto 8080 a través tomcat6. Desde el equipo de desarrollo
través de la
con escritorio Windows 7, lanza un navegador web compatible conexión VNC
con HTML5 e introduce la dirección http: // <direción-ip-c1>:
8080/guacamole. Aparecerá una pantalla de inicio de sesión,
como la que se muestra a continuación. Introduce la infor- una nueva pesta-
mación de la ña, como la
cuenta de us- siguiente.
uario guaca- Si el servidor
mole, luego snv no está con-
haz clic en el figurado correctamente, es posible que aparezca una pantalla
botón Login. de error similar a la que aparece a continuación.

El resultado de un error
Pantalla de
del servidor VNC
acceso a
Guacamole

Mensaje de error que aparece


al introducir las credenciales
Opciones de conexión de de usuario incorrectas
escritorio remoto
Al iniciar la sesión correctamente, se debe mostrar la pan-
talla de inicio. Ten en cuenta que la aplicación ofrece las dos Si, por alguna razón, intentas acceder al escritorio del
opciones configuradas con anterioridad para este usuario: vnc- ODROID-C1, es posible que veas un fenómeno interesante
conn y ssh-conn. que refleja la naturaleza recurrente del acceso.

¡Ups! Un ejemplo de
acceso al escritorio
recurrente.

Opciones de conexión

ODROID MAGAZINE 14
SO DESTACADO

UBUNTU
STUDIO
UN SET DE HERRAMIENTAS MULTIMEDIA
UNICO Y DE CODIGO ABIERTO
editado por Rob Roy

U
buntu Studio es un sistema operativo gratuito y de có- un enorme conjunto de herramientas para producir audio y
digo abierto que esta empaquetado como una versión música de alta calidad.
oficial de Ubuntu, destinado a personas creativas a las
que le gusta producir arte. Es la distribución GNU/Linux mul- Jack
timedia más usada en todo el mundo, incluye una selección de
las aplicaciones multimedia gratuitas más comunes. Su descar-
ga y uso son gratuitos de forma que puedes estudiar, modificar
y adaptar su código fuente a tus necesidades.

Instalación
Los diferentes paquetes de Ubuntu Studio están disponibles QJackCtl
a través del Gestor de Paquetes Synaptic o la aplicación tasksel.
Para instalar todos los paquetes de software disponibles, escribe Jack es un servidor MIDI y audio de baja latencia, dise-
en una ventana de terminal: ñado para uso profesional. Permite que todas las aplicaciones
compatibles con conectores Jack puedan conectarse entre sí.
$ sudo apt-get install ubuntustudio-dvd-live ubun- Un programa muy omún para controlar el servidor jack es
tustudio-video ubuntustudio-publishing ubuntustudio- Qjackctl, como muestra la imagen de arriba. Jack ofrece bajas
photography ubuntustudio-font-meta ubuntustudio-audio latencias de menos de 5 ms con el hardware adecuado, conexio-
ubuntustudio-graphics nes totalmente flexibles y también actúa como transmisor para
aplicaciones Jack-aware.
Proyecto de la comunidad
Ubuntu Studio es un proyecto colectivo, creado por volun- Ardour
tarios y dirigido a todos los niveles, desde principiantes hasta Ardour es una estación
profesionales. Fácil de instalar y simple de usar proporciona de trabajo de audio digital
todas las herramientas necesarias para crear cualquier tipo de (DAW), ideal para la grabar,
contenido multimedia. Como un derivado de Ubuntu recono- mezcla y masterizar. Algunas
cido oficialmente, Ubuntu Studio esta mantenido por Canoni- de sus características son:
cal Ltd., los productores de Ubuntu, junto con una increíble -Buses y pistas de audio i-
comunidad en continuo crecimiento. Ubuntu Studio es libe- limitadas.
rado cada seis meses, pero las versiones a largo plazo (LTS) sólo -Edición no lineal con
se liberan cada 2 años. anulaciones ilimitadas, no
destructiva.
Producción de audio -Enrutamiento de la señal
Ubuntu Studio pone a disposición algunos de los más en cualquier parte.
populares y recientes programas de audio del mundo Linux, -Plugins pre y pos atenua-
algunos se detallan a continuación. Cuando se utilizan con un dores .
instrumento MIDI como un teclado o con dispositivos de gra- -Ruta de audio punto flo-
bación como un micrófono estándar o por USB, proporcionan tante de 32 bits. Estación de trabajo digital Ardour

ODROID MAGAZINE 15
SO DESTACADO

-Compensación de retardo automático de pista. así tener un control completo sobre los efectos utilizados en
-Automatización exacta de muestras. muestras y grabaciones.
-Formatos de archivo (BWF, WAV, WAV64, AIFF, CAF)
-Más de 200 plugins LADSPA y LV2 gratuitos.
-Control MIDI CC con un clic.
-Control MIDI de nivel 2.
-Código de tiempo MIDI (MTC) Maestro o Esclavo.
-Integración completa con todas las aplicaciones JACK.
-Reproducción Video-sincronizada.

Secuenciadores y sintetizadores Puredata


Ubuntu Studio también incorpora otras aplicaciones inte-
resantes como: Blender
-Audacity, un editor de Audio Wave Blender (www.blender.org) es una completa suite de crea-
-Qtractor, una estación de trabajo de audio digital MIDI ción de contenido 3D, que permite crear modelos 3D y esce-
-Hydrogen, un secuenciador y caja de ritmos nas animadas. Blender también tiene su propio motor de juego
-Yoshimi, un sintetizador basado en software y se puede ampliar con complementos. Las Características de
Blender incluyen:
-Modelado 3D de personajes y formas sólidas
-Animación de escenas
-Funciones de Física y de partículas
-Sombreado
-Motor de juego (crea un juego usando sólo Blender)
-Gestión de Imágenes y compuestos
-Extremadamente ampliable
Audacity, Qtractor, Hydrogen y Yoshimi

Amplificadores de guitarra
virtuales
Rakarrack y Guitarix son dos simuladores amplificadores de
guitarra muy comunes que te permiten crear y usar amplifica-
dores software con tu guitarra eléctrica o electro-acústica.

Blender

Inkscape
Guitarix
Inkscape (www.inkscape.org) es un excelente editor de grá-
ficos vectoriales con capacidades similares a Illustrator, Corel-
Gladish Draw o Xara X, usa el estándar W3C de Gráficos Vectoriales
Gladish, una alternativa a Qjackctl, permite iniciar aplica- Redimensionables (SVG) para el formato de archivos.
ciones, establecer conexiones entre ellas y guardar toda la con-
figuración en un archivo para su posterior uso. InkScape

Programación de audio
Hay numerosos y sencillos entornos de programación de
audio disponibles en Ubuntu Studio, como Pure Data, Super
Collider, Csound y Chuck. Estos programas pueden ser uti-
lizados para crear software que influya en la onda de audio y

ODROID MAGAZINE 16
SO DESTACADO

Openshot GIMP
OpenShot (www.openshot.org) es un simple editor de vídeo GIMP (www.gimp.org) significa Programa de Manipu-
para Linux, permite añadir vídeos, fotos y música para DVDs, lación de Imagen Gnu, es similar a Photoshop. Se puede am-
videos YouTube y muchos otros formatos. pliar a través de complementos y contiene muchas funciones
para efectos visuales, herramientas de recorte, entre otras mu-
chas más características.

GIMP
OpenShot
MyPaint
FFMPEG MyPaint es una herramienta digital para pintar, diseñada
FFMPEG es el sistema líder en los entornos multimedia, para trabajar con tablas gráficas. Viene con una gran colección
capaz de decodificar, codificar, transcodificar, multriplexar, de- de pinceles, incluyendo la tinta y el carbón.
multriplexar, hacer streaming, filtrar y reproducir casi cualquier -Diseñado para tablas gráficas autoadhesivas
formato, soporta desde los más antiguos y pocos conocidos has- -Interfaz de usuario sencilla y minimalista
ta los más modernos y punteros códecs. Contiene libavcodec, -Extensas opciones de configuración y creación de pinceles
libavutil, libavformat, libavdevice, libswscale y libswresample, -Lienzos ilimitados
que pueden ser usados por otras aplicaciones, así como ffmpeg, -Soporte básico de capas
ffserver, ffplay y ffprobe que pueden ser utilizados para la trans-
codificación, hacer streaming y la reproducción.

DVDStyler
DVDStyler se puede usar para crear DVDs personalizados
de apariencia profesional.
-Interfaz de usuario amigable que permite arrastrar y soltar
-Múltiples subtítulos y pistas de audio
-Diseña tu propio menú de DVD o selecciona una plantilla
-Crea una presentación de fotos
-Soporta AVI, MOV, MP4, MPEG, OGG, WMV y otros My Paint
formatos
-Compatible con MPEG-2, MPEG-4, DivX, Xvid, MP2,
MP3, AC3 y otros formatos de audio y vídeo Darktable
Darktable es una aplicación de trabajo fotográfico y desa-
rrollado RAW, con una mesa de luz y cuarto oscuro virtuales
para los fotógrafos. Gestiona tus negativos digitales en una base
de datos, visualizalos en una mesa de luz con zoom. Permite
crear imágenes y mejorarlas.

Shotwell
Puedes utilizar Shotwell para organizar tu biblioteca de fo-
tos, haciendo especial hincapié en hacer las cosas de un modo
DVD Styler simple y amigable.

ODROID MAGAZINE 17
SO DESTACADO JUEGOS ANDROID

-Importar múltiples formatos


-Editar etiquetas
PLANTS VS. ZOMBIES™ 2
-Convertir formatos LOS CLASICOS NUNCA MUEREN,
-Edición simple sobre la marcha ESPECIALMENTE CUANDO NUNCA
-Publicación directa en redes sociales
MUERES
por Bruno Doiche

P
lants vs. Zombies es el tipo de clásico que precede a
la edad de las tablet/smartphone, por lo que no es de
extrañar que fuese mejorado recientemente. Al igual
que el original, es un juego freemium y requiere de mucha
planificación y estrategia en tiempo real para lograr que los
no-muertos ataquen tu casa. ¡Disfruta derrotando a intermi-
Shotwell
nables oleadas de zombies!

Calibre https://play.google.com/store/apps/details?id=com.
Calibre es un programa que facilita las cosas a los nuevos usuarios, ea.game.pvz2_row

ofreciendo excelentes plantillas para formatos comunes, como Kindle,


varios tipos de tablas y lectores de hardware, entre otras funciones.

¡Un divertido viaje a través del tiempo con abundantes zombies!

Calibre

Scribus
Otra gran herramienta para la autoedición es Scribus, te per-
mitirá crear publicaciones profesionales en PDF. Incluye muchas
plantillas para carteles, tarjetas de visita, folletos y muchas más.

Scribus

LibreOffice
LibreOffice es una potente suite de oficina que integra varias
aplicaciones similares a las encontradas en Microsoft Office. Por
ejemplo, con LibreOffice Writer puede crear texto y guardarlo
en cualquier formato que desees, incluyendo los formatos de
MS Office, así como expórtalos a PDF.

ODROID MAGAZINE 18
PLACA METEOROLOGICA

JUGANDO CON LA PLACA


METEOROLOGICA
TECNOLOGIA PARA LAS CUATRO ESTACIONES
por Jussi Opas

L
a placa meteorológica de Hardkernel, un económico
complemento para el periférico ODROID-SHOW,
permite registrar fenómenos meteorológicos como el
índice UV, la presión barométrica, la altitud, la humedad rela-
tiva, la iluminación y la temperatura. En este artículo, mostra-
remos cómo leer los valores de los sensores
de la placa meteoróloga utilizando Java,
así como integrar su lectura en un servicio
web basado en Java, usando para ello el
moderno entorno de trabajo Play. Al utili-
zar un entorno web, los valores se pueden
ver desde un navegador en una red local o
a través de Internet.

Caso práctico
Vamos a suponer que en algún lugar, lejos de casa, tenemos
una casa rural. La cual ha sido creada para descansar en in-
vierno y se ha bajado la calefacción para ahorrar energía y man-
tener seco el interior de la misma. Para conocer las condiciones
actuales de la casa, tendríamos que conducir un largo trayecto
o pedirle a un vecino que se pase por la casa, para ver si la ca-
lefacción sigue encendida o si una ventana se ha roto. En este
caso, una placa meteorológica con sensores nos sería de gran
ayuda. Si hay Internet y corriente electica, podemos configurar
la placa meteorológica junto con un ordenador para medir de
forma continua las condiciones del interior de la casa.
Para obtener las mediciones, debemos tener:
1) Una placa meteorológica conectada a un ordenador,
2) Saben leer valores de los sensores de la placa de forma con-
tinua o cuando lo necesitemos, y
3) Implementar las mediciones como un servicio web.

Comenzamos
El primer requisito queda resuelto con la compra de una
placa meteoróloga junto con una placa ODROID-SHOW de
Hardkernel. Programar y controlar el sistema mediante un or-
denador ODROID sería un plus, pero no es necesario. Bási-

ODROID MAGAZINE 19
PLACA METEOROLOGICA

camente, cualquier equipo compatible con Java y un puerto


USB nos vale, ya que el SHOW puede conectarse de forma
universal a través de USB. El tamaño de la placa meteorológica
con sensores es 20x20mm, y el tamaño del ODROID-SHOW
es 48x83mm. Aquí tienes
la placa meteorológica co-
nectada a un SHOW junto
con un Lego chef.
Los sensores de la placa
son SI7020 para la hume-
dad, BMP180 para presión
del aire y SI1132 para la ilu-
minación. La placa SHOW
se puede configurar fácil-
mente cargando el código
de muestra disponible en la
página wiki de Hardkernel.
Tras cargar el software de los
sensores en el microcontrolador de la placa ODROID-SHOW,
los valores se mostrarán en la pantalla TFT.

Lectura de valores de sensores


El código fuente de la aplicación de escritorio basada en
Qt muestra cómo se pueden leer los valores de los sensores de
forma continua. Sin embargo, queremos tener acceso a estos
valores desde Java. Podríamos escribir un programa basado en
C o C++ que lea la secuencia desde la conexión serie y luego es-
cribirla en un archivo en intervalos adecuados. Luego, un pro-
grama Java podría leer los valores desde ese archivo. Sin embar-
go, si un programa Java lee directamente el flujo de datos desde
la conexión serie, no es necesario ningún archivo intermedio.
Escribimos una apli-
cación Java para acceder
directamente a los valores
y agrupamos el proceso de
lectura en tres clases Java:
Measurement, SensorDa-
taReader y WeatherBoard.
La clase Measurement re-
presenta los valores de los
sensores y su tratamiento,
valor, unidad y recono-
cimiento de como se leen
desde el flujo de datos. Hay 7 valores distintos de los sensores Modelo Placa Meteorológica
que son enviados por el puerto serie.
La clase SensorDataReader lee el flujo de datos de entrada
correctamente interpretando el delimitador entre los valores
dentro del flujo de datos, y decide cuándo dejar de leer. Por
último, pero no menos importante, es la clase weatherboard
que implementa un método para abrir el puerto serie para leer
y enviar el resultado como un mapa de mediciones. La clase

ODROID MAGAZINE 20
PLACA METEOROLOGICA

weatherboard puede invocar la lectura como una operación


ad-hoc o como un hilo de ejecución continuo. Aunque la a-
bstracción tiene la capacidad de producir un flujo continuo de
valores, sólo hemos usando los métodos de lectura ad-hoc. El
Código fuente de ejemplo para la lectura del puerto serie con
Java está en los foros ODROID en http://bit.ly/1GsQKw8.
Las Imágenes Lubuntu pre-compiladas de Hardkernel ya
tienen instalado Java. También tienen una librería que permite
vincular la entrada de datos al puerto serie. Los dos archivos
RX*.jar se encuentran en la carpeta /usr/share/java, y las respec-
tivas librerías nativas están guardadas como archivos /usr/lib/
jni/librxtx*.so. Para aquellos sistemas que aún no las tengan, se
pueden descargar e instalar con el siguiente comando:

$ sudo apt-get install librxtx-java

Otra alternativa es descargar una aplicación desde los re-


positorios de Debian que vincule Java al puerto serie. Tras la
extracción, podemos localizar las librerías de acuerdo a nuestras
preferencias, como se muestra en http://bit.ly/15wqqke. Du-
rante el desarrollo nosotros utilizamos este método.
Antes de ejecutar el script, cada plataforma (ARM, X86,
Linux y Windows) debe tener compiladas correctamente las li-
brerías nativas. Deben ser referenciadas correctamente al com-
pilarlas por línea de comandos o con un entorno de desarrollo
interactivo (IDE). Con un IDE, añadimos “-Djava. library.
path =/usr/lib/jni” como una opción en la máquina virtual para
que las librerías nativas sean utilizadas en tiempo de ejecución.
La implementación y la abstracción java también se pueden
utilizar con otros contenedores de servicios Java.

Línea de comandos
Guardamos el código fuente de Java en la carpeta practice
usando la línea de comandos, como se muestra en la Figura 4.

Directorio Practice
También creamos el directorio practice/out en el que se
encuentran las clases de Java compiladas. En primer lugar, cam-
biate al directorio practice:

$ cd practice

Después, crea un archivo llamado manifest.txt dentro del


directorio practice. El contenido debe ser el siguiente:

ODROID MAGAZINE 21
PLACA METEOROLOGICA

Main-Class: serial.WeatherBoard

Luego, escribe los comandos javac en build.sh:

#!/bin/bash
javac src/serial/*.java -d ./out -cp /usr/share/java/
RXTXcomm.jar:/usr/share/RXTXcomm-2.2pre2.jar

Por último, escribe los comandos de empaquetado jar en


pack.sh:

#!/bin/bash
clear
echo “make wboard.jar”
current=.
cd out
jarfile=../wboard.jar
classes=./serial
jar cmf ../Manifest.txt $jarfile $classes/*
cd $current

Ahora, se puede compilar y empaquetar el código fuente en


el archivo wboard.jar:

$ sh build.sh
$ sh pack.sh

Para poder acceder al puerto serie, los usuarios deben tener


los privilegios correctos. En Debian, el comando “sudo addus-
er <usuario> dialout” añade un usuario al grupo dialout. Para
hacer efectivo el cambio, hay que ejecutar el comando newgrp
o iniciar sesión de nuevo.
El último archivo a escribir es run.sh, que
vincula wboard.jar, las librerías RXTX *.jar y
las librerías nativas instaladas en /usr/lib/jni,
luego invoca la lectura del puerto serie:

#!/bin/bash
java -cp wboard.jar:/usr/share/java/
RXTXcomm.jar:/usr/share/java/RXTXcomm-
2.2pre2.jar -Djava.library.path=/usr/
lib/jni serial.WeatherBoard

Se puede entonces activar el monitoreo del


puerto serie de forma continua:

$ sh run.sh

La ventana de Terminal mostrará un flu-


jo continuo de valores de los sensores, como
muestra esta imagen.
Valores de sensores en una ventana
de terminal
ODROID MAGAZINE 22
PLACA METEOROLOGICA

Entorno de trabajo Play


Play es un contenedor de servicios java sin JEE de desarrollo
moderno e implementación amigable. Los servicios se pueden
programar con Java y/o Scala, y para desarrollar páginas web y
sus diseños hay que saber HTML y CSS. Play se puede descar-
gar desde las páginas principales del entorno de trabajo Play en
http://bit.ly/1uz0UU0. Nosotros usamos la versión 2.2.2:

$ cd ~ && mkdir Applications && cd Applications


$ wget http://downloads.typesafe.com/play/play-
2.2.2.zip

Si wget no funciona, simplemente visita la página de des-


carga del entorno de trabajo Play y hacer clic en el enlace ade-
cuado. Una vez finalizada la descarga, descomprime el archivo:

$ sudo apt-get install p7zip-full


$ 7z x play-2.2.2.zip

Con vistas al desarrollo, hemos extraído Play en la carpeta


~/Applications, luego añadimos el comando “play” a la varia-
ble PATH abriendo el archivo ~/.profile en un editor de texto y
añadiendo las siguientes líneas:

if [ -d “$HOME/Applications/play-2.2.2” ] ; then
PATH=”$HOME/Applications/play-2.2.2:$PATH”
fi

La definición se puede utilizar inmediatamente ejecutando


el comando “source ~/.profile”. Inicia una aplicación de ejem-
plo escribiendo lo siguiente:

$ cd ~/Applications/play-2.2.2/samples/java/hello�
-
world
$ play

Play se iniciará ahora mostrando el prompt. A continua-


ción, inicia la aplicación:

[helloworld] $run

El servicio ya está listo. Abre un navegador y navega a


“http://localhost: 9000”, aparecerá una simple aplicación web.
El uso de memoria del servicio Play se puede definir en la
última línea del archivo ../play-2.2.2/framework/build, usan-
do valores similares a -Xms128M -Xmx256M o -Xms32M
-Xmx64M. Para crear un nuevo proyecto, escribe:

play new weather

ODROID MAGAZINE 23
PLACA METEOROLOGICA

Esto crea un nuevo proyecto Play con el nombre weather.


Después, activa el proyecto recién creado:

cd weather
play
run

Las páginas web y aplicaciones de Play se pueden desarro-


llar sin un IDE, ya que la aplicación será compilada cuando se
modifique cualquier archivo y la página del navegador se actua-
lice. Los errores también aparecen en la página del navegador.

Librerías
Las librerías Java externas se compilan automáticamente en
la aplicación Play, siempre y cuando se encuentran
en la carpeta lib de la aplicación weather. En nuestro
caso, esto significa que los archivos .jar se encuen-
tran en el directorio /weather/lib, que contiene los
archivos RXTXcomm.jar y RXTXcomm-2.2pre2.
jar. Colocamos también los archivos .so específicos
para ARM en la misma carpeta.
Sin embargo, con este método sólo se incluyen
los archivos .jar. Además hemos definido la carga
explícita de las librerias nativas creando un archivo
Global.java en la carpeta/weather/app/controllers:
import play.*;
public class Global extends GlobalSettings {
Librerías añadidas
@Override
public void beforeStart(Application app) {
super.beforeStart(app);
...
System.load(“/home/odroid/Applica�
-
tions/weather/lib/librxtxSerial.so”);
System.load(“/home/odroid/Applica�
-
tions/weather/lib/librxtxSerial-2.2pre1.so”);
...
}
}

También hay que incluir la ruta de la librería cuando se ac-


tiva el servicio Play:

$ vi invoke.sh

Inserta las siguientes instrucciones en el archivo:

play -Djava.library.path=$HOME/Applications/weather/
lib start

A continuación, inicia la aplicación:

ODROID MAGAZINE 24
PLACA METEOROLOGICA

$ chmod +x invoke.sh
$ ./invoke.sh

Aplicación Play
El archivo weather/conf/routes contiene las siguientes
definiciones:

GET /weather controllers.Application.getWeath�


-
er()
GET /refresh controllers.Application.refresh�
-
Weather()

Se definen dos páginas web. La primera esta en consonancia


con el concepto del entorno de trabajo de Play, como se mues-
tra en el archivo /view/index.scala.html:

@(weatherForm: Form[Application.Weather])
@import helper._
@main(title = “Play with Weather Board”) {
<h1>Sensors</h1>
<ul>
<li>Si7020, humidity</li>
<li>SI1132, ambient light</li>
<li>BMP180, air pressure</li>
</ul>
@form(action = routes.Application.getWeather,
args = ‘id -> “weatherform”) {
@inputText(
weatherForm(“name”).copy(value=Some(“/
dev/ttyUSB0”)),
args = ‘_label -> “Port name”, ‘size -> 9
)
@inputText(
weatherForm(“time”).
copy(value=Some(“5”)),
args = ‘_label -> “First read time as
sec?”, ‘size -> 3
)
<p class=”buttons”>
<input type=”submit” value=”Get values”>
<p>
}
}

Hay dos campos definidos, aunque el nombre del puerto no


se puede editar. Sin embargo, el tiempo de lectura máximo del
sensor si se puede editar. La definición de la página de resulta-
dos (/view/weather.scala.html) es todavía más breve:

@(name: String, time: Int, measurements:


List[String])

ODROID MAGAZINE 25
PLACA METEOROLOGICA

@main(“Play with Weather Board”) {


<h1>Sensors’ values</h1>
<ul>
@for(measurement <- measurements) {
<li>@measurement</li>
}
</ul>
<p class=”buttons”>
<a href=”@routes.Application.index”>Back to
sensors page</a>
<a href=”@routes.Application.
refreshWeather”>Refresh</a>
</p>
}

Esta definición es transformada automáticamente en una


invocación de lectura de la placa meteorológica por el entorno
de trabajo de Play. A continuación se muestra nuestra imple-
mentación del servicio del sensor meteorológico:
public class Application extends Controller {
public static Weather data;

public static class Weather {


public String name;
@Min(1) @Max(60) public Integer time;
public List<String> measurements;
}

public static Result index() {


return ok(index.render(form(Weather.class)));
}

public static Result getWeather() {


Form<Weather> form = form(Weather.class).
bindFromRequest();
if (form.hasErrors()) {
return badRequest(index.render(form));
} else {
data = form.get();
try {
data.measurements =
readMeasurements(data.name, data.time, 0);
} catch (Exception e, data.name) {
return handleErrors(e);
}
return ok(weather.render(data.name, data.
time, data.measurements));
}
}

public static Result refreshWeather() throws Ex-

ODROID MAGAZINE 26
PLACA METEOROLOGICA

ception {
List<String> measurements =
readMeasurements(data.name, data.time, 0);
return ok(weather.render(data.name, data.
time, measurements));
}

static List<String> readMeasurements(String port,


int time, int logLevel) throws Exception {
WeatherBoard board = new WeatherBoard();
return transform(board.
readContinuously(port, time, logLevel));
}

private static List<String> transform(Map<String,


Measurement> data) {
List<String> measurements = new
ArrayList<String>();
String today = (new Date()).toString();
measurements.add(today);
for (Measurement measurement: data.values())
{
measurements.add(“” + measurement);
}
return measurements;
}

private static Result handleErrors(Exception e,


String portName) {
if (e instanceof NoSuchPortException) {
String message = (new PortFinder()).prepar
ePortErrorMessage(portName);
return internalServerError(message);
} else {
e.printStackTrace();
return internalServerError(e.getMes�
-
sage());
}
}
}

La hoja de estilo está basada en el proyecto


de ejemplo helloworld de Play, no incluido aquí.

Páginas web Play con la pagina de la placa meteo-


Las páginas web resultantes se muestran aquí, rologicca y los valores de los sensores
la página principal es la de la izquierda.
Al pulsar el botón “Get values” se activa la
lectura continua de valores. Los resultados de la
lectura se muestran en la página de los valores de
los sensores. La página también se puede actuali-

ODROID MAGAZINE 27
PLACA METEOROLOGICA

zar para mostrar los valores más recientes. Si el puerto no está


disponible aparecerá un mensaje de error:

Port /dev/ttyUSB0 was not found, please try another.


Available ports are:
/dev/ttyUSB1
/dev/ttyACM99

Con esta información, se puede escribir /dev/ttyUSB1 en la


página principal y obtener los valores de los sensores de nuevo.

Conclusiones
Una vez que los pasos se hayan completado, todos los miem-
bros de la familia podrán chequear el tiempo de la casa rural
desde cualquier lugar, siempre y cuando estén conectados a
Ethernet. Sin embargo, sólo un lector puede acceder al flujo de
datos de los sensores al mismo tiempo, ya que la aplicación de
escritorio basado en Qt y C++ no puede obtener valores mien-
tras que un lector de Java esté consumiendo el flujo de datos
desde el puerto serie. El programa lector de Java lee 7 valores de
medición y luego se detiene. Aunque, es posible que nunca se
puedan leer los 7 valores, porque no estarán disponibles todas
las mediciones. Por ejemplo, durante la noche, cuando no haya
luz, no habrá ningún valor relacionado con la iluminación.
Adaptar el límite de tiempo para la primera activación también
es posible a través de la página web.
Para los casos en los que varios usuarios intentan acceder al
sistema, el servicio mantiene un archivo con los datos de los
últimos valores con el fin de proporcionar una rápida respuesta.
Nosotros no almacenamos valores en archivos. En su lugar, el
servidor guarda los últimos valores de los sensores que se enviar
como respuesta a cada solicitud. El servicio es tan pequeño que
se puede implementar en cualquier ODROID que tenga java
y las librerías nativas para la lectura de puerto serie, incluso
en el modelo C1. Para fines de desarrollo, es mejor usar un
ODROID-U3 o ODROID-XU3.

ODROID MAGAZINE 28
DESARROLLO ANDROID

DESARROLLO
ANDROID
CONFIGURACION DE DISPOSITIVOS
por Nanik Tolaram

Q
uizás estés familiarizado con los como parte del proceso de desarrollo de positivos Nexus que vienen de serie con
muchos y diferentes dispositivos Android. Android es muy flexible a la AOSP, como el Google Nexus Tablet
Android que actualmente hay hora de configurar el dispositivo, pero 72012 (grouper) y el Nexus2013 (flo).
disponibles, con una enorme diversi- hay ciertas reglas que deben seguirse con La Figura 2 muestra el interior del direc-
dad de componentes hardware como el el fin de garantizar que existe un cierta torio hardkernel, que contiene algunas
tamaño de pantalla, de periféricos dis- coherencia entre los dispositivos. El pro- de las placas de Hardkernel: ODROID-
ponibles y con multitud de finalidades, ceso que hay detrás de estas reglas y la U (ODROIDU3), ODROID-X y
desde teléfonos móviles a instalaciones integración de los diferentes drivers du- ODROID-X2. Dentro de estos direc-
sobre vehículos. Android funciona en rante el proceso de desarrollo está fuera torios puedes encontrar los drivers y las
casi cualquier parte, aunque tal vez te del alcance de este artículo, y será tratado configuraciones para crear script especí-
preguntes cómo es posible que pueda en futuras entregas. Por ahora, sólo anali- ficos para los ODROIDs. En la figura
funcionar con tantas y diferentes con- zaremos cómo están configurados los 3, puedes ver el contenido del directorio
figuraciones de hardware, y al mismo dispositivos dentro de Android y cómo odroidu/ que contienen los detalles de la
tiempo usar tanta variedad de sensores son de relevantes para el proceso de de- configuración de la placa ODROID-U3.
y recursos. A diario, vemos que salen a sarrollo, utilizando el ODROID-U3 con Vamos a echar un vistazo a cada uno de
la venta nuevos dispositivos compatibles Android4.4.4 Kitkat como ejemplo. los archivos y directorios en los siguientes
con periféricos de proveedores poco apartados.
conocidos. ¿Cómo es posible integrar device/
tantos y tan diversos tipos de hardware La forma más común de encontrar bluetooth/
dentro de los dispositivos Android? La las configuraciones de los dispositivos en El directorio bluetooth contiene
mayor parte de la integración se debe un único archivo llamado bdroid_
al potencial de Linux, puesto que es un buildcfg.h, utilizado básicamente para
sistema muy maduro que permite a los el sistema bluetooth de Android. Este
proveedores de hardware crear sus pro-
pios productos con sus propios drivers. Figura 2 : Configuración placa ODROID
Sin embargo, todavía hay muchos pro-
veedores que no quieren liberar el código
de sus drivers software como proyectos
Figura 1: Configuración placa Hardkernel
de código abierto, de modo que los dri-
vers están empaquetados como archivos
binarios, que en la jerga de Linux son Adroid es mirando dentro de la carpeta
conocidos como Binary Large Objects device/ como muestra la Figura 1. La
(BLOBs). configuración de las placas ODROID se
Los diferentes dispositivos requieren encuentra dentro de device/hardkernel/.
de configuraciones y ajustes indepen- Junto con las placas ODROID, pue-
dientes, necesarios para ser incluidos des encontrar configuraciones para dis-

ODROID MAGAZINE 29
DESARROLLO ANDROID

drivers/
Los drivers binarios necesarios para
los periféricos, como WiFi, Ethernet y
audio los pueden encontrar aquí. Estos
archivos son copiados durante el proceso
de compilación a /system/ lib/modules/.

overlay/
Este directorio contiene configura-
ciones de las aplicaciones del sistema que
pueden ser modificadas por el usuario.
Figura 6 : Directorio overlay
Como puede verse en la figura 6, hay
unos cuantos archivos .xml dentro de la
Figura 3 : Configuración ODROID-U3 carpeta res/. Si abrimos uno de los archi- de las aplicaciones. Verás el apk en la
vos como el power_profile.xml, verás la Figura 7 cuando compiles tus propios ar-
archivo contiene muchas opciones de siguiente configuración: chivos de imágenes de Android o cuando
configuración, como el nombre del dis- descargues una imagen pre-compilada
positivo y el tipo de soporte bluetooth <item name=”bluetooth.ac�
- desde http://bit.ly/1xkxreJ. El archivo
que ofrece el dispositivo. tive”>10</item> <!-- Bluetooth que ordena al proceso de compilación
data transfer, ~10mA --> incluir estos apks se puede ver en device/
conf/ <item name=”bluetooth.on”>0.1</ hardkernel/odroidu/device.mk como
El directorio conf contiene archivos item> <!-- Bluetooth on & con- muestran las figura 8a y 8b.
de configuración, como códecs, fstab nectable, but not connected, El directorio propietary/bin contiene
(dispositivo en bloque), los archivos .rc y ~0.1mA --> archivos que son importantes para los
el archivo ueventd. Ver Figura 4. <item name=”wifi.on”>3</item> componentes táctiles y los teclados. El
<!-- ~3mA --> archivo Vendor_2808_Product_81c9.

Figura 7 : Directorio apk


Figura 4 : Directorio conf La configuración anterior (bluetooth.
active, bluetooth.on y wifi.on) será usada
para reemplazar el contenido original del
archivo framework/base/core/res/res/
xml/power_profile.xml.

proprietary/
Este directorio en particular es muy
interesante, ya que contiene muchos ar-
chivos propietarios que están empaque-
tados formando parte de la imagen de
Figura 5 : Directorio drivers Android. El primer directorio es la car-
peta apk/ que contiene los archivos .apk

Figura 8a: device.mk

Figura 8b: device.mk

ODROID MAGAZINE 30
ANDROID DEVELOPMENT
DESARROLLO ANDROID

la configuración de los dispositivos tác-


tiles disponibles para su uso. La Figura
9 muestra el contenido del archivo
de configuración del dispositivo táctil
ODROID-VU.
La carpeta proprietary/lib contiene
varios archivos de librerías .so que son
Figura 9 : Vendor_2808_Product_81c9.idc utilizados por los archivos .apk, como se
muestra en la Figura 10. El último di-
idc corresponde a la pantalla táctil del rectorio proprietary/uboot_4412 (ver fi-
ODROID-VU, detallado en la página gura 11) es importante porque contiene
30 del número de agosto de 2014 de el Gestor de arranque de Samsung y los
ODROID Magazine. La mayoría de binarios uboot de ODROID. ¡Sin estos
los archivos de este directorio son co- archivos, la placa no podría arrancar! El
piados en el archivo de imagen, y pos- código fuente del gestor de arranque no
teriormente utilizados por el subsistema está disponible, pero el código uboot
de entradas de Android para entender de ODROID se puede descargar desde
http://bit.ly/1ydj3cb. El otro archivo
Figura 10 : Archivos de librerías .so llamado zImage es la imagen del kernel
pre-compilada, creada durante el proce-
so de compilación y también usada para
arrancar la placa.

Figura 11 : Archivos Gestor Arranque

La arquitectura de configuración de los dispositivos Android está diseñada para funcio-


nar con muchos tipos de periféricos.

ODROID MAGAZINE 31
C1 AL MINIMO

INSTALACION MINIMA EN UN
ODROID-C1
VUELTA A LOS
CONCEPTOS BASICOS
por segfault@kill-9.me

M
i Odroid C1 está equipado chromium-codecs-ffmpeg-extra
con un módulo eMMC de Solucionar udev colord cups cups-browsed cups-bsd
8GB. Por otro lado, todavía cups-client cups-common cups-
no existen versiones “consola” de nin- # echo > /etc/udev/rules.d/70- core-drivers cups-daemon cups-
guno de los sistemas operativos propor- persistent-net.rules driver-gutenprint cups-filters
cionados por Hardkernel. Los únicos # reboot cups-filters-core-drivers cups-
disponibles hasta el momento tienen ins- ppdc cups-server-common deadbeef
talado el software GUI, lo cual es innece- Elimiar Network- dmz-cursor-theme docbook docbook-
sario en mi caso. Esto significa que casi Manager dsssl docbook-to-man docbook-xml
4 GB de espacio en disco son utilizados docbook-xsl evince evince-common
inútilmente. Haciendo algunas pruebas, # echo >> /etc/network/interfaces evolution-data-server-common
conseguí quitar todo lo que no necesita- # echo auto eth0 >> /etc/network/ extra-xdg-menus faenza-icon-theme
ba mi ODROID C1 y lo he condensado interfaces fbset ffmpegthumbnailer filezilla
en unas pocas líneas de código. Hay que # echo iface eth0 inet dhcp >> / filezilla-common file-roller
tener en cuenta unas cuantas cuestiones etc/network/interfaces flite1-dev:armhf fontconfig font-
en las imágenes eMMC, algunas relacio- # stop network-manager config-config fonts-arabeyes
nadas con problemas de seguridad: # echo “manual” | tee /etc/init/ fonts-arphic-ukai fonts-arphic-
1. Las Claves del servidor SSH no se network-manager.override uming fonts-dejavu fonts-dejavu-
generaron en el primer arranque. # reboot core fonts-dejavu-extra fonts-
2. Las reglas udev para dispositivos droid fonts-farsiweb
de red no se limpiaron antes de crear la Eliminar X11 fonts-freefont-ttf fonts-kacst
imagen. La interfaz principal de ethernet paquetes fonts-kacst-one fonts-khmeros
figura como eth1 en lugar de eth0. fonts-khmeros-core fonts-lao
3. Network Manager está instalado. # apt-get remove abiword abiword- fonts-liberation fonts-lklug-sin-
Necesitas editar /etc/network/interface y common abiword-plugin-grammar hala fonts-lyx fonts-manchufont
luego desactivar Network Manager. abiword-plugin-mathview ac- fonts-mgopen fonts-nafees fonts-
countsservice acl alsa-base nanum fonts-nanum-coding fonts-
Para empezar, conéctate como root alsa-utils anthy anthy-common opensymbol fonts-sil-abyssinica
con el comando “su” antes de seguir con apport apport-gtk apport-symptoms fonts-sil-ezra fonts-sil-gentium
el siguiente paso. ¡Se recomienda copiar aria2 aspell audacious audacious- fonts-sil-gentium-basic fonts-
y pegar los comandos! plugins:armhf audacious-plugins- sil-padauk fonts-sil-scheherazade
data autopoint axel bind9-host fonts-takao-gothic fonts-takao-
Claves SSH blueman bluez bluez-alsa:armhf mincho fonts-takao-pgothic
bluez-cups camorama chromium- fonts-thai-tlwg fonts-tibetan-
# dpkg-reconfigure openssh-server browser chromium-browser-l10n machine fonts-tlwg-garuda fonts-

ODROID MAGAZINE 32
C1 AL MINIMO

tlwg-kinnari fonts-tlwg-loma gstreamer1.0-plugins-good-doc xinit xdg-user-dirs-gtk xdg-user-


fonts-tlwg-mono fonts-tlwg-norasi gstreamer1.0-pulseaudio:armhf dirs xarchiver x11proto-xinerama-
fonts-tlwg-purisa fonts-tlwg-sa- gstreamer1.0-tools gvfs-common dev x11proto-xf86vidmode-dev
wasdee fonts-tlwg-typewriter gvfs-libs:armhf hicolor-icon- x11proto-xf86dri-dev x11proto-
fonts-tlwg-typist fonts-tlwg-typo theme hplip-data hunspell-en-us xcmisc-dev x11proto-video-dev
fonts-tlwg-umpush fonts-tlwg-wa- imagemagick-common java-common x11proto-record-dev x11proto-ran-
ree fonts-ukij-uyghur fonts-un- jade joe kerneloops-daemon dr-dev x11proto-present-dev
fonts-core foomatic-db-com- ladspa-sdk laptop-detect lightdm x11proto-kb-dev x11proto-dri3-dev
pressed-ppds fuse libfontconfig1 link-grammar-dictionaries-en x11proto-dri2-dev x11proto-dmx-
libgtk2.0.0 libpango-1.0.0 lintian linux-sound-base lubuntu- dev x11proto-bigreqs-dev diction-
libqt5widgets5 snappy transmis- lxpanel-icons openjdk-7-jre aries-common libavc1394-0:armhf
sion-qt transmission-cli foomat- ca-certificates-java aspell libavresample1:armhf
ic-filters gir1.2* zenity-common aspell-en fonts-dejavu-core libavutil52:armhf
yelp-xsl yasm xvfb xtrans-dev lxmenu-data lxsession-data m4 libbluetooth3:armhf
xsltproc xserver-common xscreen- make maliddx mc mc-data mesa- libbluray1:armhf libbonobo2-com-
saver-data xscreensaver-screen- utils mesa-utils-extra metacity- mon libbonoboui2-common libboost-
saver-bsod x11-common xfconf common mircommon-dev:armhf atomic1.54.0:armhf libboost-
xfce4-dev-tools xfce4-power-man- mobile-broadband-provider-info chrono1.54.0:armhf
ager-data xdg-utils xauth xbit- modemmanager mysql-common nauti- libboost-date-time1.54.0:armhf
maps xdg-user-dirs xkb-data lus-data netpbm obex-data-server libboost-
xorg-docs-core xorg-sgml-doctools openprinting-ppds p11-kit p11- serialization1.54.0:armhf lib-
autoconf autoconf2.13 automake kit-modules:armhf pastebinit boost-system1.54.0:armhf lib-
autotools-dev avr-libc avrdude pcmciautils pidgin-data poli- boost-thread1.54.0:armhf libbs2b0
binutils binutils-avr build-es- cykit-desktop-privileges poppler- libburn4 libcaca0:armhf lib-
sential ccache cdbs cmake cmake- data printer-driver-c2esp print- camel-1.2-45 libcdaudio1 libcddb2
data comerr-dev command-not- er-driver-foo2zjs-common libcdio-cdda1 libcdio-paranoia1
found-data cpp cpp-4.8 printer-driver-min12xxw pulseau- libcdio13 libcdparanoia0:armhf
desktop-file-utils dpkg-dev dio python-cups python-cupshelp- libcdt5 libcec libcgraph6
fakeroot firefox-locale-en flex ers qpdf quilt rfkill samba-com- libcogl15:armhf
bison g++ g++-4.8 gcc gcc-4.8 mon samba-common-bin libcolamd2.8.0:armhf
gcc-avr gconf-service gconf-ser- samba-libs:armhf sgml-base libcolord1:armhf
vice-backend gconf2 gconf2-common sgml-data sgmlspl smbclient libcolorhug1:armhf libcompfaceg1
gdb gdebi-core genisoimage sound-theme-freedesktop swig libcrack2:armhf libcroco3:armhf
giblib1:armhf glmark2-data swig2.0 sylpheed-doc system-con- libcue1 libcups2:armhf
glmark2-es2 gnome-accessibility- fig-printer-common system-config- libcupscgi1:armhf
themes gnome-desktop-data gnome- printer-udev t1utils transmis- libcupsfilters1:armhf
desktop3-data gnome-menus gnome- sion-common tsconf libcupsimage2:armhf
panel-data gnome-pkg-tools ttf-bengali-fonts ttf-devanagari- libcupsmime1:armhf
gnome-themes-standard-data fonts ttf-gujarati-fonts ttf-in- libcupsppdc1:armhf
gnumeric-common gobject-intro- dic-fonts-core ttf-kannada-fonts libdatrie1:armhf libdc1394-
spection gstreamer0.10-nice:armhf ttf-malayalam-fonts ttf-oriya- 22:armhf libdca0:armhf libdirac-
gstreamer0.10-plugins-base:armhf fonts ttf-punjabi-fonts ttf-tam- decoder0:armhf libdirac-
gsfonts gsettings-desktop-schemas il-fonts ttf-telugu-fonts ttf- encoder0:armhf libdiscid0:armhf
gstreamer0.10-plugins-base:armhf ubuntu-font-family usbmuxd libdjvulibre-text
gstreamer1.0-alsa:armhf uvcdynctrl uvcdynctrl-data libdjvulibre21:armhf
gstreamer1.0-doc gstreamer1.0- valgrind whoopsie wireless-tools libdmx1:armhf libdrm-
libav:armhf gstreamer1.0-plugins- wpasupplicant wvdial x11-xfs- nouveau2:armhf libdrm-
bad-doc gstreamer1.0-plugins- utils xbmc xinput xserver-xorg- radeon1:armhf libdv4:armhf
base:armhf core xfce4-power-manager xfonts- libdvdnav4:armhf
gstreamer1.0-plugins-base-apps 100dpi xfonts-base xfonts-mathml libdvdread4:armhf libegl1-
gstreamer1.0-plugins-base-doc xfonts-scalable xfonts-utils mesa:armhf libdrm-omap1:armhf

ODROID MAGAZINE 33
C1 AL MINIMO

libegl1-mesa-drivers:armhf libjack-jackd2-0:armhf lite8:armhf libproxy1:armhf


libexo-common libexo-helpers libjasper1:armhf libjavascript- libqmi-glib0:armhf
libfaad2:armhf libfakeroot:armhf coregtk-3.0-0:armhf libqpdf13:armhf libquvi-scripts
libfftw3-bin libfftw3- libjbig0:armhf libjbig2dec0 libraptor2-0:armhf librarian0
double3:armhf libfftw3- libjna-java libjpeg-turbo8:armhf librasqal3:armhf libraw1394-
single3:armhf libflac8:armhf libjpeg8:armhf libjs-jquery 11:armhf librxtx-java
libfontembed1:armhf libjte1 libkate1 liblavjpeg-2.1-0 libsamplerate0:armhf libsane-com-
libfontenc1:armhf libframe6:armhf liblcms2-2:armhf liblircclient0 mon libsbc1:armhf libschroeding-
libfreetype6:armhf libllvm3.4:armhf liblockfile-bin er-1.0-0:armhf libsecret-
libfribidi0:armhf libfs6:armhf liblockfile1:armhf libloudmouth1-0 1-0:armhf libsecret-common
libftdi1:armhf libfuse2:armhf liblqr-1-0:armhf libltdl7:armhf libshairplay libsidplayfp:armhf
libgbm1:armhf libgck-1-0:armhf liblua5.2-0:armhf libmad0:armhf libsoundtouch0:armhf libsp1c2
libgcr-3-common libgcr-base- libmbim-glib0:armhf libmeanwhile1 libspeex1:armhf
3-1:armhf libgda-5.0-common libmenu-cache-bin libmenu-cache3 libspeexdsp1:armhf libsrtp0
libgdk-pixbuf2.0-0:armhf libgdk- libmessaging-menu0 libmi- libt1-5 libtag1-vanilla:armhf
pixbuf2.0-common libgdome2-0 crohttpd10 libmikmod2:armhf libtag1c2a:armhf libtagc0:armhf
libgdome2-cpp-smart0c2a libmimic0 libmirprotobuf0:armhf libtcl8.6:armhf libtelepathy-
libgeis1:armhf libgeoclue0:armhf libmjpegutils-2.1-0 libmms0:armhf glib0:armhf libthai-data
libgeoip1:armhf libgif4:armhf libmodplug1 libmp3lame0:armhf libtheora0:armhf libudisks2-
libgirepository-1.0-1 libgl1-me- libmpcdec6 libmpeg2-4:armhf 0:armhf libusbmuxd2
sa-dri:armhf libgl1-mesa- libmpeg2encpp-2.1-0 libmpg123- libv4l2rds0:armhf libva1:armhf
glx:armhf libglapi-mesa:armhf 0:armhf libmplex2-2.1-0 libvdpau1:armhf libvisual-0.4-
libgles1-mesa:armhf libgles2- libmtdev1:armhf libmtp-common 0:armhf libvo-aacenc0:armhf
mesa:armhf libglib2.0-doc lib- libmtp-runtime libmtp9:armhf libvo-amrwbenc0:armhf
glib-perl libgme0 libnetpbm10 libnettle4:armhf libvpx1:armhf libvte-2.90-common
libgmpxx4ldbl:armhf libgnome-key- libobt2 libogg0:armhf libopenal- libvte-common libwavpack1:armhf
ring-common libgnome- data libopenal1:armhf libopencv- libwayland-client0:armhf libway-
keyring0:armhf libgnome-menu-3-0 calib3d2.4:armhf libopencv- land-cursor0:armhf libwayland-
libgnomecanvas2-common libgno- core2.4:armhf server0:armhf libwbclient0:armhf
meui-common libgoffice-0.10- libopencv-features2d2.4:armhf libwebcam0 libwebkitgtk-3.0-com-
10-common libgomp1:armhf libgpho- libopencv-flann2.4:armhf libo- mon libwebp5:armhf
to2-port10:armhf pencv-gpu2.4:armhf libopencv- libwebpdemux1:armhf
libgraphite2-3:armhf libgs9-com- imgproc2.4:armhf libopencv- libwebpmux1:armhf libwhoopsie0
mon libgsf-1-114 libgsf-1-common ml2.4:armhf libwildmidi-config
libgsl0ldbl libgsm1:armhf libg- libopencv-photo2.4:armhf libo- libwildmidi1:armhf libwnck-3-com-
streamer-plugins-base0.10-0:armhf pencv-stitching2.4:armhf libo- mon libwnck-common libwpd-0.9-9
libgstreamer-plugins-base1.0- pencv-video2.4:armhf libwpg-0.2-2 libwps-0.2-2
0:armhf libgstreamer0.10-0:armhf libopenjpeg2:armhf libopenobex1 libwvstreams4.6-base
libgstreamer1.0-0:armhf libgtk- libopenvg1-mesa:armhf liborbit- libwvstreams4.6-extras libx11-
3-common libgtk2.0-common libg- 2-0:armhf liborc-0.4-0:armhf 6:armhf libx11-data libx11-
top2-7 libgtop2-common lib- libots0 libp11-kit-gnome- xcb1:armhf libx264-142:armhf
gudev-1.0-0:armhf libguess1:armhf keyring:armhf libpam-gnome- libxapian22 libxau6:armhf libxcb-
libgusb2:armhf libgutenprint2 keyring:armhf libpaper-utils dri2-0:armhf libxcb-dri3-0:armhf
libgweather-common libpaper1:armhf libpathplan4 libxcb-glx0:armhf libxcb-
libhogweed2:armhf libhpmud0 libpcsclite1:armhf consolekit icccm4:armhf libxcb-image0:armhf
libhunspell-1.3-0:armhf libi- libpixman-1-0:armhf libpixman- libxcb-keysyms1:armhf libxcb-
bus-1.0-5:armhf libical1 libid- 1-0-dbg:armhf libplist1:armhf present0:armhf libxcb-
3tag0 libieee1284-3:armhf libi- libpolkit-agent-1-0:armhf libpol- randr0:armhf libxcb-render0:armhf
js-0.35 libilmbase6:armhf kit-backend-1-0:armhf libpolkit- libxcb-shape0:armhf libxcb-
libimage-exiftool-perl libiptc- gobject-1-0:armhf libpostproc52 shm0:armhf libxcb-sync1:armhf
data0 libisofs6 libiw30:armhf libprotobuf8:armhf libprotobuf- libxcb-util0:armhf libxcb-

ODROID MAGAZINE 34
C1 AL MINIMO GOOGLE PLUS

xf86dri0:armhf libxcb-
xfixes0:armhf libxcb-xv0:armhf
ODROID MAGAZINE EN GOOGLE+
libxcb1:armhf SIGUENOS PARA LAS ULTIMAS ACTUALIZACIONES
libxcomposite1:armhf
porr Rob Roy
libxcursor1:armhf
libxdamage1:armhf

T
libxdmcp6:armhf libxdot4 e gustaría saber cuándo se ha publicado la nueva edición de tu revista favorita
libxext6:armhf libxfce4ui-common online… Añade ODROID Magazine a tu círculo de Google+ para ser noti-
libxfce4util-common libxfce4util6 ficado tan pronto como se publique el siguiente número. Puedes encontrar más
libxfixes3:armhf libxi6:armhf información sobre la comunidad ODROID Magazine en http://bit.ly/14rsCIr.
libxinerama1:armhf
libxkbfile1:armhf libxp6:armhf

Purgar paquetes

# dpkg --list | grep ^rc | awk


-F” “ ‘ { print $2 } ‘ | xargs
apt-get -y purge

Después de aplicar estos cambios, el


uso de mi disco se redujo a poco menos
de 1 GB. Ten en cuenta que siguiendo
estas instrucciones eliminas por comple-
to la interfaz gráfica de usuario así que
el HDMI ya no funcionara, lo que deja
sólo el puerto serie y SSH disponibles
para la gestión del ODROID-C1. Por
favor, deja tus comentarios, sugerencias
y opiniones en el post original en http: //
bit.ly/1CDvNIO.
Una instalación mínima en un ODROID-C1
es una obra de arte, como una pintura de
Mondrian

ODROID MAGAZINE 35
RELE

RETOCANDO EL HARDWARE
CONECTAR UN ODROID-C1 A
UN RELE DE 16 CANALES
por @vzool

T
ras recibir mi ODROID-C1,
eche un vistazo a su hojas de da-
tos y especificaciones técnicas, y
me vino a la mente una gran idea. Mi
proyecto consistía en crear una sencilla
interfaz entre el ODROID-C1 y el
módulo relé SainSmart de 16 canales $ git clone git://github.com/ Crea un nuevo archivo PHP y pega el
(http://bit.ly/17ZbxrG). El relé se puede hardkernel/wiringPi siguiente código:
utilizar para controlar aparatos eléctri- $ cd wiringPi/

cos, luces o cualquier otro dispositivo $ sudo ./build $ nano /var/www/odroid-c1.php

que requiera una alimentación de 12V. $ sudo ldconfig

Siguiendo los pasos que se describen a <?

continuación, el relé se puede programar Use PHP para la programación del // GPIO Configuration

de forma remota a través de una página servidor, pero puedes utilizar cualquier $GPIO = array(

web, a la que puede acceder desde cu- lenguaje que desees. En primer lugar, in- array(‘Char’ => ‘A’, ‘Wiring-

alquier tipo de dispositivo como un PC stala los paquetes necesarios: Pi’ => ‘14’, ‘Header’ => ‘23’),

o teléfono móvil. La página web puede array(‘Char’ => ‘B’, ‘Wiring-

ser publicada en Internet o en una in- $ sudo apt-get install apache2 Pi’ => ‘7’, ‘Header’ => ‘7’),

tranet local, según tus necesidades. Con php5 libapache2-mod-php5 nano array(‘Char’ => ‘C’, ‘Wiring-

respecto al software, he usado el sistema Pi’ => ‘22’, ‘Header’ => ‘31’),

operativo Linux original que venía con A continuación, abre el archivo de array(‘Char’ => ‘D’, ‘Wiring-

mi ODROID-C1 cuando lo compré. configuración de Apache: Pi’ => ‘1’, ‘Header’ => ‘12’),
array(‘Char’ => ‘E’, ‘Wiring-

Componentes $ nano /etc/apache2/sites- Pi’ => ‘12’, ‘Header’ => ‘19’),

Hardware available/000-default.conf array(‘Char’ => ‘F’, ‘Wiring-

1- 16x transistores 2N2222 NPN: Pi’ => ‘5’, ‘Header’ => ‘18’),

http://ebay.to/1CtxlVn Cambia la línea siguiente: array(‘Char’ => ‘G’, ‘Wiring-

2- 16x Resistencias 10 Ohm 1/4 Pi’ => ‘13’, ‘Header’ => ‘21’),

Watt: http://ebay.to/1AD3ojt DocumentRoot /var/www/html array(‘Char’ => ‘H’, ‘Wiring-

3- 16x Resistencias 2K2 Ohm 1/4 Pi’ => ‘10’, ‘Header’ => ‘24’),

Watt: http://bit.ly/1xpRjx6 a array(‘Char’ => ‘I’, ‘Wiring-

4- 1x soldadura Plug-in protoboard: Pi’ => ‘21’, ‘Header’ => ‘29’),

http://amzn.to/14Z0Rar DocumentRoot /var/www array(‘Char’ => ‘J’, ‘Wiring-

5- 1x Módulo relé con 16 canales: Pi’ => ‘3’, ‘Header’ => ‘15’),

http://bit.ly/1yAXMLG Luego, abre el archivo de configura- array(‘Char’ => ‘K’, ‘Wiring-

6- 40x conexiones macho-hembra: ción php5: Pi’ => ‘24’, ‘Header’ => ‘35’),

http://amzn.to/1DVpRP4 array(‘Char’ => ‘L’, ‘Wiring-


$ nano /etc/php5/apache2/php.ini Pi’ => ‘0’, ‘Header’ => ‘11’),

Configuración array(‘Char’ => ‘M’, ‘Wiring-

del software Cambia la opción short_open_tag a Pi’ => ‘4’, ‘Header’ => ‘16’),

Instala y configura la aplicación wiring- On, está desactivada por defecto: array(‘Char’ => ‘N’, ‘Wiring-

Pi escribiendo los siguientes comandos Pi’ => ‘2’, ‘Header’ => ‘13’),

en una ventana de terminal: short_open_tag = On

ODROID MAGAZINE 36
RELE

Típicos diagramas pin para transistores npn 2N2222

Fotos del cableado para el relé

ODROID MAGAZINE 37
RELE

array(‘Char’ => ‘O’, ‘Wiring- variable return $needed_parts ? false


Pi’ => ‘23’, ‘Header’ => ‘33’), if (!($data = http_digest_ : $data;
array(‘Char’ => ‘P’, ‘Wiring- parse($_SERVER[‘PHP_AUTH_DI- }
Pi’ => ‘6’, ‘Header’ => ‘22’), GEST’])) || /*===============================
!isset($users[$data[‘userna =================================
array(‘Char’ => null, ‘Wir- me’]])) =============================*/
ingPi’ => ‘11’, ‘Header’ => die($wrong_credential_mes- /*###############################
‘26’), sage); Authenticated Access Security ###
array(‘Char’ => null, ‘Wir- ############################*/
ingPi’ => ‘26’, ‘Header’ => // generate the valid response /*===============================
‘32’), $A1 = md5($data[‘username’] =================================
array(‘Char’ => null, ‘Wir- . ‘:’ . $realm . ‘:’ . =============================*/
ingPi’ => ‘27’, ‘Header’ => $users[$data[‘username’]]);
‘36’), $A2 = md5($_SERVER[‘REQUEST_ if(!function_exists(“php_cli”)){
); METHOD’].’:’.$data[‘uri’]); function php_cli($cmd, $auto_
$valid_response = md5($A1.’:’.$da reload = true){
//user => password ta[‘nonce’].’:’.$data[‘nc’].’:’. $result = trim(shell_
$users = array(“admin” => $data[‘cnonce’].’:’.$data[‘qop’] exec($cmd));
“pass”); .’:’.$A2); if($auto_reload)
header(‘Location: ‘.$_
/*=============================== if ($data[‘response’] != $valid_ SERVER[‘REQUEST_URI’]);
================================= response) return $result;
=============================*/ die($wrong_credential_mes- }
/*############################### sage); }
Authenticated Access Security ###
############################*/ // function to parse the http if(!function_exists(“gpio_ref”)){
/*=============================== auth header function gpio_ref($char,
================================= function http_digest_parse($txt){ $GPIO){
=============================*/ // protect against missing foreach($GPIO as $g){
$realm = ‘Restricted Area!’; data if($g[‘Char’] ===
$wrong_credential_message = $needed_parts = $char)
“<h1>401 Restricted Area: Failed array(‘nonce’=>1, ‘nc’=>1, return $g;
to Authenticate!</h1>”; ‘cnonce’=>1, ‘qop’=>1, ‘user- }
name’=>1, ‘uri’=>1, ‘re- return null;
sponse’=>1); }
if (empty($_SERVER[‘PHP_AUTH_DI- $data = array(); }
GEST’])) { $keys = implode(‘|’, array_
header(‘HTTP/1.1 401 Unau- keys($needed_parts)); $gpio = -1;
thorized’); $mode = -1;
header(‘WWW-Authenticate: Di- preg_match_all(‘@ $status = -1;
gest realm=”’.$realm. (‘ . $keys . ‘)=(?:([\’”])
([^\2]+?)\2|([^\s,]+))@’, $txt, if($_POST){
‘”,qop=”auth”,nonce=”’. $matches, PREG_SET_ORDER);
uniqid().’”,opaque=”’. try{
md5($realm).’”’); foreach ($matches as $m) { if(isset($_POST[‘gpio’]))
$data[$m[1]] = $m[3] ? {
die(‘Text to send if user $m[3] : $m[4]; $gpio = $_
hits Cancel button’); unset($needed_ POST[‘gpio’];
} parts[$m[1]]); $mode = $_
} POST[‘mode’];
// analyze the PHP_AUTH_DIGEST $status = $_

ODROID MAGAZINE 38
RELE

POST[‘status’]; echo “<h1>$ex</h1>”;


} <?endforeach?>
php_cli(“gpio mode } </select>
$gpio $mode && gpio write $gpio
$status”); $GPIO_STATUS = array(); <select
} foreach($GPIO as $g){ name=’mode’>
if(!$g[‘Char’])continue; <option
if(isset($_POST[‘on_ $GPIO_STATUS[$g[‘Char’]] <?= $mode == “out” ? “SELECTED” :
all’])){ = php_cli(“gpio read “”?> value=’out’>OUT</option>
foreach($GPIO as $g){ {$g[‘WiringPi’]}”, false); <option
$auto_reload = } <?= $mode == “in” ? “SELECTED” :
end($GPIO) === $g; ?> “”?> value=’in’>IN</option>
php_cli(“gpio </select>
mode {$g[‘WiringPi’]} out && gpio <center>
write {$g[‘WiringPi’]} 1”, $auto_ <h1>^_^ Welcome to My Home <select
reload); Infrastructure Panel(HIP) ^_^</ name=’status’>
} h1> <option
} </center> <?= $status == 1 ? “SELECTED” :
<hr/> “”?> value=’1’>ON</option>
if(isset($_POST[‘off_ <div id=’cmd_button’> <option
all’])){ <?foreach($GPIO as $g):?> <?= $status == 0 ? “SELECTED” :
foreach($GPIO as $g){ <?if(!$g[‘Char’])continue;?> “”?> value=’0’>OFF</option>
$auto_reload = <form method=”post”> </select>
end($GPIO) === $g; <button class=’<?=$GPIO_
php_cli(“gpio STATUS[$g[‘Char’]] == “1” ? <input
mode {$g[‘WiringPi’]} out && gpio “on” : “off”?>’ name=’cmd’ type=’submit’ value=’Execute’/>
write {$g[‘WiringPi’]} 0”, $auto_ type=’submit’ value=’<?=$g[‘Ch </form>
reload); ar’]?>’><?=$g[‘Char’]?>&nbsp;- </td>
} &nbsp;<?=$GPIO_STATUS[$g[‘Char’]] <td>
} == “1” ? “ON” : “OFF”?></button> <form method=”post”>
</form> <input
if(isset($_POST[‘cmd’])){ <?endforeach?> name=’on_all’ type=’submit’
$header = gpio_ </div> value=’ON ALL’/>
ref(strtoupper($_POST[‘cmd’]), <input
$GPIO); <table border=’1’ width=’100%’> name=’off_all’ type=’submit’
$header = <tr align=’center’> value=’OFF ALL’/>
$header[‘WiringPi’]; <td> </form>
$result = php_ <form method=”post”> </td>
cli(“gpio read $header”, false); <select </tr>
if($result === ‘1’){ name=’gpio’> </table>
php_cli(“gpio <center>
write $header 0 && gpio mode <?foreach($GPIO as $g):?> <h6>powered by <a
$header in”); href=’http://www.hardkernel.
}else{ <? $selected = $gpio == com/main/products/prdt_info.
php_cli(“gpio $g[‘WiringPi’] ? “SELECTED” : php?g_code=G141578608433’ tar�
-
mode $header out && gpio write “”?> get=’_blank’>ODROID-C1</a> Coded
$header 1”); by <a href=’https://plus.google.
} <option <?=$selected?> value=’< com/u/0/109727413094063366437’
} ?=$g[‘WiringPi’]?>’>Header PIN target=’_blank’>vZool</a></h6>
<?=$g[‘Header’]?> ### WiringPi </center>
}catch(Exception $ex){ <?=$g[‘WiringPi’]?></option> <style type=”text/css”>

ODROID MAGAZINE 39
RELE FOROS

form button{
width: 50%;
height: 10%;
FOROS ODROID
float: right; EL LUGAR PERFECTO PARA COMUNICARTE
}
.on, .off{
CON LOS DESARROLLADORES DE
font-weight: bold;
HARDKERNEL
font-size: 2em;
por Rob Roy
}
.on{

L
color: green; os foros ODROID han sido el lugar de encuentro de la creciente comunidad
} de Hardkernel durante varios años, con más de 8.500 miembros a febrero de
.off{ 2015. Puedes hablar de ODROIDs con Mauro, el principal desarrollador del
color: red; kernel de linux y con Justin, el CEO de Hardkernel, junto con un creciente equipo
} de desarrolladores que donan su tiempo para ayudarte a sacar el máximo partido a tu
</style> ODROID. ¡Compruébalo en http://forum.odroid.com!

Guarda el archivo, después abre un


navegador y navega a http://<ip-dis-
positvo>/ODROID-c1.php para acced-
er al Panel principal del equipo (HIP).
El usuario por defecto es admin y la con-
traseña es pass, se puede cambiar en la
línea 27 del código PHP.

Alimentación
El módulo relé de 16 canales necesita
más energía de la que puede propor-
cionar el ODROID-C1 a través de los
pines GPIO, así que utilicé mi fuente de
alimentación de laboratorio (PSU) para
el proyecto. Necesitarás un adaptador
o fuente similar para suministrar 12v a
0.5A que debe ser conectada a la toma de
alimentación externa que se encuentra a
la derecha de los pines de entrada de bajo
nivel.

Más información
Para obtener más información so-
bre el PC al estilo Raspberry Pi y de la
interfaz de relé, echa un vistazo a la co-
lección de vídeos de domótica en http://
bit.ly/1BX5Wxj. Los detalles específi-
cos sobre el cableado del relé se pueden
encontrar en http://bit.ly/15r7Byv.
Como referencia, la ficha técnica de
ODROID-C1 está disponible en http://
bit.ly/1KWdJiM. Si desea hacer pregun-
tas o dejar un comentario visita el post
original en http://bit.ly/15n93SQ.

ODROID MAGAZINE 40
DOCKER

DOCKER: DESARROLLAR, ENVIAR Y


EJECUTAR APLICACIONES EN
CUALQUIER LUGAR
PARTE 2 - IMAGENES PRE-COMPILADAS
por Fred Meye

E
l anterior artículo de mi serie so- Ubuntu y Debian ejecutar la imagen de Debian con los
bre Docker describe cómo con- He preparado una imagen Docker siguientes comandos:
figurar Docker sobre ODROID, pre-compilada usando la mejor ima-
junto con una introducción sobre los gen Ubuntu14.04 de Hardkernel que $ sudo docker pull hominidae/
contenedores. En este artículo te pre- incluye un demonio supervisor como armhf-wheezy
sento varias imágenes pre-compiladas, proceso en primer plano. Dentro del de- $ sudo docker run -d -p 9022:22
disponibles de forma gratuita y diseña- monio, SSH ya está activado y ejecután- hominidae/armhf-wheezy \ /usr/
das para ayudarte a que Docker funcione dose en el puerto 22. Ejecuta la imagen sbin/runsvdir-start
con la mínima configuración. de Ubuntu con los siguientes comandos:
Puesto que initd/systemd no están Conéctate usando SSH a través del
disponibles en el contenedor, Docker $ sudo docker pull hominidae/ puerto 9022 a tu ODROID, utilizando
está diseñado para ejecutar sólo un pro- armhf-supervisord el nombre de usuario y contraseña con-
ceso en primer plano. Sin embargo, a $ sudo docker run -d -p 8022:22 figurados por defecto wheezy/wheezy.
veces existe la necesidad de ejecutar dos hominidae/armhf-supervisord
procesos al mismo tiempo, como en un Imagen Base de
servidor web, que proporciona una in- Luego, dirige SSH hacia el puerto Arch Linux
terfaz gráfica para configurar o controlar 8022 en tu ODROID, usando el nom- Si prefieres Arch Linux, descarga mi
un proceso secundario. Cuando el con- bre de usuario y la contraseña ubuntu/ imagen base Arch Linux escribiendo lo
tenedor se inicia o se detiene, los procesos ubuntu configurados por defecto. Con- siguiente:
necesitan emular ese comando. Existen sulta http://bit.ly/1CBw8f4y y http://
dos posibilidades. Una es una pequeña/ bit.ly/1xi309d para más información $ docker pull hominidae/armhf-
escueta sustitución de initd/systystemd, Hay otra opción pre-compilada dis- archLinux
similar a runit (http://bit.ly/1zp2o7s), y ponible, una imagen de Debian Wheezy
la otra es utilizar un demonio supervisor con runit activado y el demonio SSH Si prefieres crear tú mismo la imagen,
(http://bit.ly/1yb6w95). ejecutándose en el puerto 22. Coge y Arch Linux también ejecuta Docker
Transiciones de subprocesos Debian Wheezy ejecuta muy bien Docker

ODROID MAGAZINE 41
DOCKER

puede hacerlo con el siguiente script: -exact “anyway? \[Y/n\] “ { sleep 2


send -- “n\r”; exp_continue } rm -rf $ROOTFS
#!/usr/bin/env bash -exact “(default=all): “ {
# Generate a minimal filesystem send -- “\r”; exp_continue } También es necesario descargar el
for Arch Linux -exact “installation? \ archivo mkimage-arch-pacman.conf
# and load it into the local [Y/n\]” { send -- “y\r”; exp_con- del mismo repositorio en http://bit.
docker as “armhf-archLinux” tinue } ly/1IQe2K0, asegúrate de seleccionar la
# requires root } arquitectura “armv7hf ”.
# based on https://github.com/ EOF
docker/docker/blob/master/con- Cosas importantes
trib/mkimage-arch.sh arch-chroot $ROOTFS /bin/sh -c El espacio que consume la imagen
set -e “haveged -w 1024; pacman-key Docker puede ser muy grande si la de-
--init; pkill haveged; pacman -Rs tienes, inicias y modificas repetidamen-
hash pacstrap &>/dev/null || { --noconfirm haveged” te. Se puede hacer algunos ajustes para
echo “Could not find pacstrap. arch-chroot $ROOTFS /bin/sh -c bajar la demanda y ahorrar espacio en
Run pacman -S arch-install- “ln -s /usr/share/zoneinfo/UTC / tu eMMC o SD, como se muestra en
scripts” etc/localtime” http://bit.ly/1wjki47.
exit 1 echo ‘en_US.UTF-8 UTF-8’ > $ROOT�
-
} FS/etc/locale.gen
arch-chroot $ROOTFS locale-gen
hash expect &>/dev/null || { arch-chroot $ROOTFS /bin/sh -c
echo “Could not find expect. ‘echo “Server = http://mirror.
Run pacman -S expect” archLinuxarm.org/\$arch/\$repo” >
exit 1 /etc/pacman.d/mirrorlist; pacman
} --noconfirm -Sy; pacman --noconfirm
-S archLinuxarm-keyring’
ROOTFS=$(mktemp -d ${TMPDIR:-/
var/tmp}/rootfs-archLinux- # udev doesn’t work in contain- Docker necesita un montón de espacio
XXXXXXXXXX) ers, rebuild /dev
chmod 755 $ROOTFS DEV=$ROOTFS/dev Tienes información sobre cómo usar
rm -rf $DEV los comandos “save” o “export” con
# packages to ignore for space mkdir -p $DEV Docker en http://bit.ly/1GdEu2t. Para
savings mknod -m 666 $DEV/null c 1 3 obtener más información sobre el uso
PKGIGNORE=Linux,jfsutils,lvm2,cry mknod -m 666 $DEV/zero c 1 5 de red y distribución de puertos con un
ptsetup,groff,man-db,man-pages,md mknod -m 666 $DEV/random c 1 8 contenedor Docker, visita http://bit.
adm,pciutils,pcmciautils,reiserfs mknod -m 666 $DEV/urandom c 1 9 ly/1EclIDL.
progs,s-nail,xfsprogs mkdir -m 755 $DEV/pts Ejecutar un contenedor en modo de-
mkdir -m 1777 $DEV/shm monio iniciará sus procesos en primer
expect <<EOF mknod -m 666 $DEV/tty c 5 0 plano. También puede introducir en un
set send_slow {1 .1} mknod -m 600 $DEV/console c 5 1 intérprete de órdenes el contenedor de-
proc send {ignore arg} { mknod -m 666 $DEV/tty0 c 4 0 monio con el comando exec:
sleep .1 mknod -m 666 $DEV/full c 1 7
exp_send -s -- \$arg mknod -m 600 $DEV/initctl p $ sudo docker exec -i -t <id> /
} mknod -m 666 $DEV/ptmx c 5 2 bin/bash
set timeout 60 ln -sf /proc/self/fd $DEV/fd
Ubuntu 14.04 con
spawn pacstrap -C ./mkimage- tar --numeric-owner -C $ROOTFS ReadyMedia
arch-pacman.conf -c -d -G -i -c . | docker import - armhf- Un contenedor ejecutando minidlna
$ROOTFS base haveged --ignore archLinux y ReadyMedia para transmitir música a
$PKGIGNORE docker run -i -t armhf-archLinux mis diversos dispositivos de audio fue
expect { echo Success. una de las primeras imágenes que de-

ODROID MAGAZINE 42
DOCKER

# add config file. $ sudo docker run


ADD minidlna.conf /etc/minidlna. --name=minidlna_d --rm=true
conf --net=host -p 1900:1900/udp -p
8200:8200 -v /media/mediadata/my-
Digital Living Network Alliance (DLNA) # Define mountable directories. music:/data:ro hominidae/armhf-
VOLUME [“/data”] minidlna
sarrollé, aún la tengo ejecutándose en
mi casa. El contenedor está basado en # Define working directory. Cups y Cloud Print
Ubuntu 14 e incluye herramientas de WORKDIR /data También puedes montar un servidor
desarrollo, libs para codecs y dependen- Google Cloud Print en tu casa y activar
cias minidlna, así como el código fuente # Define default command. tu(s) impresora(s) locales para usarlas
de minidlna. Aquí está el Dockerfile: CMD [“/usr/local/sbin/ con Google Print. Este es otro de mis
minidlnad”,”-d”] contenedores favoritos. Tengo algunas
# impresoras en red, pero todas carecen
# MiniDLNA Dockerfile # Expose ports. de la capacidad de Google Cloud Print.
# # - 1900: UPnP Con este contenedor puedo usar las im-
# - 8200: HTTP presoras desde mi teléfono Android, tab-
# Pull base image. EXPOSE 1900/udp let y navegador chrome, lo cual es una
# FROM hominidae/armhf-supervi- EXPOSE 8200 comodidad para mi familia y mejora las
sord capacidades de mis impresoras.
FROM hominidae/armhf-ubuntu:14.04 # supervisor configuration für Esta imagen en particular está basada
minidlna en Debian Wheezy e incluye dos compo-
MAINTAINER hominidae #ADD minidlna_d.conf /etc/super�
- nentes: cupsd, el demonio de impresión
visor/conf.d/minidlna_d.conf
# Install MiniDLNA(ReadyMedia). #
RUN apt-get update && apt-get #CMD [“supervisord”, “-c”, “/etc/
upgrade -y supervisor/supervisord.conf”]

# build tools and codecs Este Dockerfile inyectará tu archivo


RUN apt-get install -y wget de configuración minidlna.conf y creará
build-essential libavutil-dev \ un volumen llamado “/data” dentro del
libavcodec-dev libavformat- contenedor. Vas a tener que redirigir tu
dev libjpeg-dev libsqlite3-dev minidlna a ese directorio para almacenar
libid3tag0-dev \ y localizar tus archivos multimedia. En
libogg-dev libvorbis-dev lib- caso de optar por ejecutar minidlna jun-
flac-dev libexif-dev gettext to con un demonio SSH, usa solo la ima-
gen supervisord como imagen base con
# download minidlna source code, la directiva FROM, y añade el supervis-
build and install ord.conf apropiado dentro de la imagen. Common Unix Printing System (CUPS)
RUN \ La imagen presenta el puerto udp
cd /tmp && \ upnp/dlna (1900) y puerto UI http
wget http://downloads.source�
- (8200) para minidlna. Sin embargo,
Cloud Print te permite imprimir en
forge.net/project/minidlna/ para que un intérprete encuentre y reci-
cualquier impresora
minidlna/1.1.4/minidlna- ba los avisos de minidlna, tendrá que ini-
1.1.4.tar.gz && \ ciar/ejecutar la imagen con el comando UNIX y un script de Python (http://bit.
tar xvzf minidlna-1.1.4.tar.gz “--net=host”. ly/1IVP766) que es capaz de conectarse
&& \ Así es como se inicia la imagen a nivel a la API de impresión Google. Esta vez,
cd minidlna-1.1.4 && \ local, asumiendo que tus archivos mul- no usaremos un Dockerfile, sino que
./configure && \ timedia están vinculados a ODROID y desarrollaremos la imagen de forma in-
make && make install están disponible en /media/mediadata/ teractiva. Para empezar, inicia la imagen
my-music/: base de Debian Wheezy:

ODROID MAGAZINE 43
DOCKER

$ sudo docker run -t -i <Location /admin/conf> para comprobar si cupsd se está ejecutan-
--net=host hominidae/armhf-wheezy AuthType Default do, dirige tu navegador a https://<ipde
/bin/bash Require user @SYSTEM tuodorid>:631/admin y configura tu
Order allow,deny impresora. Utiliza las credenciales cups-
Ten en cuenta que estamos usando Allow all admin/cupsadmin para autenticarte cu-
la opción --net=host para habilitar el ac- </Location> ando se te pregunte.
ceso IP en el contenedor. Si tiene varios [...] Siempre tengo un archivo ppd con
contenedores ejecutándose con sshd, mis impresoras disponibles; súbelo a
debes reconfigurar los puertos o desac- Añade un usuario como administra- través de la interfaz web de admin. Ten
tivar todos los demonios excepto uno, dor para el sistema de impresión al grupo en cuenta que no he probado impresoras
incluyendo el de tu host. También puede lpadmin y crea una contraseña: USB, ya que mis impresoras ya están en
introducir un interprete de comandos en red. Puedes intentar agregar el sistema de
la ejecución, contenedor demonio con el $ sudo adduser cupsadmin archivos /dev como un volumen, usando
comando exec: [...] el parámetro -v o la opción –device para
$ sudo usermod -a -G lpadmin cup- ejecutar el comando cuando inicies el
$ sudo docker exec -i -t <id> / sadmin contenedor, aunque no estoy seguro de
bin/bash las implicaciones de seguridad.
Habilita el arranque cupsd con runit: Por último, imprime una página de
Luego, inicia el contenedor e instala prueba desde la interfaz de manteni-
cups: $ sudo mkdir /etc/service/cupsd miento de cups. Si necesitas más orien-
$ sudo cp /etc/service/sshd/run / tación sobre cups, consulta el tutorial
$ apt-get update && apt-get up- etc/service/cupsd/run disponible en http://bit.ly/1KT6sjD.
grade -y && apt-get install -y Repite los pasos para todas las impre-
cups Edita el archivo /etc/service/cupsd/ soras que desees administrar a través de
run para que tenga este aspecto: esta instancia cupsd. Una vez más, crea
Después, comprueba y configura el una nueva imagen del contenedor, esta
archivo cupsd en /etc/cups/cupsd.conf, #!/bin/sh vez incluirá las impresoras configuradas:
activa Web-UI del cupsd usando el puer- #
to por defecto 631 y da acceso a admin: # start cupsd $ sudo docker export <id> | sudo
exec /etc/init.d/cups start docker import - armhf-cups_print-
[...] # end ing
# Only listen for connections
from the local machine. Desconéctate de tu contenedor y Luego, agrega el sistema python
Listen 0.0.0.0:631 coge el ID del contenedor, luego detén de Cloud Print, usando los paquetes
[...] la imagen Wheezy: Debian pre-compilados desde PPA de
# Restrict access to the serv- David Steele en http://bit.ly/17WkvpF.
er... $ sudo docker ps -a Una vez dentro del contenedor, ejecuta
<Location /> $ sudo docker stop <id> los comandos para agregar Cloud Print.
Order allow,deny Agrega una referencia a PPA Cloud Print
Allow all Crea una nueva imagen desde el con- a tu archivo /etc/apt/sources.list (como
</Location> tenedor, por si tenemos que volver atrás. root):
Después, inicia el nuevo contenedor
# Restrict access to the admin cupsd: $ deb http://davesteele.github.
pages... io/Cloud Print-service/repo \
<Location /admin> $ sudo docker export <id> | sudo Cloud Printppa main
Order allow,deny docker import - armhf-cupsd
Allow all $ sudo docker run -d --net=host Añade la clave del repositorio a tu
</Location> armhf-cupsd \ /usr/sbin/runsvdir- clave apt e instala los paquetes:
start
# Restrict access to configuration $ wget http://davesteele.github.
files... Tras entrar en el contenedor via SSH io/key-366150CE.pub.txt

ODROID MAGAZINE 44
DOCKER

$ sudo apt-key add key-366150CE.pub.txt $ sudo docker export <id> | sudo docker import -
$ sudo apt-get update armhf-Cloud Printd
$ sudo apt-get install Cloud Print Cloud Print-ser-
vice Ahora puedes volver a ejecutar tu contenedor docker con el
servidor Cloud Print:
Tras completar estos pasos, los paquetes serán actualizados
automáticamente siempre que se ejecute “apt-get upgrade” $ sudo docker run -d --net=host armhf-Cloud Printd \
/usr/sbin/runsvdir-start
Registrar la impresora
Las cuentas de Google que tienen 2 pasos de verificación Ten en cuenta que este contenedor y la imagen guarda tu
necesitan utilizar una contraseña específica, como se describe credenciales Cloud Print de Google, las cuales se almacenan en
en http://bit.ly/1CBGfAy. Configura estas credenciales de la un formato encriptado. Te sugiero no colocar esta imagen en
cuenta antes de intentar conectar con el servicio de impresión. repositorios públicos para evitar suplantaciones de identidad.
A continuación, ejecuta la aplicación python Cloud Print,
usando tus propias credenciales, se registrarán todas las impre- Arch Linux con Madsonic
soras que estén configuradas en cupsd con Google Cloud Print:

$ /etc/init.d/Cloud Printd login


Accounts with 2 factor authentication require an
application-specific password Madsonicte permite transmitir tus archivos multimedia a
Google username: <your-id>@gmail.com través de Internet
Password: <your_app_pwd>
Added Printer Brother_MFC-9120CN Madsonic es una división de la famosa aplicación Subsonic.
Aunque es capaz de ejecutar un demonio UPnP/DLNA como
minidlna, su principal objetivo es el de dar acceso a tus ar-
chivos multimedia y visualizarlos via Internet. Ya existe un
Dockerfile disponible para la arquitectura x86 en http://bit.
ly/1EcvNRb. Puesto que Madsonic es una aplicación Java, no
Captura de pantalla de Google Cloud Print debería haber problemas de compatibilidad en arquitectura
ARM. Sin embargo, Madsonic necesita algunos plugins para
Luego, comprueba la configuración usando Google Print poder transcodificar los archivos multimedia para su reproduc-
(http://bit.ly/1yvWQou), debe aparecer la impresora como ción en diferentes dispositivos.
disponible y haz una prueba de impresión. Después, activa el
demonio Cloud Print con los servicios Runit:

$ sudo mkdir /etc/service/Cloud Print


$ sudo cp /etc/service/sshd/run /etc/service/Cloud
Print/run

Edita el archivo /etc/service/Cloud Print/run para que tenga


este aspecto:

#!/bin/sh
#
# start Cloud Print daemon Pagína demo Madsonic
exec /etc/init.d/Cloud Printd start
# end No he sido capaz de encontrar libs de transcodificación
basadas en ARM. No obstante, la siguiente es una breve in-
Como paso final, salte del contenedor, detenlo y crea la ima- formación sobre cómo compilar Madsonic en tu ODROID,
gen final para guardar tu trabajo: aunque sin posibilidad de transcodificación. Comienza con el
Dockerfile utilizado a partir de ejemplos del usuario BinHex:

ODROID MAGAZINE 45
DOCKER

FROM hominidae/armhf-base-arch- # set permissions


Linux RUN pacman -S ffmpeg lame flac #################
#MAINTAINER binhex --noconfirm
MAINTAINER hominidae # change owner
# unzip to folder RUN chown -R nobody:users /var/
# install application #RUN unzip /var/madsonic/trans- madsonic
##################### code/transcode.zip -d /var/mad�
-
sonic/transcode # set permissions
# update package databases from RUN chmod -R 775 /var/madsonic
the server # remove zip
RUN pacman -Sy --noconfirm #RUN rm /var/madsonic/transcode/ # add conf file
transcode.zip ###############
# install pre-req for application
RUN pacman -S libcups jre7- # copy transcode script to mad- ADD madsonic.conf /etc/supervi�
-
openjdk-headless fontconfig unzip sonic install dir (copies trans- sor/conf.d/madsonic.conf
--noconfirm coders to madsonic install dir)
ADD transcode.sh /var/madsonic/ # cleanup
# make destination folders transcode.sh #########
RUN mkdir -p /var/madsonic/media
RUN mkdir -p /var/madsonic/trans- RUN cd /var/madsonic/transcode && # completely empty pacman cache
code ln -s “$(which ffmpeg)” && ln -s folder
“$(which flac)” && ln -s “$(which RUN pacman -Scc --noconfirm
# download madsonic lame)” && ls -la
ADD http://madsonic.org/down�
- # run supervisor
load/5.1/20140823_madsonic- # docker settings ################
5.1.5080-standalone.zip /var/mad�
- #################
sonic/madsonic.zip # run supervisor
# set env variable for java CMD [“supervisord”, “-c”, “/
# unzip to folder ENV JAVA_HOME /usr/lib/jvm/java- etc/supervisor/supervisor.conf”,
RUN unzip /var/madsonic/madsonic. 7-openjdk/jre “-n”]
zip -d /var/madsonic
# map /config to host defined config La imagen base con supervisord ac-
# remove zip path (used to store configuration tivado es necesaria para Madsonic. Esta
RUN rm /var/madsonic/madsonic.zip from app) disponible desde el archivo git del usu-
VOLUME /config ario binhex en http://bit.ly/1KT6Z5k.
# force process to run as fore- Sin embargo, puedes optar por crear la
ground task # map /media to host defined media imagen desde mi imagen armhf-arch-
RUN sed -i ‘s/-jar madsonic- path (used to read/write to media linux en http://bit.ly/1Ecx76C adaptan-
booter.jar > \${LOG} 2>\&1 \&/- library) do el Dockerfile. No te olvides de coger
jar madsonic-booter.jar > \${LOG} VOLUME /media los archivos de configuración para Mad-
2>\&1/g’ /var/madsonic/madsonic. sonic y supervisord desde el archivo git
sh expose port for http arch-madsonic antes de realizar la com-
EXPOSE 4040 pilación de la imagen armhf-madsonic
# install transcoders
##################### # expose port for https Debian Wheezy con
EXPOSE 4050 FreeSwitch
# download madsonic transcoders y FusionPBX
#ADD http://madsonic.org/down�
- # expose UPnP - DLNA ports
load/transcode/20140819_madsonic- EXPOSE 1900/udp Este contenedor tiene la capacidad de
transcode_latest_x64.zip /var/ EXPOSE 2869 alojar un IP Private Branch Exchange
madsonic/transcode/transcode.zip (IP-PBX) completamente funcional (IP-

ODROID MAGAZINE 46
DOCKER

PBX) con una adecuada interfaz web # apt-get install wget -y Durante la compilación, el script de-
de usuario. Casualmente, Sipbox, socio # cd /usr/src tectará que la versión local ha cambiado
de Hardkernel (sipbox.co.uk) vende un # wget http://bit.ly/Rfvxy5 en relación con la del repositorio, porque
completo sistema IP-PBX, basado en un # chmod 755 install_fusionpbx.sh la hemos editado. Simplemente seleccio-
ODROID-U3 utilizando el mismo soft- na *not* para utilizar la “nueva” versión
ware, el cual se ejecuta de forma nativa Hay que configurar algunas variables desde el repositorio pulsando “y” cuando
sin Docker. que controlan la compilación editando se muestre el siguiente mensaje:
Para empezar, consulta http://bit. el script de instalación. En primer lugar,
ly/1AuGkDy para obtener detalles sobre activa los componentes nginx y sqllite3, there is a new version of this
a continuación, ejecuta el script: script.
It is PROBABLY a good idea use
[...] the new version
#--------- the new file is saved in /tmp/in�
-
#VARIABLES stall_fusionpbx.latest
#--------- to see the difference, run:
#Variables are for the auto in- diff -y /tmp/install_fusionpbx.
stallation option. latest /usr/src/install_fusion�
-
pbx.sh
#for apache set to a, for nginx/ Continue [y/N]?
php-fpm set to n -> for an auto
install, user mode will prompt Una vez compilado todo, se insta-
APACHENGINX=n larán y se activan ambos componentes.
Fusión PBX ofrece un IP-PBX a medida
El script te solicitará que conectes tu
# for mysql set m. for sqlite navegador a tu instancia fusionpbx para
set s. for postgresql set p configurar las cuentas y guardar la con-
SQLITEMYSQL=s figuración básica. Una vez guardada, el
[...] script finalizará su compilación.
Para activar los servicios en Docker,
Si optas por instalar ambos compo- necesitaras añadirlos al servicio runit.
nentes, te llevará algo de tiempo. Algu- Cuando el script de instalación finalice,
nas opciones son interactivas, por lo que podras ver como los servicios ya se han
mantenerte al margen y supervisa el pro- iniciado. Todos los scripts de inicio se
greso. han instalado en /etc/init.d/.
Crea un directorio para cada servi-
# ./install_fusionpbx.sh install- cio en /etc/service/ y crear un script de
both auto ejecución, que active el script en /etc/
Free Switch es una plataforma de telefonía.
Captura de pantalla de Fusion PBX
la configuración base. El script incluido
lanzará el código fuente por completo
y desarrolla un sistema al estilo sipbox
sobre tu ODROID. Sin embargo, a
diferencia de la versión original, usare-
mos un contenedor Docker para alojar
los archivos. Asegúrate de tener aproxi-
madamente 1,5 GB de almacenamiento
disponible antes de instalar este sistema.
Para empezar, utiliza la imagen Debi-
an Wheezy como base. Inicia el contene-
dor, conviértete en root y coge el script
de instalación:

ODROID MAGAZINE 47
DOCKER INFOGRAFIA

init.d/. Tendrás que crear un script para colaboradores ofrecen sus Dockerfile ya
cada uno de los siguientes servicios, dan- sea directamente o a través de un proyec-
do como resultado el siguiente árbol de to Github. Recuerda que el Dockerfile
directorio runit: es simplemente un script inicio/desar-
rollo para crear o mejorar las imágenes
/etc/service Docker. Mientras el Dockerfile ha de-
|-- cron jado de importar en los binarios específi-
| |-- run cos no ARMHF o x86, se trabajara sobre
|-- dbus la plataforma ODROID. Las imágenes
| |-- run base armhf de la primera entrega de este
|-- fail2ban artículo debe de serte muy útil.
| |-- run Mi próximo proyecto será utilizar
|-- freeswitch una solución domótica inteligente sobre
| |-- run mi ODROID, junto con el mundo del
|-- nginx Internet de las cosas y usando contene-
| |-- run dores Docker, ¡por supuesto!
|-- ntp
| |-- run Referencias
|-- php5-fpm http://docs.docker.com
| |-- run http://bit.ly/1CQs1hl
|-- sshd http://bit.ly/1Cop8Wj
|-- run

Para el paso final, salte del contene-


dor, detenerlo y crear la imagen final
para guardar tu trabajo:

$ sudo docker export <id> | sudo


docker import - armhf-mysipbox

Ahora puedes volver a ejecutar tu


contendedor Docker sipbox:

$ sudo docker run -d --net=host


armhf-mysipbox \ /usr/sbin/runsv-
dir-start

Consulte la excelente wiki de fusion-


pbx para poder configurar tu IP-PBX
con tu proveedor SIP y dispositivos/ex-
tensiones SIP en http://bit.ly/1sOugPY.

Otras ideas Docker


¿Puede que estés pensando en una
aplicación que necesites en tu ODROID
y que desees ejecutar dentro de un con-
tenedor Docker? Es bastante probable
que ya esté creada, al menos para la arqui-
tectura x86. Simplemente navegar por el
Hub Docker en https://hub.docker.com
para ver lo que hay disponible. Muchos

ODROID MAGAZINE 48 CLICK PARA VER MAS


CONOCIENDO A UN ODROIDIAN

CONOCIENDO A
UN ODROIDIAN
VENKAT BOMMAKANTI
UN MANITAS
editado by Rob Roy
Por favor, háblanos un poco sobre ti. Desde mi punto de vista, creo
Soy del sur de la India, pero he hecho que el U2/U3 puso a Hard-
del Área de la Bahía de California mi kernel en el mapa. Ambos son
casa. Es el único lugar en la tierra que dispositivos muy especiales que Venkat en el Golden Gate Bridge en San
Francisco, California
permite a un ingeniero químico intere- incorpora todo lo básico e im-
sarse por la robótica, la banca, la tele- portante: tamaño físico, interfaz, menor grado Raspberry Pi y Arduino,
fonía IP, la biotecnología y las redes. memoria, eficiencia energética, potencia han despertado mi curiosidad por la in-
de cálculo y rápida compilación nativa. terconexión del mundo sensorial con el
¿Cómo fueron tus inicios con los ordena- Hacen grandes sistemas de desarrollo que ámbito computacional. También estoy
dores? permiten testear cualquier imagen Linux buscando un Field Programmable Gate
A principios de 1980, estando en la al completo. Conceptualmente, pienso Array (FPGA) con una interfaz apro-
universidad, tuve la oportunidad de uti- que generaron tanto el XU3-Lite y el C1 piada. Al ser una persona práctica, estoy
lizar un IBM3081 con tarjetas perforadas para cubrir diferentes precios motivados ansioso de poner en marcha proyectos de
Hollerith y el flamante VT220s. Tuve un
por el equilibrio entre la funcionalidad y dedomótica e informática para coches.
Sinclair Z81 donado para mi tesis sobre
la accesibilidad. Me encantan todos los
la simulación y control de procesos usan-
ODROIDs, por diferentes razones. Qué aficiones e intereses tienes aparte de los
do Pascal UCSD. He estado enganchado
desde entonces, y me compré mi primer ordenadores?
PC a la edad de 30 años que fue un PC Tus artículos técnicos son muy detallados, Como todos, trato de apreciar la vida
486 intel a un precio de 3.000$. Los ni- ¿cómo lo haces? usando toda mi Ṣaḍāyatana, que en
ños de hoy son muy afortunados porque Mi primer trabajo fue el de profesor sánscrito significa los 6 sentidos básicos.
gracias a gente como Hardkernel, pue- ayudante en la universidad, lo cual sentó Disfruto de la naturaleza y trato de captar
den costearse ordenadores. las bases para ser un aprendiz meticulo- algo de ella, si es posible. Me encanta es-
so. Rápidamente me di cuenta de que no cuchar a los woozy blues, las mermeladas
¿Qué te llevó a la plataforma ODROID? hay dos personas que aprenden del mis- bluegrass, escucho música clásica indica y
En mi trabajo más reciente con el gi- mo modo, así que reuní el conocimiento occidental todo el día. Me gustaría que hu-
gante de las redes locales, tuve la opor- suficiente para hacer frente a un mínimo biese una máquina del tiempo ODROID
tunidad única en la vida de ayudar a mi- común denominador: el aprendiz más que me pudiese llevar al panorama musical
grar nOS a Linux, comenzó entonces mi lento (como yo). No me gusta que el ma- de 1960. Disfruto con la comida picante
viaje con los sistemas embebidos basados terial se presente sin información básica, de todas las partes del mundo, satisfaci-
en Linux. Sentía que los sistemas Linux lo cual lleva a la frustración en algunos endo mis curiosidades gustativas y olfati-
x86 eran demasiados complicados, así casos. En muchos casos, los pasos ocultos vas. Experimento con la cocina mezclando
que empecé a buscar sistemas Linux más y desactualizados no se pueden replicar ingredientes de diferentes estilos de comi-
eficientes y allí estaba: ARM al rescate. correctamente sin instrucciones detalla- da. Dejo que mis artículos de ODROID
Empecé con otras plataformas, pero rá- das. De modo que, trato de documentar Magazine mantengan mi mente ocupada y
pidamente me decidí por los dispositivos cada posible salvedad en el proceso. disfruto del senderismo, el ciclismo y la car-
ODROID, que cuenta con uno de los pintería para despejar mi mente. También
sistemas Linux mejor sustentado. ¿Está involucrado con otros proyectos infor- soy voluntario en un par de organizaciones
máticos no relacionados con ODROID? no lucrativas del Área de la Bahía, para de-
¿Cuál es tu ODROID favorito? En varios dispositivos como los volver de algún modo el hecho de que he
Es una pregunta difícil de responder. ODROIDs, Beaglebone Black y en sido bendecido.

ODROID MAGAZINE 49
CONOCIENDO A UN ODROIDIAN PUBLICIDAD

¿Qué tipo de innovaciones de hardware te Los programadores principiantes de-


gustaría ver en futuras placas Hardkernel? bían usar un ODROIDC1 para poder
Hay cinco mejoras de hardware que participar en los concursos, y utilizar
me gustaría ver en los ODROIDs: sus premios para comprar más dispos-
itivos Hardkernel. La familiaridad,
• Elaborar simultáneamente dos tipos de la popularidad y el boca a boca crearía
placas – una con los máximos conectores una dinámica, joven y mayor comu-
y canalizaciones, y otra con los conectores nidad de usuarios ODROID.
y conexiones mínimos. Por ejemplo, una
versión que tuviese sólo 2 puertos USB, un ¿Qué consejo darías a alguien que quiera
conector multimedia y la clavija de alimen- aprender a programar?
tación, lo que sería ideal por su ligero peso, Me viene a la mente una entrevista
un sistema emdebido minimalista. de trabajo, en la que el director me pre-
• Mover todos los puertos, receptores guntó: “¿A qué religión perteneces?”
multimedia y conectores para usar la parte Me quede sorprendido, ya que nunca
superior del dispositivo, lo que permitiría me habían hecho tal pregunta en un
que cambiar cables, periféricos o sistemas lugar tan vanguardista como Califor-
de arranque fuese más sencillo, sobre todo nia. Se dio cuenta de mi perplejidad y
cuando el ODROID lo tenemos en un caja. rápidamente djo: “Quería decir, ¿Cuál
• Reubicar los puertos de la VU para que las es el lenguaje de programación que
conexiones se encuentren en la parte trasera. más te gusta?” Yo dije: “¡Bueno, en ese
• Hacer placas adaptadoras para que caso, yo soy antirreligioso!”
complementos creados para otras placas Pienso que no existe una única
(como Raspberry Pi o Beaglebone Black) se panacea de programación universal.
pueden reutilizar sobre cualquier ODROID. Si lo traslado al mundo de la carpin-
Estas placas adaptadoras se encargarían tería, veo todos estos lenguajes y uti-
de los niveles de Voltaje permitiendo la pro- lidades como el kit de herramientas
tección de circuitos, además de proporcio- de un programador. Siempre hay una
nar otras funciones de compatibilidad. herramienta adecuada para cada tra-
• Incorporar funcionalidades útiles de bajo, y otras similares que se pueden
otros ordenadores de placa reducida, como usar para alcanzar el mismo resultado.
el equivalente de la Unidad en tiempo real Creo firmemente en la reutilización de
Programable (PRU) que está disponible herramientas, en lugar de inventar so-
para Beaglebone Black. luciones.
Linux y Unix son grandes en la reuti-
Aunque no es una innovación, lización de herramientas, e incluyen algu-
creo que Hardkernel podría populari- nas potentes herramientas de única fun-
zar aún mas ODROIDs imitando el cionalidad. En muchos casos, encadenar
reciente éxito de la Raspberry Pi. Sun múltiples herramientas a través de scripts
comenzó el legado Raspberry Pi re- puede ser una rápida solución. Uno puede
galando sistemas a las escuelas de In- entonces optimizar partes de la solución,
formática. Como resultado, cada gra- utilizando otras herramientas o lenguajes. ODROIDS
duado quería trabajar en Sun o bien
utilizar sistemas de Sun en su trabajo.
Mi kit herramientas incluye script
Shell, Python, Java, Perl, JavaScript,
AHORA ESTA
Del mismo modo, si es posible, Hard- LUA, C, C ++, ANTLR, XML, JSON, DISPONIBLE EN LOS
kernel podría asignar fondos de mar- SQL, GDB, Valgrind, Wireshark y
keting para la donación de placas a las otros entornos de trabajo experimen- ESTADOS UNIDOS
escuelas a través de competiciones re- tados. También estoy aprendiendo Go
lacionadas con la Ciencia, Tecnología, y Dart, para ver dónde puedo aplicar- WWW.AMERIDROID.COM
Ingeniería y Matemáticas (STEM) en los en el futuro. Me gustaría que hu-
las que podrían participar los niños. biese más horas al día, ¡hay mucho que
ENVIOS ECONOMICOS
aprender y probar!
ODROID MAGAZINE 50
¡ODROID Magazine ahora está en Reddit!
Echa un vistazo a ODROID Talk Subreddit en http://www.reddit.com/r/odroid

ODROID MAGAZINE 51

También podría gustarte