Compartir

Compartir en GNU Social Compartir en Diaspora*

Botón de pánico

Esta es una implementación un tanto cutre para poder enviar por xmpp un mensaje a un usuario (ambos preestablecidos de antemano) mediante una única pulsación en el móvil (android).

Para ello vamos a usar Termux y Termux:Widget.
Con el primero (es una shell bastante potente en la que podemos instalar python, git y otras muchas utilidades) vamos a conseguir que nuestro móvil sea capaz de ejecutar el script python que se encarga de enviar la alarma, mientras que el segundo nos va a permitir tener en nuestra pantalla del móvil un widget que al pulsarlo lance Termux y ejecute automáticamente nuestro script.

Si en lugar de enviar un mensaje por XMPP preferimos que lo que se envíe sea un SMS, utilizaremos Termux:Api para mediante la función termux-sms-send enviar el SMS, sin embargo en esta entrada me voy a centrar en la opción XMPP.

Para enviar mensajes mediante XMPP vamos a usar la librería Xmpppy que funciona con python (versión 2.*).

Lo primero que tenemos que hacer es abrir Termux en el móvil e instalar git:

apt install git

a continuación python 2

apt install python2

y finalmente descargamos e instalamos la librería:

git clone https://github.com/normanr/xmpppy.github
cd xmpppy
python2 setup.py install

Ahora lo que vamos a hacer es crear en el directorio .shortcuts del home (${HOME}/.shortcuts) un script (fusilado del ejemplo xsend.py) de python parecido a esto:

#!/data/data/com.termux/files/usr/bin/python2

import sys, xmpp, time
fromjid='usuario@servidor'
passwjid='Password'

tojid='jid del destinatario'
jid=xmpp.protocol.JID(fromjid);
cl=xmpp.Client(jid.getDomain(),debug={})
con=cl.connect()
if not con:
   print 'No puede conectar'
   sys.exit()

auth=cl.auth(jid.getNode(),passwjid,resource=jid.getResource())
if not auth:
   print 'No se puede autenticar'
   sys.exit()

#cl.SendInitPresence(requestRoster=0)
id=cl.send(xmpp.protocol.Message(tojid,'Mensaje de emergencia'))
time.sleep(1)
cl.disconnect()

Y ahora podemos añadir en la pantalla principal el widget Single shortcut.

Aprovechando Termux:API, se podría también usar termux-location para obtener la localización vía GPS y enviar esa información en el mensaje.
En este caso vamos a hacer lo siguiente.
Entramos a Termux y creamos (si no existe) el directorio bin:

mkdir bin

Dentro del directorio bin copiamos el siguiente archivo, por ejemplo con el nombre sendxmpp.py y cambiando el valor de las variables mensaje, tojid, fromjid y passwjid por lo que nos interese:

#!/data/data/com.termux/files/usr/bin/python2

import sys, xmpp, time

mensaje='Mensaje de emergencia'
tojid='jid del destinatario'
if len(sys.argv) > 1:
   mensaje=sys.argv[1]

if len(sys.argv) > 2:
   tojid=sys.argv[2]

fromjid='usuario@servidor'
passwjid='Password'

jid=xmpp.protocol.JID(fromjid);
cl=xmpp.Client(jid.getDomain(),debug={})
con=cl.connect()
if not con:
   print 'No puede conectar'
   sys.exit()

auth=cl.auth(jid.getNode(),passwjid,resource=jid.getResource())
if not auth:
   print 'No se puede autenticar'
   sys.exit()

#cl.SendInitPresence(requestRoster=0)
id=cl.send(xmpp.protocol.Message(tojid,mensaje))
time.sleep(1)
cl.disconnect()

Le damos permisos de ejecución:

chmod 700 sendxmpp.py

o si no estamos posicionados en el directorio bin

chmod 700 ${HOME}/bin/sendxmpp.py

dentro del directorio .shortcuts creamos el fichero PanicButton con el siguiente contenido:

#!/data/data/com.termux/files/usr/bin/bash
mensaje="ATENCION, tengo un problema."
termux-location > ${HOME}/location.txt
latitude=$(cat ${HOME}/location.txt | grep "\"latitude\"" | cut -d":" -f2 |  sed "s/ //g" | sed "s/,$//g")
longitude=$(cat ${HOME}/location.txt | grep "\"longitude\"" | cut -d":" -f2 |  sed "s/ //g" | sed "s/,$//g")
if [ "${latitude}" != "" -a "${longitude}" != "" ]; then
   mensaje="${mensaje} Me encuentro en http://www.openstreetmap.org/?mlat=${latitude}&mlon=${longitude}"
fi
rm ${HOME}/location.txt
python2 ${HOME}/bin/sendxmpp.py "${mensaje}" "jid del destinatario"

Y como en el primer caso lo añadimos mediante Termux:Widget a la pantalla principal de nuestro móvil.