Contenidos
Enlaces interesantes sobre el tema
- https://www.jesusninoc.com/08/27/obtener-un-listado-en-python-de-los-dispositivos-bluetooth-cercanos
- https://www.jesusninoc.com/08/27/escanear-dispositivos-bluetooth-y-caracteristicas-escribibles-desde-python
- https://www.jesusninoc.com/08/27/escanear-dispositivos-bluetooth-caracteristicas-escribibles-y-el-atributo-handle-de-cada-caracteristicas-desde-python/
- https://www.jesusninoc.com/08/27/crear-una-aplicacion-para-iphone-que-permita-recibir-mensajes-por-bluetooth/
- https://www.jesusninoc.com/08/27/enviar-un-mensaje-a-los-dispositivos-bluetooth-cercanos-con-caracteristicas-escribibles-desde-python/
Código que permite enviar un mensaje a un dispositivos Bluetooth cercano con características escribibles desde Python (usando handle)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import asyncio from bleak import BleakScanner, BleakClient # Mensaje que deseas enviar MESSAGE = "Hola" TARGET_DEVICE_NAME = "iPhone" TARGET_DEVICE_ADDRESS = "asdfasfasf-adfafd-asfdasdf-asfadf-afafasfsd" TARGET_SERVICE_UUID = "d0611e78-bbb4-4591-a5f8-487910ae4366" TARGET_CHARACTERISTIC_UUID = "8667556c-9a37-4c91-84ed-54ee27d90049" async def scan_for_device(): print("Escaneando dispositivos BLE...") devices = await BleakScanner.discover() for device in devices: if device.name == TARGET_DEVICE_NAME and device.address == TARGET_DEVICE_ADDRESS: print(f"Dispositivo encontrado: {device.name} - {device.address}") return device print("No se encontró el dispositivo BLE específico.") return None async def connect_and_send_message(device, message): try: async with BleakClient(device) as client: print(f"Conectado a {device.name} ({device.address})") try: services = client.services # Uso de la propiedad services en lugar de get_services for service in services: if service.uuid == TARGET_SERVICE_UUID: print(f"Servicio encontrado: {service.uuid}") for characteristic in service.characteristics: print(f" Característica: {characteristic.uuid} - Propiedades: {characteristic.properties} - Handle: {characteristic.handle}") if "write" in characteristic.properties: try: # Enviar el mensaje a la característica usando el handle await client.write_gatt_char(characteristic.handle, message.encode('utf-8')) print(f"Mensaje '{message}' enviado a la característica {characteristic.uuid} con handle {characteristic.handle}.") except Exception as e: print(f"Error al enviar mensaje a la característica {characteristic.uuid} con handle {characteristic.handle}: {e}") except Exception as e: print(f"Error al obtener servicios: {e}") except Exception as e: print(f"Error al conectar con el dispositivo {device.name}: {e}") async def main(): device = await scan_for_device() if device: await connect_and_send_message(device, MESSAGE) # Ejecutar el escaneo y el envío de mensajes asyncio.run(main()) |
Explicación del código
- Función
scan_for_device
:- Escanea dispositivos BLE y busca el dispositivo con el nombre y dirección especificados.
- Devuelve el dispositivo encontrado o
None
si no se encuentra.
- Función
connect_and_send_message
:- Se conecta al dispositivo BLE encontrado.
- Obtiene los servicios y características disponibles en el dispositivo.
- Imprime todas las características encontradas, incluyendo sus UUIDs, propiedades y handles.
- Intenta enviar el mensaje a todas las características que tienen la propiedad
write
, usando el handle para la escritura.
- Función
main
:- Llama a
scan_for_device
para encontrar el dispositivo específico. - Si se encuentra el dispositivo, llama a
connect_and_send_message
para intentar enviar el mensaje.
- Llama a
- Ejecución del Código:
asyncio.run(main())
ejecuta la funciónmain
, que realiza el escaneo del dispositivo y envía el mensaje a todas las características escribibles encontradas.