Raspberry Pi – Asignando un dominio .local

Es muy probable que ha estas altura estemos bien familiarizados con el comando ifconfig, un comando que nos permite conocer la dirección IP que se le ha asignado a nuestra Raspberry Pi y que sirve de referencia para muchas de las actividades que podemos hacer con ella, acceso SSH, VNC, Web, etc.

¿Pero que sucede cuando por alguna razon olvidamos la IP, o reiniciamos el Router y le asigna una dirección diferente a la Raspi?, en el mejor de los casos tenemos el teclado y monitor conectados para ver en pantalla la nueva IP, pero, ¿y si no es así? estoy seguro que para muchos esto ha sido un gran dolor de cabeza.

Una de las maneras mas fáciles y rápidas de darle solución a este problema, es aplicando una técnica conocida como mDNS o Multicasting Domain Name Servicing, que básicamente consiste en tener un pequeño servicio (demonios en linux) en nuestra Raspi que le permita ser descubierta por cualquier equipo en la red a través de un nombre de dominio.

domain name

Antes de empezar con la instalación es importante tener las referencias y el software de nuestra Raspi actualizado, esto básicamente es una costumbre a considerar para mantener al día nuestro software y reducir al máximo los posibles bugs entre versiones. Para hacerlo solo ejecutamos:

sudo apt-get update

sudo apt-get upgrade

En caso de que aparezca algún tipo de mensaje solo tecleamos “Y” para que continue con la instalación. Posteriormente instalaremos “Avahi”, el servicio que mantendrá nuestra tarjeta visible en la red:

sudo apt-get install avahi-daemon

Prácticamente con esto seria suficiente, pero podemos mejorarlo aun mas definiendo algún nombre de dominio único que podamos recordar con facilidad y que suele ser de gran ayuda para cuando tenemos mas de una Raspberry Pi conectada a la misma red.

Para lograr este ultimo paso editamos los archivos:

sudo nano /etc/hosts

Y cambiamos la palabra “raspberrypi” de la ultima linea por el nombre que queramos asignarle, “robotcos” en mi caso. Y del mismo modo el archivo:

sudo nano /etc/hostname

reiniciamos para terminar y deberíamos poder acceder de la manera que queramos (SSH, VNC, Web) con el nombre que asignamos de la siguiente manera:

ssh pi@robotcos.local

.local es una extension reservada para LANs, por lo que al ser interpretada por un router automáticamente hace una búsqueda en la red local.

Simple no!? y mucho mas fácil de recordar que una dirección IP.

 

Raspberry Pi – Drivers TL-WN725N

Como ya hemos hablado en este blog, una de las maneras mas practicas de conectar nuestra Raspberry a la red y a internet es mediante WiFi, ya que así tenemos esa libertad de movernos sin problemas de cables. Existe muy poca variedad de adaptadores USB compatibles con el sistema de nuestra tarjeta y es probable que algunos de estos no los encontremos ni en la tienda mas popular de nuestra ciudad, por lo que recurrimos a comprar cualquier modelo que al llegar a casa no nos servirá.

En esta entrega veremos como agregar algunos drivers, para lograr expandir la compatibilidad de nuestra Raspi, específicamente para TL-WN725N de TP-LINK, que suele ser uno de los mas fáciles de encontrar.

c26-TL-WN723N-1-l

El primer paso es revisar la version de Linux que tenemos instalada, el comando uname -a devuelve una descripción similar a:

Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux

De esta información lo que tomaremos para mas adelante es la parte 3.12.28+ #709, tengamos en cuenta que este dato puede variar para cualquiera.

En el siguiente paso debemos conectar el adaptador y mostrar el listado de los dispositivos conectados con el comando lsusb, encontraremos la descripción similar a:

Bus 001 Device 005: ID 0bda:8179 Realtek Semiconductor Corp.

Que corresponde al index y ID del adaptador USB que conectamos, el driver que instalaremos esta limitado a dispositivos con los siguientes IDs:

ID 2001:3310
ID 2001:330F
ID 07B8:8179
ID 0BDA:0179
ID 0BDA:8179

y para versiones de linux superiores a  3.12.28:

ID 056E:4008
ID 2001:3311
ID 0DF6:0076

Una vez que se tenga esta información tendremos que encontrar la relación con el archivo que tenemos que instalar en el siguiente listado:

Para mi caso  3.12.28+ #709, #710 – 8188eu-20140908.tar.gz hace match con la version de linux que tengo instalada por lo que 8188eu-20140908.tar.gz es el archivo que tendré que instalar.

La serie de comandos anteriores indica la forma de descargar e instalar, recuerden cambiar 8188eu-201xyyzz.tar.gz por el del archivo correcto para su version, 8188eu-20140908.tar.gz en mi caso.

Si llegamos hasta aquí sin ningún problema, solo restaría configurar las credenciales de nuestra red como hemos visto anteriormente (WiFi Setup) y reiniciar la Raspberry Pi, espero les sirva :).

Referencia: Raspberrypi.org (ingles)

Raspberry Pi – Multiples redes WiFi

En uno de nuestros post anteriores hablamos de como configurar nuestra Raspi para conectarse de manera automática a la red utilizando un adaptador USB-WiFi (ver aqui), así como hablamos de acceder de manera remota desde otro equipo utilizando herramientas como VNC o SSH (ver aqui), lo cual nos facilita la vida al no tener que comprar un monitor y accesorios solo para usarlos con nuestra tarjeta.

Hasta aquí todo es felicidad, la Raspi se conecta al iniciar, entramos a ella por SSH o al modo gráfico por VNC y trabajamos en casa u oficina sin ningún problema, pero ¿que pasa cuando me tengo que mover? si necesito conexión tengo que volver a configurar la raspberry para la nueva red ¿cierto? y ocupare monitor y accesorios nuevamente, ¿tendré que llevarlo conmigo a todo lados?.

Bueno pues una de las soluciones mas simples y rápidas es configurar nuestra tarjeta para que recuerde el mayor numero de redes o puntos de acceso a los que posiblemente se podría conectar, la casa, la oficina, la escuela, la casa de un amig@, etc.

Para que esto funcione el primer archivo a editar es:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

y tendríamos que dejarlo similar a:

como vemos tenemos que crear un objeto “network” por cada red que nuestra Raspi recordara, así como un alias para cada una dentro del parametro id_str.

Y el segundo archivo es:

sudo nano /etc/network/interfaces

y tendría que quedar como sigue:

es muy similar al que teníamos anteriormente la única diferencia es que se agrega la referencia al archivo donde configuramos los datos de acceso y como manejara cada una de las redes. Y eso es todo! en teoría cada que nuestra Raspi encienda tratara de conectarse a cada una de las redes que hayamos listado en el archivo en el mismo orden en el que se pusieron, Red1, Red2, etc. hasta que logre una conexión. Sin duda para nosotros ha sido de gran ayuda puesto que ya no necesitamos de monitor y accesorios cada que hay que moverse, procuramos llevar listadas todas las posibles redes para conectarnos sin problema, incluso la de nuestro telefono para cuando las redes fallan y tenemos que compartir el internet, ojala les sirva tambien 🙂

 

Raspberry Pi – Lección 14 – Raspberry Pi como iBeacon

iBeacon

Introducción
A estas alturas es muy probable que ya hayan escuchado hablar sobre iBeacons, y probablemente tengan una idea de lo que son y del como funcionan. En esta entrega hemos decidido adentrarnos en el tema y abordarlo con un caso practico!. Estoy seguro que ahora que Apple libero sus especificaciones sobre estos dispositivos, escucharemos de ellos con mayor frecuencia.

 Que es?
En gran resumen, los iBeacons son pequeños dispositivos Bluetooth Low Energy (BLE) que proporcionan información especifica, como su posición y su respectivo indicador único (UUID), que incluso en cantidad, pueden usarse para obtener información sobre la navegación en espacios cerrados como tiendas o museos. Una de sus grandes y tan aplaudidas ventajas es la interacción con dispositivos sin necesidad de que el usuario realice alguna acción.

Caso Practico
Ademas de ser parte de la estandarización del Bluetooth 4.0, iBeacon incorpora un protocolo de comunicación que lo valida como tal, consiste básicamente en un único pulso de 128-bit (UUID) para catalogar una entidad u organización, y dos valores de 16-bit conocidos como “Major” y “Minor” para identificar a cada elemento de una misma entidad.
Un poco mejor explicado lo que necesitaría un BLE para convertirse en iBeacon es un set de bytes con los siguientes datos:
  • ID (uint8_t) – Siempre es 0x02
  • Data Length (uint8_t) – El numero de bytes en el resto del payload = 0x15 (21 en decimal)
  • 128-bit UUID (uint8_t[16]) – El ID de 128-bit que identifica la entidad u organización.
  • Major (uint16_t) – El valor “Major” (para determinar ubicaciones de la misma entidad)
  • Minor (uint16_t) – El valor “Minor” (para determinar los nodos dentro de una misma ubicacion)
  • TX Power (uint8_t) – Este valor se utiliza para estimar la distancia basado en el valor de RSSI 
Por ejemplo, la siguiente serie es valida para el standard iBeacon, separada por “pipes” solo para hacerlo mas entendible:
02 | 15 | B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D | 00 00 | 00 00 | C8
 
A esta señal solo le tendría que preceder el identificador de la compañía, 0x004c para el caso de Apple.

Configurando la RasPi
Como es de saberse, en estos momentos es un poco complicado conseguir un dispositivo iBeacon, y como Hackers curiosos estoy seguro que alguien ya se ha interesado en adquirir alguno para empezar a jugar.
Bueno pues navegando un poco en Internet hemos encontrado suficiente información para convertir nuestra Raspberry Pi en un iBeacon 100% funcional, veamos paso a paso como hacerlo:

1.- Lo primero que necesitaremos es instalar algunas dependencias.

sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev

iB001

2.- Seguido instalaremos Bluez, que es una de las mejores opciones como driver Bluetooth para sistemas Linux.

sudo mkdir bluez
cd bluez
sudo wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.11-tar.xz

iB002

como se ha descargado del repositorio oficial, habrá que compilar el Source Code, esta parte probablemente tome algo de tiempo, pero seamos pacientes y si todo ha ido bien hasta aquí, se instalara sin problema.

sudo unxz bluez-5.11.tar.xz
sudo tar xvf bluez-5.11.tar
cd bluez-5.11
sudo ./configure –disable-systemd
sudo make
sudo make install

iB003

Suponiendo que todo se instalo correctamente 🙂 , apagamos la RasPi (sudo shutdown -h now).

3.- Adaptador USB .

Como tal, la Rapberry no proporciona ningún tipo de comunicación Bluetooth, por lo que será necesario adquirir algún adaptador que nos ayude con esta tarea, no olvidemos que en esta ocasión no seria cualquier adaptador Bluetooth, tendría que ser versión 4.0.
iB007
En nuestro caso hemos conseguido uno de IOGEAR (GBU521) y nos ha funcionado muy bien, aunque hemos visto algunos otro ejemplos con el CSR8510 disponible en tiendas como Adafruit (ver aquí).

Lo conectamos y volvemos a iniciar la RasPi… desde consola y ubicándonos en la carpeta donde instalamos “bluez-5.11” podemos verificar que todo este instalado y configurado correctamente con el comando:
tools/hciconfig
tendríamos que ver una serie de mensajes similares a los de la imagen.
iB004
Podríamos encontrarnos con dos casos, que el servicio este inactivo (DOWN) o en modo escáner (PSCAN), pero nada de que preocuparnos, para que funcione como iBeacon tendríamos que arrancarlo de la siguiente manera:
sudo tools/hciconfig hciO up
sudo tools/hciconfig hci0 leadv
sudo tools/hciconfig hci0 noscan
echo esto, volvemos a verificar el servicio:
iB005
Entre lineas aparecera “UP RUNNING” lo que significa que el adaptador esta listo para funcionar como queremos.

Prueba Final

Para esta prueba hemos tomado la aplicación de Estimote, una de las empresas pioneras en la construcción de iBeacons  y que esta disponible de forma gratuita en la App Store.
Buscando un poco, encontramos el UUID que esta empresa esta manejando, así que solo tendríamos que asignarlo para que la aplicación lo detecte, seria un caso parecido para aplicaciones de cualquier otro proveedor.
El comando a ejecutar seria:
sudo tools/hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D 00 00 00 00 C8 00
Donde, 4C 00 corresponde al ID de Apple, seguido de la serie de bytes requeridos para la especificación iBeacon hasta C8.
En la aplicación básicamente observaremos que nuestra RasPi funcione como iBeacon, para el ejemplo seleccionamos la opción “Distance Demo” y tendríamos que ver como detecta posición de nuestra RasPi sin problema.
iB006

Espero les sea de mucha ayuda esta guía rápida, sobre todo si alguien por aquí hace Software y empieza a meterse con esta nueva tendencia. No prometo nada pero esperamos mas adelante mostrarles un poco el lado de la programación de Apps para interactuar con dispositivos iBeacon 🙂 .

Raspberry Pi – Leccion 13 – USO DE TELEGRAM DESDE LA TERMINAL

telegram

Hola, tras la recién adquisición de Facebook, se ha difundido el temor del cambio en el rumbo del servicio acostumbrado de WhatsApp. Afortunadamente la dependencia de este servicio está siendo cubierta por novedosas aplicaciones como lo es Telegram. Por suerte la página nos ofrece versiones no oficiales que podemos instalar en diferentes sistemas operativos.

Instalación

Para instalar en Raspbian ejecutamos desde la terminal:

1

telgram1

Después de haber clonado el repositorio de GitHub instalamos lo siguiente:

1
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev

Ejecutamos el archivo de configuración y copilamos el programa:

1
2
./configure
make

telegram2

telegram3

¡ A ponerlo en marcha!

Para ejecutar el programa simplemente debemos ejecutar en la terminal:

1
./telegram -k tg.pub

telegrama4

Nota: Como primera vez la aplicación nos pide nuestro numero telefónico incluyendo el signo + y el área del país. Después  si aún no estamos registrados nos preguntará si queremos registrarnos, pedirá nuestro nombre y apellido. Posteriormente enviará un código de verificación a nuestro celular.

COMANDOS COMPATIBLES

Ejecutando el comando help, nos muestra un listado de todos los comandos que admite, sus parámetros y para qué sirve cada uno de ellos.

telegram5

MENSAJERÍA

  • msg <contacto> texto – envía un mensaje.
  • chat_with_peer <contacto> comienza una en una sesión de chat con este contacto. / Salida o / quit para finalizar con este modo.
  • add_contact <phone-number> <first-name> <last-name> – intenta agregar el contacto a contacto-lista por teléfono.
  • rename_contact <usuario> <first-name> <last-name> – intenta cambiar el nombre de contacto.
  • mark_read <contacto> – marca como leídos todos los mensajes con el contacto.

MULTIMEDIA

  • send_photo <contacto> <photo-file-name> – envía la foto.
  • send_video <contacto> <video-file-name> – envía vídeo.
  • send_text <contacto> <text-file-name> – envía un archivo de texto en forma de mensajes sin formato.
  • load_photo / load_video / load_video_thumb <msg-seqno> – cargas de foto / vídeo para descargar.
  • view_photo / view_video / view_video_thumb <msg-seqno> – carga de fotos / video para descargar y empieza visor predeterminado del sistema.

OPCIONES DE CHAT DE GRUPO

  • chat_info <chat> – imprime información sobre el chat.
  • chat_add_user <chat> <usuario> – añadir un usuario para chatear.
  • chat_del_user <chat> <usuario> – eliminar usuario de chat.
  • rename_chat <chat> <new-name>

BÚSQUEDA

  • buscar <contacto> patrón – patrón de búsquedas en los mensajes con los compañeros.
  • global_search patrón – patrón busca en todos los mensajes.

CHARLA SECRET

  • create_secret_chat <usuario> – crea charla secreta con este usuario.
  • visualize_key <secret_chat> – impresiones de visualización de la clave de cifrado.

ESTADÍSTICAS Y VARIOS INFO

  • USER_INFO <usuario> – imprime información sobre el usuario.
  • history <contacto> [límite] – historia impresiones (y la marca como leído). Límite predeterminado = 40.
  • dialog_list – imprime información acerca de sus diálogos.
  • contact_list – imprime información acerca de los usuarios en su lista de contactos.
  • suggested_contacts – información impresa acerca de los contactos.
  • show_license – imprime el contenido de GPLv2.
  • help – imprime esta ayuda.

EJEMPLO:

Para crear una conversación con algún contacto basta con ejecutar telegram y teclear el comando chat_with_peer <contacto> , se habré un chat interactivo. Para poder salir simplemente ejecutamos /exit

telegram8

telegram9

En este ejemplo usé Telegram desde mi ordenador y desde la Raspberry Pi. Otra ventaja de esta aplicación es que te permite registrar varios dispositivos e incluso chatear entre ellos sin ningún problema con un sólo número telefónico.

Para mandar una imagen es igual de sencillo. Sólo ejecutamos el comando send_photo <contacto> <ruta del la foto> y enseguida se empezará a cargar la imagen o foto.

telegram10

telegram11

Estoy buscando la manera de poder ejecutarlo desde Python para poder hacerlo interactivo con los pines de la Raspberry Pi pero por el momento es muy agradable chatear desde nuestra terminal de la Raspbian.

Raspberry Pi – Lección 12 – Uso de PiCamera con Python

picamerahk

 Hay muchas formas de usar nuestra Pi Camera con Python, sin embargo, siempre era con subprocesos, ejecutando un programa distinto a Python dentro de este. Hasta que hace pocos días salio la noticia en Raspberrypi.org  de una librería para controlar nuestra Pi Camera, nativa de Python. Con esta librería podemos controlar desde un preview hasta el control del led que incluye la Pi Camera. Todo esto gracias a  Dave Hughes.

Instalemos

Para instalar como todo programa es recomendable casi necesario actualizar nuestra Raspberry Pi, para que pueda encontrar la librería en los repositorios, usamos los típicos comandos para la terminal;

 
 
sudo apt-get update
sudo apt-get upgrade

y para descargar e instalar la librería basta con ejecutar esto en el Terminal.

sudo apt-get install python-picamera

Vista previa

Esta opción nos permite visualizar en tiempo real la imagen dela cámara, ademas de poder ajustar los parámetros como brillo y ver los resultados inmediatamente en la vista previa. Crearemos un ejemplo que nos permita ver la vista previa.

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    time.sleep(10)
    picam.stop_preview()
    picam.close()

Lo guardamos y lo ejecutamos como cualquier otro programa de python mediante consola.

Tomar una Foto

Tomar una foto con esta librería basta con una función, como lo muestra el siguiente ejemplo:

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    time.sleep(5)
    picam.capture(‘nombre.jpg’)
    picam.stop_preview()
    picam.close()

En el ejemplo fue guardada una captura con el formato ‘jpg’ pero de la misma forma podemos guardar la captura en ‘png’, ‘gif’, ‘bmp’, ‘yuv’, ‘rgb’ y ‘raw’. Lo que es bastante cómodo para poder guardar directamente al formato que ocupemos.

Filmar un Vídeo

Al igual que el anterior ejemplo basta con una función, en el siguiente ejemplo mostraremos con preview y gravaremos un vídeo al mismo tiempo de 20 segundos.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.start_recording(‘video.h264’)
        picam.wait_recording(20)
        picam.stop_recording()
    picam.stop_preview()
    picam.close()

Por el momento solo he podido grabar en formato H264,  es importante  agregar el wait_recording() ya que aparte de servir como el time.sleep(), hace un reconocimiento al mismo tiempo que va gravando y si por ejemplo ya no hay espacio en disco para la grabación.

Resolución

Como notaron al tomar la foto es de mayor resolución que el vídeo incluso que la vista previa. “En concreto, el sensor de la cámara tiene una resolución de 2592×1944 píxeles (aproximadamente 5 mega píxeles en el área), pero sólo los 1920×1080 píxeles en el centro del sensor se utilizan para las previsualizaciones o video” Dave Hughes. 

sensor_area

Por esta razón y muchas mas, la librería cuanta con una opción para seleccionar la resolución que queramos como en el siguiente ejemplo.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.resolution = (2592, 1944)
    picam.start_preview()
    time.sleep(3)
    picam.capture(‘foto.jpg’)
    picam.stop_preview()
    picam.close()

También debido a que entre mas resolución la imagen es mas pesada, así que también nos brindan un modo de reescalar la imagen, es decir que abarque todo lo que la cámara ve pero que se guarde en una resolución menor .

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.resolution = (2592, 1944)
    picam.start_preview()
    time.sleep(3)
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

 Led

Aveces queremos tomar fotos y que nadie se de cuenta por desgracia la cámara tiene un led que se enciende al usarla, ahora gracias a esta librería podemos desactivar este molesto led.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.led= False
    picam.start_preview()
    time.sleep(3)
    picam.stop_preview()
    picam.close()

Nota: Para poder ejecutar en caso de ajustar el led, tendremos que ejecutar como root, o bien con sudo python programa.py

ISO

Para aquellos que sepan un poco mas de fotografía les agradara saber que se puede ajustar el ISO, para poder sacar mejores fotografías y es muy sencillo, solo tenemos que llamar a la función ISO e igualarla a un valor, que pueden ser alguno de estos; 100, 200, 320, 400, 500, 640, 800.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.ISO =500
    time.sleep(3)
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Velocidad de Obturación

Otra característica que me gusto mucho es que puedes controlar la velocidad de obturación, lo que te permite sacar fotografías a un mas profesionales. Los valores de dan en micro segundos.

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.ISO =100
    time.sleep(3)
    picam.shutter_speed= 300000
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Brillo

Ademas de todas las anteriores igual se puede ajustar el brillo basta con asignar un valor del 0 al 100 .

#!/usr/bin/python
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.start_preview()
    picam.brightness= 60
    picam.ISO =100
    time.sleep(3)
    picam.shutter_speed= 300000
    picam.capture(‘foto.jpg’,resize=(1024,768))
    picam.stop_preview()
    picam.close()

Efectos de imagen

Como toda buena cámara, la Picam cuenta con efectos de cámara, ahora mismos solo he probado'negative' , 'solarize' y 'gpen'

#!/usr/bin/python
 
import time
import picamera
 
with picamera.PiCamera() as picam:
    picam.led = False
    picam.start_preview()
    picam.image_effect = ‘negative’
    time.sleep(20)
    picam.stop_preview()
    picam.close()

Nota:  Los parámetros como brillo, ISO, contraste, efectos de imagen , saturación y nitidez se pueden ajustar cuando la vista previa esta activada.

Se pueden ajustar infinidad de cosas mas, como saturacion, nitidez, rotar imagen, hacer streaming, time lapse, ráfagas de fotos muy rápidas. Los invito a que ustedes mismos experimenten con toda esta librería, encontraran toda la documentación en PICAMERA .

Este es un TimeLapse que hice cuando estaba probando la librería, espero y les guste. Gracias por su tiempo, les mando un saludo y suerte en sus proyectos…

portada

Lección 11 – Raspberry Pi – Uso de WhatsApp en Python (Yowsup)

Whatsapp

Sabemos que no hay nada mejor para un proyecto de electrónica que la capacidad de comunicarse, con otros dispositivos, con el medio pero mejor aun con nosotros mismos. Bueno pues para que nuestro proyecto pueda comunicarse les enseñare lo básico para usar WhatsApp en nuestra Raspberry Pi con ayuda de la librería Yowsup.

Instalemos Yowsup

Como siempre debemos actualizar nuestro sistema al mas reciente, pero aparte necesitamos de Python Dateutil a si que ejecutaremos esto en el terminal;

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dateutil

Tendremos que descargar todo el repositorio que se encuentra en Github https://github.com/tgalal/yowsup ya sea manualmente copiarlo a nuestra Raspi o bien ejecutar en el terminal;

git clone git://github.com/tgalal/yowsup.git

 Registro de Numero

Como sabemos para el uso de WhatsApp se requiere registrar un numero, desafortunadamente solo se puede usar un numero por dispositivo, así que a conseguir un numero para registrar nuestra Raspberry, este puede ser ficticio pero recuerden que tendremos que validarlo por un mensaje o llamada.

Una vez ya conseguido el numero que queremos usar debemos acceder desde el terminal a la siguiente ruta;

cd /home/pi/yowsup/src

bueno en mi caso porque yo descargue el repositorio directamente a “/home/pi” en su caso tendrán que poner la ruta donde copiaron su repositorio.

Ahora se necesita de editar el config.example para colocar nuestro numero. Podemos editarlo con nano ejecutando en la terminal;

nano config.example

Al principio del archivo explica donde irán cada uno de nuestros datos, que quedaría de la siguiente forma.

cc= 52
phone= 521**********
id=
password=

 cc es el prefijo telefónico de tu país, en mi caso México por eso es 52. En phone prefijo + teléfono, en caso de México queda 521+tu numero. Precinamos Ctrl+x para salir, después guardamos con el mismo nombre con “s” o “y” y enter.

Para registrar nuestro numero tendremos que ejecutar en la terminal igualmente;

python yowsup-cli -c config.example --requestcode sms #Verificar por sms
python yowsup-cli -c config.example --requestcode voice #verificar por llamada

whats1
Nota:  si aparece un error diciendo que ha fallado por tener una versión vieja, tendremos que meternos a este archivo src/Yowsup/Common/constants.py para editar esto

Tendremos que esperar a que nos llegue un código ???-??? (3 dígitos+ – +3 dígitos), una ves que llegue procedemos a solicitar nuestra password, ejecutando lo siguiente;

python yowsup-cli -c config.example --register ???-???

whats2

Ahora copiamos el pw a nuestro archivo  config.example en el apartado de password, y listo esta registrado nuestro numero en la Raspberry pi.

Utilizar Yowsup-cli

Yowsup-cli, es un pequeño programa en python que nos brinda la facilidad de mandar y recibir mensaje en nuestra terminal y es bastante sencillo de utilizar.

Mandar un mensaje a uno numero:

Para mandar mensaje solo necesitamos seguir la siguiente sintaxis y ejecutarla en la terminal.

python yowsup-cli -c config.example -w -s 521numero "Mensaje"

whats3

Utilizamos el -w para esperar a que el mensaje sea mandado antes de cerrar la aplicación, -s indica que queremos mandar un mensaje.

Podemos ver toda la funcionalidad de Yowsup-Cli .

Recepción de Mensajes:

Para ver los mensajes que nos envían podemos ejecutar el siguiente comando en la consola;

python yowsup-cli -c config.example -k -a -l

Con el parámetro -k indicamos que queremos mantener la coneccion con el servidor, el parámetro -a indica que cada que nos llegue un mensaje se marcara como leído para que el servidor no lo vuelva a enviar.

Chat Interactivo

Podemos tener una charla interactiva, solo tendríamos que ejecutar en consola y empezar nuestra charla.

python yowsup-cli -c config.example -k -a -i 521**********

Con esto podemos ejecutar desde python cualquiera de estos coman dos para que nuestra aplicación interactue con WhatsApp, sin embargo no seria algo muy recomendable, ya que estaríamos ejecutando un programa dentro de otro programa. A continuación les mostrare una manera de utilizarlo directamente en Python importando las librerías de Yowsup-Cli.

Envió de Mensajes con Python 

Antes que nada debido a que importamos las librerías de Yowsup-cli, nuestro programa debe ubicarse en  donde están estas librerías  yowsup/src/  , una vez creado nuestro archivo en esta ubicación programamos el siguiente código.

import base64
from Examples.EchoClient import WhatsappEchoClient 
#................Clave de Acceso a WhatsApp............................
password = "***********************"                      #Password dada al registrar el numero.
password = base64.b64decode(bytes(password.encode('utf-8')))   #Codificacion de Password para envio
username = '521##########'                                     #Numero de telefono para el inicio de secion.
keepAlive= False                                               #Conexion persistente con el servidor.
#......................................................................
whats = WhatsappEchoClient("TelefonoDestino", "Aqui tu mensaje", keepAlive)  
whats.login(username, password)                          #Autentifica el dispositivo con el cliente de WhatsApp.

Bueno este es un ejemplo sencillo pero seguro servirá para muchas aplicaciones, así que depende de la creatividad y dedicación que le dediquemos podríamos crear algo como Proyecto R.A.S.H.