#ESP32 EN MODE AP
import machine
import network
import socket
import time
import ujson
import dht
# Configuration de la ESP en AP Wi-Fi
ssid = "ESP32_AP_WIFI"
password = "ESP32TEST"
channel = 4 # Canal Wifi
txpower = 11 # Puissance d'émission en dBm (0 à 20, selon la réglementation locale)
authmode=network.AUTH_WPA_WPA2_PSK
max_clients = 2

#Configuration des paramètres de la couche 2 (802.11n)
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid=ssid, password=password, authmode=authmode, max_clients=max_clients, channel = channel, txpower= txpower)

# Attendez que le point d'accee Wifi soit active
while ap.active() == False:
  pass

# Configuration de la couche 3 (Protocole IP)
ip_address = "192.168.10.1"  # Adresse IP statique souhaitée
subnet_mask = "255.255.255.0"  # Masque de sous-réseau
gateway = "192.168.10.1"  # Passerelle par défaut
dns_server = "8.8.8.8"  # Serveur DNS

#Activer la configuration au point d'accès Wifi (L3)
ap.ifconfig((ip_address, subnet_mask, gateway, dns_server))

# fonction d'affichage des paramètres :
def display_wifi_info():
    ap = network.WLAN(network.AP_IF)
    
    if ap.isconnected():
        print("Adresse IP : ", ap.ifconfig()[0])
        print("Adresse MAC : ", ":".join("{:02X}".format(b) for b in ap.config("mac")))
        print("SSID : ", ap.config("ssid"))
        print("Mode de chiffrement : ",   ap.config("authmode"))
        print("Canal Wi-Fi : ", ap.config("channel"))
        print("Puissance d'émission: {} dBm".format(ap.config("txpower")))
    else:
        print("Non connecté avec un Client Wifi")
        
# Configuration du socket UDP (Mode UDP) (L4)
ip_client = "192.168.10.2"  # Adresse IP du client
port = 12345  # Port de communication UDP
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Configuration du capteur DHT11
dht_pin = machine.Pin(18)  # GPIO 18
dht_sensor = dht.DHT11(dht_pin)

while True:
    # Lire les données du capteur DHT11
    dht_sensor.measure()
    temperature = dht_sensor.temperature()
    humidity = dht_sensor.humidity()

    # Créer un dictionnaire pour enregister les paramètres a envoyés
    data = {'temperature': temperature, 'humidity': humidity}
    # Convertir le dictionnaire en une chaîne JSON
    data_to_send = ujson.dumps(data)
    
    if ap.isconnected():
        try:
            sock.sendto(data_to_send.encode('UTF-8'), (ip_client, port))
            print("Données de capteur envoyées :", data_to_send)
            time.sleep(2)  # Lire les données du capteur toutes les 2 secondes
        except Exception as e:
            print("Erreur d'envoi :", e)
    else:
        print("Déconnecter")
        time.sleep(5) #SLEEP 5s avant de tester la connexion à un client.