#Configurer le Wifi Client sur la ESP
import time
import network
import socket
import ujson
# Remplacez ces valeurs par les informations de notre AP  Wi-Fi.
SSID = "ESP32_AP_WIFI"
PASSWORD = "ESP32TEST" #Le mot de passe de connexion Wifi.

# Update Time :
UPDATE_TIME_INTERVAL = 5000  # in ms 
last_update = time.ticks_ms()

# Fonction pour se connecter au réseau Wi-Fi
def connect_to_wifi(ssid, password):
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("Connexion au réseau Wi-Fi...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass # ne rien faire jusqu'a avoir le connexion valide
    print("Connecté au réseau Wi-Fi")

# Fonction pour afficher les informations du signal Wi-Fi au niveau du client
def display_wifi_info():
    sta_if = network.WLAN(network.STA_IF)
    if sta_if.isconnected():
        print("Informations du signal Wi-Fi :")
        print("  - Est connecté : ", sta_if.isconnected())
        print("  - Adresse IP : ", sta_if.ifconfig()[0])
        print("  - SSID : ", sta_if.config("essid"))
        print("  - RSSI : {} dBm".format(sta_if.status("rssi")))
        print("  - Adresse MAC : ", ":".join("{:02X}".format(b) for b in sta_if.config("mac")))
    else:
        print("Non connecté au réseau Wi-Fi")
# Fonction pour retourner l'état de la connexion Wifi :
def re_wifi_info():
    sta_if = network.WLAN(network.STA_IF)
    if sta_if.isconnected():
        Adresse_IP = sta_if.ifconfig()[0]
        SSID = sta_if.config("essid")
        RSSI = sta_if.status("rssi")
        S_Q = 2*(RSSI + 100)
        MAC =  sta_if.config("mac")
        S_connexion = sta_if.isconnected()
        return(Adresse_IP, SSID, RSSI, S_Q, MAC, S_connexion)
    else:
        return(0, 0, 0, 0, False)

# Connexion au réseau Wi-Fi
connect_to_wifi(SSID, PASSWORD)
#Afficher les informations du client Wifi :
display_wifi_info()

# Configuration du socket UDP (Layer 4)
port = 12345  # Port de communication UDP
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", port))

# Boucle principale : pour executer en boucle mon programme:
while True:
    data, addr = sock.recvfrom(1024)
    if data:
        received_data = data.decode('UTF-8')
        print(received_data)
        try:
            #Transformer la data JSON au format dictionnaire
            data = ujson.loads(received_data) 
            if "temperature" in data:
                print('Temperature = ',data["temperature"]," C")
            if "humidity" in data: 
                print('Humidity = ',data["humidity"]," %")
        except Exception as e:
            print('Erreur lors de l\'analyse de la requête JSON:', e)
    #Afficher les indicateurs de la Carte ESP8266 périodiquement
    if time.ticks_ms() - last_update >= UPDATE_TIME_INTERVAL:
        last_update = time.ticks_ms()
        Adresse_IP, SSID, RSSI, S_Q, MAC, S_connexion = re_wifi_info()
        print("RSSI =", RSSI,"dBm", "QI =",S_Q,"%")