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)If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow