Detector de presencia por bluetooth 'Un script para compartir"

+1
+2
-1

Esto, más que nada es una vacilada.... pero bueno, tal vez le saquéis provecho.

Idea original:

La idea original es de Javier Perez y el script está algo modificado pero todo el mérito es suyo.
http://javierperez.eu/bloqueo-y-desbloqueo-de-pantalla-por-detector-de-p...
Se trata de bloquear la pantalla (o cualquier cosa que se nos ocurra) cuando nos alejamos del ordenador de manera automática, y volver a desbloquearla cuando nos acercamos sin tocar absolutamente nada.

Necesitamos que nuestro ordenador disponga de bluetooth y de un terminal movil también con bluetooth.

Para ello nos ayudamos de un script que lo que hace es crear continuamente un vínculo con nuestro terminal móvil y comprobar la calidad de la señal, si esta baja de un mínimo, significa que nos estamos alejando, con lo que la pantalla se bloquea, y si nos acercamos, la calidad sube y por tanto la pantalla se desbloquea.

El script es el siguiente:

------------ Copia el texto --------------

#!/bin/bash

export INTERFACE="6H:A8:84:4B:54:F6"

while true; do

hcitool cc ${INTERFACE}

sleep 1

Signal="`hcitool lq ${INTERFACE}`"

echo $Signal

if [ "${Signal##*: }" -lt 240 ]; then
    echo "Baja señal"
    sudo -u scorpyo gnome-screensaver-command --lock

else

    if [ "${Signal##*: }" -gt 240 ]; then
        echo "Conectado"
        sudo -u scorpyo gnome-screensaver-command --deactivate

    else
   
        echo "Desconectado"
        sudo -u scorpyo gnome-screensaver-command --lock
fi
fi

hcitool dc ${INTERFACE}
done

-----------------FIN DE TEXTO---------------

Copiad el texto a un archivo de texto.
Sustituir lo que está en negrita por vuestros datos, scorpyo es mi usuario, vosotros poned el vuestro.

El primer parámetro... el de los numeros y letras separados por ":" es el identificador de vuestro terminal movil, si queréis saber cual es el vuestro abrid una terminal y teclear:

scorpyo@pc:~$ hcitool scan
Scanning ...
    6H:A8:84:4B:54:F6    Scorpyo
    H6:G5:D2:4S:B1:43    Maria

Como veis, yo puse el número que identifica a mi terminal.

Guardáis el archivo, le dais permisos de ejecución de una de estas dos formas:

-Botón derecho sobre el archivo, Propiedades, luego pincháis en la pestaña "permisos" y por último marcáis la casilla de "permitir ejecutar el archivo como un programa"

O también desde una terminal con el comando:

scorpyo@pc:~$ sudo chmod +x /ruta/del/archivo

Para ejecutar el archivo debemos hacerlo con poderes de administrador.
Abrimos una terminal y ponemos:

scorpyo@pc:~$ sudo ./ruta/del/archivo

Bien, ahora solo tendréis que comprobar como os va si os alejáis del ordenador y os acercáis..... y modificar si es necesario los valores de calidad del enlace... por si son demasiado exigentes para vuestro movil o demasiado tolerante...

Podéis darle otras utilidades así que dadle vueltas al coco y si se os ocurre modificaciones comentadlas y compartidlas.


Mi script ya modificado para usar en Gnome:

He trabajado en una modificación del script que lo hace más elegante, mas facil de usar y menos trabajoso, ya que el original te puede bloquear la pantalla por un error tuyo o del bluetooth.

Mejoras:

-No es necesario cambiar nada en el script si se usa Gnome, ya que está preparado para añadir a las variables del programa los datos necesarios para no tener que hacer cambios en él script.

-Integración con el escritorio Gnome mediante Zenity.

-Se instalan paquetes necesarios para poder mandar mensajes al usuario en panatalla (pc)

-Hace un escaneo de los dispositivos y te presenta una lista, así es más fácil elegir el teléfono.

-Se notifica al usuario de los datos y acontecimientos mediantes mensajes con botones

-Se crea un perfil del teléfono para mejor seguimiento.

-Se avisa al usuario del móvil al que está vinculado el programa.

-Controla la presencia del móvil antes de empezar, si este no existe se aborta el arranque del programa.

-Se han introducido mejoras para evitar bloquear la pantalla por un "pico" de baja intensidad.

-No es necesario ejecutarlo desde una ventana de terminal.

-Relanzando el script se activa o desactiva el seguimiento del terminal móvil.

-Crea un acceso directo al escritorio si se desea.

El Script es el siguiente, está claro que no será el mejor, pero cumple con su cometido.
------------------------------------------------------
Bluedetecth-gnome-Scorpyo Megaupload
------------------------------------------------------
Si os sirve espero que comentéis... así sabré que no me puse a trabajar en el para nada.

Un saludo.

EDITADO 04/03/2012 :

Visto que está la cosa regular con las descargas de megaupload y demás.... pego el script para quien le interese.

----------------- Script Bluedetecth -------------------

#!/bin/bash

#    bluedetecth es una pequeña utilidad que se encarga de bloquear la pantalla
#    cuando el usuario se aleja del PC en el que se está ejecutando.
#    Copyright (C) <2011> <Miguel Ponce Torres>
#
#    Este programa es software libre: usted puede redistribuirlo y / o modificar
#    bajo los términos de la GNU General Public License publicada por
#    la Free Software Foundation, bien de la versión 3 de la Licencia, o
#    (A su elección) cualquier versión posterior.
#
#    Este programa se distribuye con la esperanza de que sea útil,
#    pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
#    COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
#    Licencia Pública General GNU para más detalles.
#
#    Debería haber recibido una copia de la Licencia Pública General GNU
#    junto con este programa. Si no, vea <http://www.gnu.org/licenses/>.
#
#    Si quiere contactar con <Miguel Ponce Torres> puede hacerlo en: miguelponcetorres@gmail.com
#
#    Este script usa la idea original de Javier Perez
#    <http://javierperez.eu/bloqueo-y-desbloqueo-de-pantalla-por-detector-de-presencia-en-ubuntu-con-bluetooth-aimtooth/>
#    pero añadiendo muchos más extras y más facilida de uso al script original.

#    Este script está preparado para andar en Gnome, para que funcione en KDE u otros
#    escritorios hay que cambiar la orden zinety por la adecuada para KDE u otros.

#Se guarda el nombre del usuario que hay logueado en el sistema.
USUARIO=`whoami`
echo "El usuario detectado es $USUARIO"

# Se comprueba si el programa está corriendo
lockfile=/var/lock/bluedetecth.lock

if [ ! -e $lockfile ]; then
	# Si no está corriendo se ejecuta lo siguiente
	# creamos el fichero de bloqueo
	touch $lockfile
else
	if zenity --question --title "Detector de presencia" --text "La aplicación ya está en uso. \n¿Quiere cerrarla?"; then
		zenity --info --title "Cerrando aplicación" --text "La aplicación se cerrará"
		echo "La aplicación se cerrará"
		rm $lockfile
		killall bluedetecth
		sudo -k
		exit
	fi
	exit
fi

#-------------------------------------------------------------
# Se busca zenity y verifica si está instalado
dpkg --list zenity | grep ^ii
# Si zenity no está instalado el comando anterior
# devolverá un código diferente a cero entonces se abrirá
# una ventana para ver el proceso y apt-get
# instalará zenity
if [ "$?" != "0" ]
then
	echo "El programa zenity no está instalado y ha de instalarse"
	zenity --warning --title "Falta un componente" --text "No se encontró zenity"
	if zenity --question --title "Consejo" --text "¿Instalar zenity desde el \nCentro de software de ubuntu?"
	then
		zenity --info --title "Relanzar" --text "Relanze el programa cuando haya instalado zenity"
		software-center zenity
		rm $lockfile
		exit
	else
		zenity --warning --title "Se saldrá del programa" --text "Instale zenity antes de volver a intentarlo"
		rm $lockfile
		exit
	fi
fi

# Aquí se avisa de que es necesario la creación de una carpeta temporal (tmp) si esta no existe
if [ ! -d ~/tmp ]; then
	zenity --info --title "Creación de una carpeta temporal..." --text "Bluedetecth nesecita crear una carpeta temporal. \n\
Ruta de la carpeta: `echo ~/tmp`"
	mkdir ~/tmp
fi

# Aquí se avisa de que es necesario la creación de una carpeta de trabajo si esta no existe
if [ ! -d ~/.bluedetecth ]; then
	zenity --info --title "Creación de una carpeta de configuración" --text "Bluedetecth nesecita crear una carpeta para guardar sus datos. \n\
Ruta de la carpeta: `echo ~/.bluedetecth`"
	mkdir ~/.bluedetecth
	touch ~/.bluedetecth/terminales
fi

# Aquí se pregunta si se quiere un acceso directo al escritorio si no existe
if [ ! -L ~/Escritorio/bluedetecth ]; then
	if zenity --question --title "Comodidad" --text "Se ha detectado que no tiene un acceso directo al escritorio. \n ¿Quiere crearlo?"; then
		ln -s `pwd`/bluedetecth ~/Escritorio
	fi
fi

zenity --info --title "Bluedetecth" --text "A continuación se hará un escaneo por bluetooth.\n\n\
ATENCIÓN:\n\
Encienda su terminal movil y cuando esté listo presione aceptar."

echo "Detector de presencia, Iniciando detector..."

#-------------------------------------------------------------

#--------Mostrando una barra de progreso---------
(
hcitool scan | sed -e '1d' > ~/tmp/bluetudetecth.scan&
echo "# Comenzando escaneo..."
echo "10" ; sleep 1
echo "20" ; sleep 1
echo "# Buscando dispositivos..."
echo "30" ; sleep 1
echo "40" ; sleep 1
echo "50" ; sleep 1
echo "60" ; sleep 1
echo "# Terminando escaneo..."
echo "70" ; sleep 1
echo "80" ; sleep 1
echo "# Cargando lista de dispositivos..."
echo "90" ; sleep 1
echo "96" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress --auto-close \
--title="Escaneo bluetooth" \
--text="Rastreando los dispositivos cercanos" \
--percentage=0
BOTONESPROGRESOS=$?
echo "Salida de la barra de progreso (0 = ok / 1 = cancelado) $BOTONESPROGRESOS" # Dato para control

if [ "$BOTONESPROGRESOS" = 1 ] ; then
	killall hcitool
	zenity --warning --title "Cancelado!" --text="Ha cancelado la búsqueda de dispositivos.\n\
Los resultados mostrados a continuación no serán concisos..."
fi

#----------Fin de barra----------


# Se mete en la variable TELEFONO la elección del usuario del
# resultado del archivo ~/tmp/bluetudetecth.scan
# En el cual están los datos recogidos por el último escaneo.

TELEFONO=$(zenity --list --title "Elija una dispositivo" \
--text "Dispositivos encontrados:" \
--column "Mac" --column "Nombre Disp" `cat ~/tmp/bluetudetecth.scan`)
BOTONESLISTA=$?
echo "Salida del diálogo de lista (0 = ok / 1 = cancelado) $BOTONESLISTA" # Dato para control
echo "El terminal elegido (si se eligió alguno) es: $TELEFONO" # Dato de control
echo $BOTONESLISTA "Es el valor del boton de lista"
if [ $BOTONESLISTA = "0" ]; then

	if [ -z "$TELEFONO" ]; then
		zenity --warning --title "Cancelado y cerrando" --text "Parece que no eligió ningún dispositivo o no hay dispositivos cerca... \n\
El programa terminará ahora."
		rm $lockfile
		exit
	else
		export INTERFACE=$TELEFONO
	fi

else
	zenity --warning --title "Cancelado y cerrando" --text "Ha decidido cancelar la operación de enlace... \n\
El programa se cerrará."
	rm $lockfile
	exit
fi

# Función para calcular media de señal y mostrar barra de progreso

function calcular()
{
	gksu "hcitool cc ${INTERFACE}" -m "Para hacer conexiones al teléfono hace falta permisos de root"
	sleep 1
	sudo hcitool dc ${INTERFACE}
	echo "# Conectando con el dispositivo..."; sleep 1
	
	# Creamos un bucle hasta que pase el tiempo establecido en la variable TIEMPOSCAN

	SEGUNDOS=0
	PORCENTAJE=0
	TIEMPOSCAN=20 # Aquí se establece el tiempo de scaneo, por defecto a 20 segundos
	MEDIA=0
	TOTAL=0

	while [ $SEGUNDOS -lt $TIEMPOSCAN ]; do	
		sudo hcitool cc ${INTERFACE}

		sleep 1

		Signal="`hcitool lq ${INTERFACE}`"
		SENAL="${Signal##*: }"
		let CALIDAD=SENAL/255*100
		let TOTAL=TOTAL+CALIDAD
		let SEGUNDOS=SEGUNDOS+1
		if [ $SEGUNDOS = "1" ]; then
			let MEDIA=CALIDAD
		else
			let MEDIA=TOTAL/SEGUNDOS
		fi

		let PORCENTAJE=SEGUNDOS*100/TIEMPOSCAN
		echo "# Calidad del enlace: $CALIDAD % \n\
Calidad media obtenida: $MEDIA %\n\
Progreso del cálculo $PORCENTAJE % 
"
		echo $PORCENTAJE
		sudo hcitool dc ${INTERFACE}
	done
	echo "${INTERFACE} $MEDIA" > ~/tmp/bluedetecth.media
}


# Aquí ha de cotejarse los datos de la variable escogida con el archivo de terminales en: ~/.bluedetecth/terminales
# para ver si existen datos del teléfono, si no existen datos del teléfono, se hará un examen de calidad del enlace
# y se añadirá una nueva línea a ese archivo

# Se busca el terminal en la base de datos
if grep $TELEFONO ~/.bluedetecth/terminales; then
	if zenity --question --title " Terminal conocido! " \
--text "Este terminal es conocido y existen datos sobre él. \n\
¿Quiere usar esos datos?"; then

		POTENCIAMEDIA=`grep $TELEFONO ~/.bluedetecth/terminales | awk '1 { print $2 }'`
		let POTENCIADEBIL=POTENCIAMEDIA*255/100-30
	else
		# Se borra la línea en la que están los datos del teléfono
		BORRARLINEA=`cat ~/.bluedetecth/terminales | nl | grep $TELEFONO | awk '1 { print $1 }'`
		mv ~/.bluedetecth/terminales ~/.bluedetecth/terminales.backup
		cat ~/.bluedetecth/terminales.backup | sed "$BORRARLINEA d" > ~/.bluedetecth/terminales
		
		# Se hace un nuevo escaneo de la calidad del terminal y se añade una nueva linea con referencia al terminal $TELEFONO	
		calcular | zenity --progress \
		--title="Control de calidad..." \
		--auto-close \
		--text="Esperando...." \
		--percentage=0
		BOTONESCALCULO=$?
	
		if [ $BOTONESCALCULO = "1" ]; then
			zenity --warning --title "Operación cancelada" --text "Al cancelar la operación no se ha creado un perfil del teléfono. \n\
El programa utilizará valores standard."
			POTENCIADEBIL=180
		else
			cat ~/tmp/bluedetecth.media >> ~/.bluedetecth/terminales
			POTENCIAMEDIA=`grep $TELEFONO ~/.bluedetecth/terminales | awk '1 { print $2 }'`
			let POTENCIADEBIL=POTENCIAMEDIA*255/100-30
			zenity --info --title "Estadística terminada" --text "MAC del terminal: $TELEFONO \n
Calidad media: $POTENCIAMEDIA"

	fi
	fi
else
	zenity --info --title " Terminal nuevo! " \
--text "Este terminal es nuevo y no hay referencias sobre él en la base de datos \n\n \
Es necesario calcular la estadística del alcance del aparato y añadirla a la base de datos."
	# Se hace un escaneo de la calidad del terminal y se añade una nueva linea con referencia al terminal $TELEFONO	
	calcular | zenity --progress \
	--title="Control de calidad..." \
	--auto-close \
	--text="Esperando...." \
	--percentage=0
	BOTONESCALCULO=$?
	
	if [ $BOTONESCALCULO = "1" ]; then
		zenity --warning --title "Operación cancelada" --text "Al cancelar la operación no se ha creado un perfil del teléfono. \n\
El programa utilizará valores standard."
		POTENCIADEBIL=200
	else
		cat ~/tmp/bluedetecth.media >> ~/.bluedetecth/terminales
		POTENCIAMEDIA=`grep $TELEFONO ~/.bluedetecth/terminales | awk '1 { print $2 }'`
		let POTENCIADEBIL=POTENCIAMEDIA*255/100-30
		zenity --info --title "Estadística terminada" --text "MAC del terminal: $TELEFONO \n
Calidad media: $POTENCIAMEDIA"
	fi
fi


# Se comprueba que el terminal sigue cerca.
gksu hcitool cc ${INTERFACE}

sleep 1

hcitool lq ${INTERFACE}; echo $? > ~/tmp/bluedetecth.conect
CONECTADO=$(cat ~/tmp/bluedetecth.conect)

if [ "$CONECTADO" = "1" ]; then
	echo "Sin señal..."
	zenity --warning --title "No se detecta el telefono" --text "El teléfono con Interface: $INTERFACE \n no es detectado :("
	echo "El programa se cerrará para evitar problemas."
	zenity --info --title "Cierre de seguridad" --text "El programa se cerrará para evitar problemas"
	rm $lockfile
	sudo -k
	exit
else

	echo "Terminal localizado...."
	zenity --info --title "¡Terminal localizado!" --text "El teléfono con Interface: $INTERFACE ha sido detectado y se hace su seguimiento XD"
fi

#	sudo hcitool dc ${INTERFACE}

# --------Esta es la idea original de <Javier Perez> bastante modificada por <Miguel Ponce Torres>--------
let REINCIDENTE=0
while true; do

sudo hcitool cc ${INTERFACE}

sleep 1

Signal=$(hcitool lq ${INTERFACE}; echo $? > ~/tmp/bluedetecth.conect)

CONECTADO=$(cat ~/tmp/bluedetecth.conect)
echo "Valor de conectado: $CONECTADO"

if [ "$CONECTADO" = "1" ]; then

	if [ $REINCIDENTE -lt 2 ]; then
		# Si el número de picos continuados es menor a 2, se le suma 1
		let REINCIDENTE=REINCIDENTE+1
	fi

	if [ $REINCIDENTE -gt 1 ]; then
		# Si el número de picos continuados es mayor a 1 se bloquea la pantalla
		sudo -u $USUARIO gnome-screensaver-command --lock
	fi
else


	echo $Signal
	echo "El umbral para desconectar es de: $POTENCIADEBIL"

	if [ "${Signal##*: }" -lt $POTENCIADEBIL ]; then
		echo "Baja señal"

		# Mejora para evitar sustos por picos de baja intencidad
		if [ $REINCIDENTE -lt 2 ]; then
			# Si el número de picos continuados es menor a 2, se le suma 1
			let REINCIDENTE=REINCIDENTE+1
		fi
	
		if [ $REINCIDENTE -gt 1 ]; then
			# Si el número de picos continuados es mayor a 1 se bloquea la pantalla
			sudo -u $USUARIO gnome-screensaver-command --lock
		fi
	else
		echo "Buena señal"
		# Mejora para evitar sustos por picos de baja intencidad

		if [ $REINCIDENTE -gt 1 ]; then
			# Si la señal es buena y el valor de RENCIDENCIA es mayor a 1, se le perdona un valor (se le resta 1).
			let REINCIDENTE=REINCIDENTE-1
		else
			# Si no se pone a 0
			let REINCIDENTE=0
		fi
		sudo -u $USUARIO gnome-screensaver-command --deactivate
fi
fi
echo "Reincidencia: $REINCIDENTE"
sudo hcitool dc ${INTERFACE}
done
# ---------------Fin de idea de Javier Perez modificada--------------- 


gksu hcitool dc ${INTERFACE}
sudo -k
exit

----------------------Fin del script -----------------------

Un saludo.

Comentarios

Imagen de tRaCk3r

Existe en los repositorios un programa llamado blueproximity que hace exactamente esto que nos comentas. Aún así, gracias por compartir el script.

 


tRaCk3r
http://tetosoft.com
ubuntu user #007044
linux user #319025
PC number #309252
Imagen de Scorpyo82

Ya lo vi después de hacer el script... :( pero si sirve de algo pues bueno.

XD

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de tRaCk3r

Por supuesto! toda ayuda es buena ;)

 


tRaCk3r
http://tetosoft.com
ubuntu user #007044
linux user #319025
PC number #309252
Imagen de guman

blueproximity lo habia ojeado hace un tiempo pero en mi desktop no me andaba bien ,ya k algunas veces se me blokeaba el sistema sin mas....lo k no sucedia con la netbook...
voy a probar el script y aver k pasa....

Como son las cosas, me encantaba Gnome....ahora lo odio!!!
Y como antes no me gustaba Xfce , no entiendo por que ahora lo adoro!!!

Imagen de Scorpyo82

Ok, yo lo he diseñado para Gnome.
Está probado en Gnome 2.xx

Pero con un poco de idea, se puede editar el script para que funcione en otros escritorios.

Para evitar que se bloquee por la cara por un pico de "no enlace" le añadí un control, en la que si hay mas de una reincidencia seguida de no alcance al dispositivo, es entonces cuando se bloquea.

Por otro lado, al hacer el perfil del tlf junto con la del bluetooth evitas que el script coja valores por defecto demasiado altos para la sensibilidad del enlace.

Espero que te sirva.

Un saludo.

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de ldotlopez

Excelente puesta en marcha de una idea, aunque al final ya estuviera hecho.

Esperemos vere más entradas como esta en los blogs :)