Enviar fichero con python a través de bluetooth

Para realizar el envío de un fichero a un dispositivo móvil mediante bluetooth sin necesidad de emparejamiento en linux se puede utilizar la librería ligthblue. Los dispositivos móviles que utilizan bluetooth tienen definidos un conjunto de servicios que proporcionan i que son visibles por otros dispositivos bluetooth, de esta forma pueden interactuar entre ellos.

Para enviar un fichero a un dispositivo bluetooth primero de todo se han de buscar los dispositivos, una vez encontrados se ha de realizar un descubrimiento de servicios con el protocolo SDP (Service Discovery Protocol). De la lista de servicios obtenida se ha de buscar el canal que utiliza el servicio OPP (Object Push Protocol), todos los servicios están identificados por un número, en el caso del servicio OPP el identificador de perfil es el 1105. De esta forma junto con la dirección mac i el canal ya se puede enviar el fichero al dispositivo bluetooth. Para ello se ha de utiliozar el protocolo de intercambio de objetos binarios (OBEX).

La búsqueda de servicios se hace en python con la función fins_Service(address=add), la cual recibe por parámetro la dirección mas del dispositivo. Para realizar el envío del fichero primero de todo se realiza una conexión con la función lightblue.obex.OBEXClient(mac,port), la cual recibe por parámetro la dirección mac del dispositivo i el puerto de conexión. Una vez establecida la conexión se utiliza la función cliente.put({"name": "filename"}, file(“filename", 'rb')) para enviar el fichero. El cliente al aceptar la conexión implícitamente acepta el fichero enviado.

A continuación os dejo un código en python de ejemplo:

Librerías necesarias

PyBluez

Sudo apt-get install python-bluez

OpenOBEX

Sudo apt-get install obexftp

Sudo apt-get install libopenobex1/p>

LigthBlue

Sudo apt-get install python-lightblue

Código de ejemplo en python

Primero se ha de importar la librería lightblue.

import lightblue

Una vez importada realizamos una búsqueda de dispositivos:

for bdaddr in nearby_devices:

self.deviceName[bdaddr] = lookup_name(bdaddr)

if self.deviceName[bdaddr] is not None:

self.findprofile('1105',bdaddr)

Para cada dispositivo encontrado se buscan los servicios, después se busca el canal del servicio especificando con el parámetro uuid, en este caso ‘1105’ identificador del perfil OPP.

def findprofile (self,uuid,add):

services = find_service(address=add)

devicename = lookup_name(add, timeout=10)

showProfiles = None

if len(services) > 0:

dunPort = 0

for svc in services:

if (svc["profiles"][0][0] == uuid):

self.canal_opp[add]=svc["port"]

Una vez se tiene la dirección mac i el puerto utilizado por el servicio OPP tan solo hace falta realizar una conexión i enviar el fichero.

cliente = lightblue.obex.OBEXClient(mac,port)

cliente.connect()

putresponse=cliente.put({"name":"nombre_del_fichero"},file("nombre_del_fichero ", 'rb'))

cliente.disconnect()

En el caso que el usuario del dispositivo móvil no acepte la conexión saltará una excepción.

Comentarios: manelperez.es © 2009 - 2010

LoGo