riot-NAS: Almacenamiento móvil para fotografía de calle

1. Contexto

En estos días en mi país y en mi ciudad se vive una situación de violencia especial, he visto como el periodismo ciudadano y las redes sociales han servido en gran medida para identificar y demostrar el uso de la violencia entre los actores de este conflicto. También he escuchado innumerables veces el testimonio de ciudadanos comunes y periodistas que reclaman que le rompieron o decomisaron sus equipos o les borraron fotografías y videos que habían tomado de estos eventos.

Con tanta tecnología inalámbrica disponible, con el Internet de las Cosas (Internet of Things) ya presente en el día a día, me parece que este material puede registrarse de muchas formas diferentes. Esta es mi contribución a la labor de las personas que registran estos hechos. Espero que ayude de alguna forma a crear el testimonio público de lo que ocurre en estos sitios en conflicto.

2. Objetivos

El principal objetivo es preservar la información (videos y fotografías) que sean tomadas por los asistentes a grandes concentraciones de personas, de tal forma que en caso de perdida o robo del equipo o de que su propietario sea obligado a borrar la información local en el dispositivo, esta información sea conservada para posterior uso en redes sociales o periodismo ciudadano.

Quiero construir:

  • Un dispositivo portátil que permita almacenar un respaldo de las fotografías que se tomen con teléfonos celulares cercanos.
  • Robusto, resistente a golpes y movimientos bruscos, de pequeño tamaño, que sea fácil de ocultar y configurar.
  • La señal de este dispositivo no debe verse afectada por la concentración de grandes cantidades de personas, como ocurre con la señal celular que puede fallar por este motivo.

3. Diseño

Lo primero que pensamos para cumplir el objetivo de almacenar un respaldo de las imágenes de un teléfono inteligente es el uso de aplicaciones como Dropbox o similares, pero considerando la poca disponibilidad de red celular en lugares donde se concentran grandes cantidades de personas o la posibilidad de que se usen inhibidores celulares en estos sitios, lo hace inviable. Esto deja la alternativa de construir algún medio de almacenamiento con capacidades inalámbricas, portátil y que se pueda ocultar fácilmente para realizar estas labores.

Buscamos además que una persona pueda llevarlo consigo disimulándolo adecuadamente y que teniendo un comportamiento de bajo perfil pase desapercibida en la multitud usando el dispositivo. Las personas que hagan la captura de imágenes pueden estar en un rango de hasta 50 o 60 metros a la redonda del portador y el dispositivo será autónomo en el manejo de las conexiones sin depender de Internet, red celular u otro equipamiento.

riotNAS2 riotNAS1 riotNAS2
Se espera cubrir un área determinada y que funcione sin necesidad de la existencia de redes externas. Una persona porta el riot-NAS y todos los telefono configurados cercanos respaldan su información en él. Un enrutador con software modificado, una fuente de alimentación portátil y una memoria USB es lo requerido.

Un enrutador ejecutando openWRT es perfectamente capaz de manejar lo necesario para esta tarea, el almacenamiento de imágenes, el Wifi configurado en modo Access Point y un servidor DHCP que gestione la conexión de los teléfonos clientes. Buscando entre los enrutadores compatibles encontramos el MR-3020 de TP-LINK que es de pequeño tamaño, bajo consumo y con puerto USB para la conexión de los periféricos y medios de almacenamiento que sean necesarios.

Después del salto encontrarás más detalles.

4. Materiales

Los materiales que utilizaremos para este diseño son los que se presentan a continuación, openWRT se ejecuta en una gran cantidad de dispositivos por lo que si tiene WIFI y puerto USB puedes utilizarlo.

20140302_172709 20140302_172725 20140302_172737 20140302_172744 20140302_172752
TP-LINK MR3020 Vista del modelo Pack de Baterias USB Pack de Baterias USB Memoria USB >= 1GB

5. Preparando el enrutador TL-MR3020 con OpenWRT

Descargamos las fuentes del ImageBuilder del OpenWRT:

Ref: http://wiki.openwrt.org/doc/howto/obtain.firmware.generate

cd ~
mkdir openwrt && cd openwrt
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/OpenWrt-ImageBuilder-ar71xx_generic-for-linux-x86_64.tar.bz2
tar -xvjf OpenWrt-ImageBuilder-ar71xx_generic-for-linux-x86_64.tar.bz2
cd OpenWrt-ImageBuilder-ar71xx_generic-for-linux-x86_64

Generamos una imagen con los paquetes básicos para manejo de particiones ext4:

make -j 5 image PACKAGES="kmod-usb-storage block-mount kmod-fs-ext4 e2fsprogs"

Instalamos el firmware generado en el enrutador:

Luego de una compilación buscamos el archivo bin/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin que es el adecuado para nuestro dispositivo.

  • Si tienes el firmware que viene de fábrica con el enrutador:
    Haces login en el enrutador, vas a System Tools / Firmware Upgrade y cargas el archivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin

    Load firmware in TL-MR3020

  • Si vienes desde una versión de openWRT:
    Ejecutas los siguientes comandos desde el dispositivo para cargar el nuevo firmware desde un servidor web al enrutador, en este caso now.bin es el archivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin que le hemos dado acceso previamente desde nuestro servidor web 10.1.0.200.

    # Almacena en /tmp la nueva imagen del firmware a instalar
    cd /tmp
    wget http://10.1.0.200/now.bin
    # Instala el nuevo firmware y espera a que reinicie
    mtd -r write now.bin firmware
    

La configuración de red por omisión del dispositivo le da una dirección IP de 192.168.1.1, la podemos modificar cambiando el archivo /etc/config/network, en mi caso lo modifiqué a:

# Archivo /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config globals 'globals'
option ula_prefix 'fd6a:0f33:f4d9::/48'

config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '10.1.0.250'
option gateway '10.1.0.10'
option dns '4.4.4.4 8.8.8.8'
option netmask '255.255.255.0'

Con esta configuración el enrutador recién instalado tiene acceso a internet lo que permitirá mas adelante instalarle los paquetes que requiera para ejecutar otros servicios.

Formateamos la memoria USB con una particion tipo ext4 y activamos extRoot

Ref: http://wiki.openwrt.org/doc/howto/usb.storage

Conectamos la memoria USB que vamos a usar para almacenamiento externo, allí vamos a guardar las imágenes transferidas y se va a montar para dar almacenamiento extra a nuestro sistema openWrt.

Lo formateamos:

mkfs.ext4 /dev/sda1

Montamos el dispositivo:

mount -t ext4 /dev/sda1 /mnt

Generamos el nuevo archivo /etc/config/fstab y copiamos los archivos básicos a la memoria USB

block detect > /etc/config/fstab
tar -C /overlay -cvf - . | tar -C /mnt -xf -

Ahora modificamos el archivo /etc/config/fstab para que al reiniciar monte la memoria USB en la ruta /overlay y podamos almacenar las imágenes y los paquetes adicionales, debe quedar algo como esto:

# Archivo /etc/config/fstab
config 'global'
option anon_swap '0'
option anon_mount '1'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'

config 'mount'
option device '/dev/sda1'
option target '/overlay'
option enabled '1'
option fstype ext4
option options rw,sync
option enabled_fsck 0

Reiniciamos el dispositivo y verificamos que el sistema montó adecuadamente la unidad extra de almacenamiento, en mi caso una memoria USB de 1GB:

root@OpenWrt:/# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                  924.0M      1.2M    859.0M   0% /
/dev/root                 2.3M      2.3M         0 100% /rom
tmpfs                    14.1M     44.0K     14.1M   0% /tmp
/dev/sda1               924.0M      1.2M    859.0M   0% /overlay <<-- Memoria USB!
overlayfs:/overlay      924.0M      1.2M    859.0M   0% /
tmpfs                   512.0K         0    512.0K   0% /dev

A partir de ahora cualquier modificación que se haga del dispositivo quedará almacenado dentro de la memoria USB, recordemos que dentro de /overlay se guarda toda modificación del sistema openWrt que no corresponda a la imagen del firmware instalada.

Configuramos Samba

Ref: http://diantokam.blogspot.com/2012/11/openwrt-samba-file-server.html

Verificamos la conectividad a Internet:

root@OpenWrt:/# ping google.com
PING google.com (190.142.193.45): 56 data bytes
64 bytes from 190.142.193.45: seq=0 ttl=53 time=147.005 ms
64 bytes from 190.142.193.45: seq=1 ttl=53 time=146.919 ms

Instalamos los paquetes necesarios para el resto de funcionalidades planeadas:

opkg update
opkg install samba36-server luci-app-samba

Creamos un nuevo usuario que será el dueño de los archivos de imágenes que vamos a almacenar, esto se hace editando el archivo /etc/passwd y copiando la linea de nobody cambiando solamente el nombre de usuario y el ID:

#Archivo /etc/passwd
root:x:0:0:root:/root:/bin/ash
daemon:*:1:1:daemon:/var:/bin/false
ftp:*:55:55:ftp:/home/ftp:/bin/false
network:*:101:101:network:/var:/bin/false
nobody:*:65534:65534:nobody:/var:/bin/false
venezuela:*:1000:65534:nobody:/var:/bin/false

Le asignamos una contraseña al nuevo usuario:

passwd venezuela

Iniciamos el servicio de Samba y creamos un usuario de Samba con la misma contraseña:

/etc/init.d/samba start
smbpasswd -a venezuela

Modificamos el archivo de configuración de Samba, en /etc/config/samba para apuntarlo al sitio donde va la carpeta compartida:

#Archivo /etc/config/samba
config samba
option 'name' 'servermob2'
option 'workgroup' 'localarea'
option 'description' 'server in a localarea'
option 'homes' '0'

config sambashare
option name 'datapics'
option read_only 'no'
option create_mask '0777'
option dir_mask '0777'
option path '/overlay/datapics'
option guest_ok 'yes'
option writeable 'yes'
option users 'venezuela'

Creamos la carpeta compartida y le damos los permisos necesarios:

mkdir /overlay/datapics
chown venezuela.nogroup /overlay/datapics

Reiniciamos el servicio y verificamos que esta ejecutandose adecuadamente:

root@OpenWrt:/# /etc/init.d/samba restart
root@OpenWrt:/# ps w
 1069 root      3232 S    /usr/sbin/smbd -D  <<-- Servicio ejecutandose
 1071 root      3276 S    /usr/sbin/nmbd -D

Configuramos para que se ejecute el Samba al inicio, por alguna razón la instruccion /etc/init.d/samba enable no nos funcionó adecuadamente, por lo que creamos un archivo llamado start.sh que grabamos dentro de /root, a este archivo lo llamaremos desde /etc/rc.local que es el script que se ejecuta al inicio del dispositivo. Asi tendremos:

Archivo /root/start.sh

#!/bin/sh
#Archivo /root/start.sh
# Arranque de procesos del sistema
sleep 10
/etc/init.d/samba start

Archivo /etc/rc.local

#Archivo /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

/root/start.sh &
exit 0

Finalmente le damos permisos de ejecución

chmod a+x /root/start.sh

Reiniciamos el dispositivo y luego que arranque comprobamos que funciona adecuadamente.

root@OpenWrt:/# ps w
 1069 root      3232 S    /usr/sbin/smbd -D  <<-- Servicio ejecutandose
 1071 root      3276 S    /usr/sbin/nmbd -D

Finalmente probamos el acceso desde un PC accediendo a la IP del enrutador con el nombre de usuario y contraseña configurado e intentamos grabarle algún archivo:

winsamba

Y verificamos en el dispositivo:

root@OpenWrt:/# ls /overlay/datapics/
prueba.txt

Configuramos WIFI

Ref: http://wiki.openwrt.org/doc/recipes/routedap

Necesitamos activar el Wifi del enrutador en modo Access Point, nuestro teléfono se conectará a él de forma autónoma, podemos activarlo con cifrado o sin cifrado, yo escogí esta última opción para que sea simple compartir el NAS con cualquier persona cercana y delego la seguridad al servicio de Samba que para esta aplicación creo que es suficiente. Para activar el WIFI tenemos que ajustar de la siguiente manera el archivo /etc/config/wireless

#Archivo /etc/config/wireless
config wifi-device radio0
option type mac80211
option channel auto
option hwmode 11ng
option path 'platform/ar933x_wmac'
list ht_capab SHORT-GI-20
list ht_capab SHORT-GI-40
list ht_capab RX-STBC1
list ht_capab DSSS_CCK-40
option htmode HT20
#REMOVE THIS LINE TO ENABLE WIFI:
#option disabled 1

config wifi-iface
option device radio0
option network lan
option mode ap
option ssid mobile_server
option encryption none

Al reiniciar debemos ver al enrutador con SSID mobile_server, aunque no nos entregará direccion IP aún.

Configuramos DHCP

Ref: http://wiki.openwrt.org/doc/uci/dhcp

A fin de que el dispositivo funcione de manera autónoma tenemos que hacer que nos entregue dirección IP, por lo que configuraremos su servicio de DNSMasq para que actúe como servidor de DHCP, eso se hace ajustando el archivo /etc/config/dhcp de la siguiente forma:

# Archivo /etc/config/dhcp
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.auto'

config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '1h'
option dhcpv6 'hybrid'
option ra 'hybrid'
option ndp 'hybrid'

config dhcp 'wan'
option interface 'wan'
option ignore '1'

config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'

config dhcp 'wan6'
option dhcpv6 'hybrid'
option ra 'hybrid'
option ndp 'hybrid'
option master '1'

Desconectamos el cable de red, reiniciamos y podremos conectarnos a la red mobile_server y nos entregará una dirección IP en el rango 10.1.0.100 a 10.1.0.150:

Screenshot_2014-03-05-23-57-07

6. Configuración de teléfonos

Hice pruebas solamente con teléfonos Android, la aplicación que mejor funcionó fue SyncMe Wireless, es gratuita y puede programarse para que sincronice automáticamente cada cierto tiempo (2 minutos por ejemplo). A continuación la configuración de esta herramienta:

  • Instalamos la aplicación desde el Google Play (https://play.google.com/store/apps/details?id=com.bv.wifisync), luego nos conectamos a la red del riot-NAS como lo hicimos previamente, configuramos el acceso ingresando a la aplicación y seleccionando Agregar Equipo y configuramos el acceso al riot-NAS cuando lo encuentre, ponemos nombre de usuario, contraseña.
Screenshot_2014-03-03-13-08-50 Screenshot_2014-03-03-13-09-50 Screenshot_2014-03-03-13-11-24
  • Configuramos la tarea de sincronización para ese equipo, ponemos la carpeta donde se guardan las fotos en el teléfono, carpeta datapics, donde se almacenarán en el enrutador. Se selecciona la opción donde solo se copia del telefono al PC la información y programamos que esta tarea se ejecute cada 1 minuto por ejemplo. Con esto mantendremos sincronizado el riot-NAS y los teléfonos que utilicemos en caso de pérdida o borrado. Por favor recordemos que la opción de borrado de seguimiento y sobreescribir debe estar desactivada para no perder información.
Screenshot_2014-03-03-13-10-06 Screenshot_2014-03-03-13-11-35 Screenshot_2014-03-03-13-12-15
Screenshot_2014-03-03-13-12-24 Screenshot_2014-03-03-13-12-32 Screenshot_2014-03-03-13-12-40

7. Poniendo todo junto

Finalmente ponemos todo junto en un empaque adecuado, no debe ser un envase metálico para no afectar el alcance de la señal, pero debe disimular el dispositivo.

20140302_172910 20140302_173554 20140302_173651 20140302_173709

8. Pruebas de Calle

Conectamos 3 teléfonos al riot-NAS y salimos a la calle para realizar pruebas del sistema, funcionó perfectamente en distancias hasta de aproximadamente 60 metros a la redonda, la duración de la batería alcanzó de sobra para las 4 horas de funcionamiento que duró la prueba y la duración de la batería de los telefonos si bien se resintió un poco, alcanzó para cubrir el tiempo de uso. Obviamente antes de salir a estos eventos todos los dispositivos deben estar cargados al máximo. Estas fueron algunas de las fotos que obtuvimos.

test008 test006 test005 IMG-20140306-WA0003
IMG-20140306-WA00AA IMG-20140306-WA0000 IMG-20140306-WA0002 (1) IMG-20140306-WA0001

9. Posibles Mejoras

Un empaque mas elaborado para ocultarlo

Mientras hacía el desarrollo recordé las escenas de The Shawshank Redemption (o Sueños de Fuga en español), en esta excelente película el protagonista recorta el interior de un libro para ocultar un pequeño martillo. Si sacamos de su carcaza cada uno de los componentes podemos minimizar el tamaño y escogiendo un libro de pasta dura adecuado podremos ocultarlo de forma mucho mas eficiente.

m_avatar

¿Y si agregamos otra tarjeta WIFI?

Debido al uso del riot-NAS principalmente en zonas álgidas, siempre existe el riesgo de que sea dañado, perdido o inutilizado de alguna forma, una manera de mantener mas seguros nuestros respaldos sin contar con una conexión de red móvil celular es agregar una segunda interfaz de red WIFI y configurar el openWRT con un script que continuamente este monitoreando señales WIFI abiertas y al ver una red disponible se conecte a ella, abra un tunel ssh para crear una VPN y suba los archivos que falten por respaldar a la nube. Si la conexión se pierde, continuamente estará monitoreando hasta que encuentre una nueva conexión abierta con la que pueda continuar.

En manifestaciones numerosas es común que las personas que tienen comercios o residencia cerca de esas zonas abran el WIFI para permitir las labores de periodismo ciudadano por lo que no es descabellado pensar en esta alternativa.

riotNAS3 wifi-upgrade

¿Será posible usar una SD Transcend?

No tengo una tarjeta SD Transcend para realizar pruebas, pero en teoría esta tarjeta permitiría añadir la posibilidad de usar el riot-NAS no solo con teléfonos celulares sino también con cámaras digitales convencionales. Por lo que he investigado nada impide que pueda ser utilizado de esta forma. Lo que haría seguro el respaldo de imágenes para equipos periodísticos tradicionales.

Ref: http://www.transcend-info.com/Learning/?LC=3&Func1No=3&Func2No=211&Func3No=137

01_Intro-1

Advertencia

Recuerda que no me hago responsable de ningún daño que sufran tus dispositivos o tu mismo por seguir las instrucciones de este documento. Por favor haz que prive el sentido común en tus acciones. Este documento tiene fines meramente informativos.

Offtopic: ¿Qué pasa en Venezuela?

Explicar en mis palabras lo que ocurre en estos momentos en mi país y mi ciudad es algo que escapa del alcance de este sitio web, por supuesto tengo mi opinión política clara pero es algo que no pienso discutir aquí. Si estás en desacuerdo con lo que se menciona en los enlaces a continuación por favor no lo comentes en este blog, la situación que veo y vivo en el día a día donde vivo me da un enfoque que te aseguro difícilmente tendrás desde el otro lado de tu pantalla y no me harás cambiar de opinión. Sin embargo si estas genuinamente interesado en lo que ocurre en mi país te invito a que busques en Google sobre los hechos, te adelanto algunos enlaces que los medios internacionales han publicado sobre la situación:

Para ponernos en contexto:
https://www.youtube.com/watch?v=oN6As–Ht5A

BBC:
http://www.bbc.co.uk/mundo/noticias/2014/03/140305_america_latina_venezuela_tachira_aa.shtml

New York Times:
http://www.nytimes.com/2014/02/25/world/americas/in-venezuela-middle-class-joins-protests.html
http://www.nytimes.com/2014/02/21/world/americas/protests-swell-in-venezuela-as-places-to-rally-disappear.html

El País de España:
http://internacional.elpais.com/internacional/2014/03/04/actualidad/1393963012_680472.html
http://internacional.elpais.com/internacional/2014/03/03/actualidad/1393873574_736264.html

No importa cual sea tu orientación política, no importa cual sea la mayoría o minoría a la que pertenezcas, el periodismo ciudadano y las redes sociales son una inigualable herramienta para denunciar si eres sometido a algún abuso, espero este experimento educativo te ayude de alguna forma en la defensa de tus derechos.

About these ads

8 comments

  1. Impresionante el trabajo que has hecho. Para denunciar abusos, excesos, humillaciones, torturas. Que la autoridad no signifique impunidad.

    Tu idea sirve también para países pseudo democráticos en los que leyes mordaza pretenden impedir grabar a la policía en sus actuaciones en las manifestaciones. Vamos dando caña.

    Los movimientos alternativos tomamos nota.

  2. Si queremos cubrir una calle de 120 o 180 m. por ejemplo, al mismo tiempo, ¿Cómo podemos unir y duplicar o triplicar este dispositivo?. Gracias y un saludo.

  3. Muy buena idea, se resuelve el problema de storage local en la manifestación.
    Lo que yo veo es que el problema es la conexión a Internet y la escalabilidad. Podrías tener un DHT funcionando entre multiples Riot-NAS, todos sobre wifi. Bastaría un unico RiotNas conectado a Internet para que todos ellos pudieran hacer backup.

    El problema de fondo no es el backup de fotos, sino la falta de conectividad a Internet. Sería muy útil ofrecer algo parecido a FON en las manifestaciones o montar una red wifi adhoc entre unas cuantas personas, abriendo por ejemplo solamente el puerto 80 y los puertos que use dropbox. O tmb podrías usar Owncloud, es muy sencillo de instalar…

    En fin, muy buena iniciativa, mis felicitaciones.

  4. Y yo me pregunto… con las apps que hay para móvil, que te crean un servicio de carpetas compartidas en un pispas y alguna aplicación tipo FolderSync para sincronizar automáticamente cualquier carpeta con la nube…

  5. Buen artículo. No obstante, he de decir que puestos a hacer un sistema robusto, lo suyo sería usar un sistema de red p2p mesh donde todos los nodos configurados a tal efecto actúan de copia de respaldo.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s