import bluetooth
import time
from ble_advertising import advertising_payload
from micropython import const
# Constantes pour les événements BLE
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
# Flags pour les caractéristiques GATT
_FLAG_READ = const(0x0002)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
# UUIDs utilisés (standard Nordic UART Service)
UART_SERVICE_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
UART_TX_UUID = bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E") # ESP vers Smartphone
UART_RX_UUID = bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E") # Smartphone vers ESP
# Caractéristiques (UUID, propriétés)
UART_TX = (UART_TX_UUID, _FLAG_READ | _FLAG_NOTIFY)
UART_RX = (UART_RX_UUID, _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE)
# Service UART complet
UART_SERVICE = (UART_SERVICE_UUID, (UART_TX, UART_RX))
# Variable globale pour stocker la connexion
connections = set()
handle_tx = None
handle_rx = None
# Callback pour gérer les interruptions BLE
def ble_irq(event, data):
global connections
if event == _IRQ_CENTRAL_CONNECT:
conn_handle, _, _ = data
print("Connecté :", conn_handle)
connections.add(conn_handle)
elif event == _IRQ_CENTRAL_DISCONNECT:
conn_handle, _, _ = data
print("Déconnecté :", conn_handle)
connections.discard(conn_handle)
ble.gap_advertise(500000, adv_data=payload) # Recommencer la publicité
elif event == _IRQ_GATTS_WRITE:
conn_handle, value_handle = data
if value_handle == handle_rx:
value = ble.gatts_read(value_handle)
print("Reçu :", value.decode("utf-8"))
# Initialisation BLE
ble = bluetooth.BLE()
ble.active(True)
ble.irq(ble_irq)
# Enregistrer le service
((handle_tx, handle_rx),) = ble.gatts_register_services((UART_SERVICE,))
# Préparer les données de publicité BLE
payload = advertising_payload(name="ESP32-UART", services=[UART_SERVICE_UUID])
ble.gap_advertise(500000, adv_data=payload)
print("Publicité BLE en cours...")
# Boucle principale
while True:
if connections:
msg = input("Message à envoyer : ")
for conn_handle in connections:
ble.gatts_notify(conn_handle, handle_tx, msg)
time.sleep(0.1)
else:
print("En attente de connexion BLE...")
time.sleep(2)