Python : Script pour écrire des caractéristiques BLE avec Bleak

Ce script montre comment écrire une valeur dans une caractéristique BLE en utilisant la bibliothèque Bleak en Python. Il se connecte à un périphérique BLE et écrit une valeur spécifiée dans une caractéristique donnée.

write_ble_characteristic.py
#!/usr/bin/env python3
"""
Écriture de caractéristique BLE

Ce script se connecte à un périphérique BLE par adresse MAC et écrit une valeur spécifiée dans une caractéristique UUID donnée.

Prérequis :
    - bibliothèque bleak : pip install bleak

Utilisation :
    python write_ble_characteristic.py [ADRESSE_MAC] [UUID_CARACTERISTIQUE] [VALEUR] [--hex]

Exemple :
    python write_ble_characteristic.py 24:EC:4A:76:00:32 00002a37-0000-1000-8000-00805f9b34fb "Hello"
    python write_ble_characteristic.py 24:EC:4A:76:00:32 00002a37-0000-1000-8000-00805f9b34fb "48656c6c6f" --hex
"""

import asyncio
import sys
import argparse
from bleak import BleakClient
from bleak.exc import BleakError
from datetime import datetime

def parse_value(value_str, hex_mode):
    if hex_mode:
        # Convertir la chaîne hexadécimale en octets
        try:
            return bytes.fromhex(value_str)
        except ValueError:
            print(f"Chaîne hexadécimale invalide : {value_str}")
            sys.exit(1)
    else:
        return value_str.encode("utf-8")

async def write_characteristic(mac_address, char_uuid, value_bytes):
    print(f"\nTentative de connexion à {mac_address} ...")
    try:
        async with BleakClient(mac_address) as client:
            if client.is_connected:
                print(f"Connexion réussie à {mac_address}")
                print(f"Connecté à : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
                print(f"Écriture dans la caractéristique {char_uuid} ...")
                try:
                    await client.write_gatt_char(char_uuid, value_bytes)
                    print(f"Valeur écrite avec succès dans la caractéristique {char_uuid}.")
                except Exception as e:
                    print(f"Échec de l'écriture de la valeur : {e}")
                    return False
                print(f"\nDéconnecté de {mac_address}")
                return True
            else:
                print(f"Échec de la connexion à {mac_address}")
                return False
    except BleakError as e:
        print(f"Erreur Bluetooth : {e}")
        return False
    except Exception as e:
        print(f"Erreur inattendue : {e}")
        return False

async def main():
    parser = argparse.ArgumentParser(description="Écrire une valeur dans une caractéristique de périphérique BLE.")
    parser.add_argument("mac_address", help="Adresse MAC du périphérique BLE")
    parser.add_argument("char_uuid", help="UUID de la caractéristique dans laquelle écrire")
    parser.add_argument("value", help="Valeur à écrire (chaîne ou hex)")
    parser.add_argument("--hex", action="store_true", help="Interpréter la valeur comme une chaîne hexadécimale")
    args = parser.parse_args()

    mac_address = args.mac_address
    char_uuid = args.char_uuid
    value_str = args.value
    hex_mode = args.hex

    print(f"Adresse MAC utilisée : {mac_address}")
    print(f"UUID de caractéristique : {char_uuid}")
    print(f"Valeur : {value_str} ({'hex' if hex_mode else 'utf-8'})")

    # Valider le format de l'adresse MAC (vérification basique)
    if len(mac_address.replace(":", "").replace("-", "")) != 12:
        print(f"Format d'adresse MAC invalide : {mac_address}")
        print("Format attendu : XX:XX:XX:XX:XX:XX ou XX-XX-XX-XX-XX-XX")
        return

    value_bytes = parse_value(value_str, hex_mode)
    success = await write_characteristic(mac_address, char_uuid, value_bytes)

    if success:
        print("\nOpération d'écriture terminée avec succès.")
    else:
        print("\nÉchec de l'opération d'écriture.")

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nOpération interrompue par l'utilisateur.")
    except Exception as e:
        print(f"Une erreur s'est produite : {e}")
        sys.exit(1)

Check out similar posts by category: Bluetooth, Python