
Compartir
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.