21 de dic. de 2010

Capturar la ubicación del celular (Android) desde Linux.

Me tome unos días para realizar la actualización de mi Milestone a Froyo gracias a la gente de androive que liberaron una versión venezolanizada de froyo que se llama FroyoVE.

Hoy escribire sobre como sacar la información que maneja el GPS desde Linux.

Lo primero que se necesita hacer es iniciar la localización, se captura la información y luego se detiene la localización.

A continuación el código del programa:

#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
#Script que permite capturar la localización GPS del celular (ANDROID) desde Linux.
#Autor: Ernesto Crespo
#Correo:ecrespo@gmail.com
#Licencia: GPLv3
#Versión:0.1


#Importando el módulo android
import android
from time import sleep




#Función de envio de mensajes
def localizacion():
    #Se crea la instancia de la clase Android
    droid = android.Android()
    #Se inicia la localizacion
    droid.startLocating()
    #Se espera 15 segunfos
    sleep(15)
    #Se presenta en la consola la información de la localización
    #Se maneja la información de un diccionario.
    print "Altitud: ",droid.readLocation().result["network"]["altitude"]
    print "Proveedor: ",droid.readLocation().result["network"]["provider"]
    print "Latitud: ",droid.readLocation().result["network"]["latitude"]
    print "Longitud: ",droid.readLocation().result["network"]["longitude"]
    print "Tiempo: ",droid.readLocation().result["network"]["time"]
    print "Velocidad: ",droid.readLocation().result["network"]["speed"]
    print "Precisión: ",droid.readLocation().result["network"]["accuracy"]
    #Se detiene la localización
    droid.stopLocating()


#Ejecución del programa principal.
if __name__ == "__main__":
    #Ejecución de la función
    localizacion()
La ejecución desde la consola muestra lo siguiente:
localizacion.py

Altitud:  0
Proveedor:  network
Latitud:  8.65770805
Longitud:  -71.11786675
Tiempo:  1292944124223
Velocidad:  0
Precisión:  65

Con ayuda de google map reviso que la latitud y longitud que devuelve el GPS del celular está cerca de la troncal 7 en Mérida.

16 de dic. de 2010

Obtener información del estado de la bateria de un celular con Android desde Linux

En este post se mostrará las funciones que permiten obtener información del estado de la bateria del celular con Android desde Linux.

Para poder monitorear el estado de la bateria primero se inicia la función de inicio de monitoreo y luego se puede obtener la información siguiente:

  • Salud de la batería
  • Tipo de conexión que se usa para cargar la batería
  • Estatus de la batería
  • Tipo de tecnología usada en la batería
  • Temperatura de la batería
  • Voltaje de la batería


El programa es el siguiente:

#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
#Script que muestra la información de la bateria del celular con Android.
#Autor: Ernesto Crespo
#Correo:ecrespo@gmail.com
#Licencia: GPLv3
#Versión:0.1


#Importando el módulo android
import android


def Bateria():
    
    droid = android.Android()
    #Se inicia el monitoreo de la bateria
    droid.batteryStartMonitoring()
    #Se captura la información de la salud de la bateria y se presenta un 
    #mensaje por la consola.
    bateriaSalud = droid.batteryGetHealth()[1]
    if bateriaSalud == 2:
        print "La bateria está bien"
    elif bateriaSalud == 1:
        print "Salud de la Bateria desconocido"
    elif bateriaSalud == 3:
        print "La bateria tiene sobrecarga"
    elif bateriaSalud == 4:
        print "La bateria está muerta"
    elif bateriaSalud == 5:
        print "La bateria tiene sobrevoltaje"
    else:
        print "falla desconocida"
    #Se captura la información del tipo de conexión que usa el celular
    #Se despliega la información por la consola.
    tipoConexion = droid.batteryGetPlugType()[1]
    if tipoConexion == 0:
        print "Cable desconectado"
    elif tipoConexion == 1:
        print "Fuente de alimentación: cargador AC"
    elif tipoConexion == 2:
        print "Fuente de alimentación: cable USB"
    else:
        print "Desconocido"
    #Se captura la información del estatus de la bateria y se presenta en la
    #consola.
    estatus = droid.batteryGetStatus()[1]
    if estatus == 2:
        print "Bateria cargandose"
    elif estatus == 3:
        print "Bateria descargandose"
    elif estatus == 4:
        print "Bateria no se está cargando"
    elif estatus == 5:
        print "Bateria full de carga"
    print "Tipo de tecnología de la bateria: ",droid.batteryGetTechnology()[1]
    print "Temperatura de la bateria: ",droid.batteryGetTemperature()[1]
    print "voltaje de la bateria: ",droid.batteryGetVoltage()[1]
    #Se detiene el monitoreo de la bateria
    droid.batteryStopMonitoring()
    
    
if __name__ == "__main__":
    #Ejecución de la función
    Bateria()
Al ejecutar el programa se muestra lo siguiente:

bateria.py
La bateria está bien
Fuente de alimentación: cable USB
Bateria cargandose
Tipo de tecnología de la bateria:  Li-ion
Temperatura de la bateria:  370
voltaje de la bateria:  4003

Con respecto a la temperatura espero sea 37 grados y el voltaje sea medido en miliVoltios.

Manejar los mensajes de Texto del celular desde Linux (Android)

Para continuar con los scripts que se ejecutan de forma remota en el celular, ahora mostraré como se maneja los mensajes de texto, buscar mensajes y borrarlos.

La idea es buscar todos los mensajes de un número celular dado, presentar el mensaje en la consola y borrar dichos mensajes.
Se sigue el procedimiento de ejecución remota explicado en el post anterior.

El código es el siguiente:
#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
#Script que permite manejar los SMS del celular con android desde Linux.
#Autor: Ernesto Crespo
#Correo:ecrespo@gmail.com
#Licencia: GPLv3
#Versión:0.1


#Importando el módulo android,sys y re
import android


#Función de envio de mensajes
def Contactos():
    #Se crea la instancia de la clase Android
    droid = android.Android()
    #Se captura la cantidad de mensajes de texto )como en mi caso todos los 
    #mensajes han sido leídos coloco 0, si quiero los no leídos coloco 1.
    cantidad = droid.smsGetMessageCount(0)[1]
    #El número de celular a buscar
    numero = "0xxxyyyzzww"
    #Se recorren todos los mensajes.
    for i in range(cantidad):
        #Si el mensaje es del número dado se captura el identificador
        #del mensaje, se imprime un mensaje  en pantalla con la información:
        #read:Si mensaje ya fue leído
        #date: la fecha del mensaje
        #_id:identificador del mensaje.
        #address: número celular.
        #body:cuerpo del mensaje.
        #Toda está información se maneja desde un diccionario.
        #Si el celular no es de la persona buscada se continua con la 
        #siguiente iteración. 
        #A la función de borrar se le pasa el identificador del mensaje
        if droid.smsGetMessages(0)[1][i]["address"] == numero:
            identificador = droid.smsGetMessages(0)[1][i]["_id"]
            print "Borrando mensaje\t",i,droid.smsGetMessages(0)[1][i]["read"],droid.smsGetMessages(0)[1][i]["date"],droid.smsGetMessages(0)[1][i]["address"],droid.smsGetMessages(0)[1][i]["body"]
            droid.smsDeleteMessage(identificador)
        else:
            continue
if __name__ == "__main__":
    #Ejecución de la función
    Contactos()


La salida del programa es la siguiente:
 Devuelve el mensaje que se ha borrado el SMS, el número del mensaje, si está leído, la fecha, el número y el cuerpo del mensaje.

Borrando mensaje 296 1 1285030227398 0xxxyyyzzww Ah bueno... Yo les aviso.
Borrando mensaje 358 1 1283635867054 0xxxyyyzzww Ok. Ahi voy.

15 de dic. de 2010

Ejecución remota de scripts python desde Linux a un celular con Android (versión conectado el celular por USB)

En el post anterior explique como ejecutar script python en un celular con Android de forma remota desde Linux por wifi, ahora explicaré como hacerlo por cable USB, en realidad es más sencillo que el artículo anterior.
Me basaré en lo explicado en el post anterior y en el post sobre envío de mensajes de texto.

Lo primero que se necesita hacer es conectar el celular al computador por USB, activar el modo depuración y la conexión USB a Portal y Herramientas.

Se debe iniciar el servidor de SL4A. Menú->Ver->Interpretes->Menú->Iniciar Servidor->Privado.

Luego se averigua en los mensajes de notificiación que puerto abre el servidor. En mí caso fue el 58825.

Desde la consola de Linux se ejecutan los siguientes comandos:
Redirecciona toda petición al puerto 9999 al puerto 58825.
./adb forward tcp:9999 tcp:58825

Se exporta una variable de ambiente.
export AP_PORT=9999

El programa es el siguiente:
#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
#Script que permite enviar mensaje de texto a un celular android desde Linux.
#Autor: Ernesto Crespo
#Correo:ecrespo@gmail.com
#Licencia: GPLv3
#Versión:0.1

#Importando el módulo android,sys y re
import android,sys,re


#Función de envio de mensajes
def Enviomensaje():
    #Se averigua si se le pasa al script el número celular y el mensaje, y que el número sea válido para venezuela.
    if len(sys.argv) == 3:
        numero = sys.argv[1]
        mensaje = sys.argv[2]
    else:
        print "error enviando mensaje, se necesita pasar el número y mensaje"
        sys.exit
    if Validar(numero) == 0:
        print "Número invalido"
        sys.exit
    #Creando la instancia droid del objeto Android
    droid = android.Android()
    #Enviando el mensaje de texto
    droid.smsSend(numero,mensaje)
    #Se presenta un mensaje de notificación en el celular.
    droid.makeToast('Mensaje enviado')


#Función que válida si el número es de movilnet, digitel o movistar. def Validar(numero):
    #Valida si los numeros tienen 11 digitos y que sean de los proveedores movilnet, digitel y movistar
    if len(numero) == 11 and ((re.search("041[2|4|6]\d\d\d\d\d\d\d",numero)) or (re.search("042[4|6]\d\d\d\d\d\d\d",numero))) :
        return 1
    else:
        return 0
#Ejecución del programa.
if __name__ == "__main__":
    Enviomensaje()


Ejecutar el script.
enviomensajes.py 0xxxyyyzzww  "2da prueba, avisame si te llega el sms"

AddThis