try:
    import usocket as socket
except:
    import socket
import network

#Configuration de WIFI (L2) :
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

#Scan de WLAN existants
for ap in wlan.scan() :
    print("SSID: " + ap[0].decode())  # Nom du réseau (SSID)
    print("BSSID: " + ":".join("{:02x}".format(x) for x in ap[1]))  # Adresse MAC (BSSID)
    print("RSSI: " + str(ap[3]))  # Puissance du signal (RSSI)
    print("Channel: " + str(ap[2]))  # Canal du réseau
    print("````````````````````````````````````````````````````````")
#Connexion au WLAN GUEST :
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
    pass

# Fonction pour afficher le statut de la connexion
def afficher_statut():
    statuts = {
        network.STAT_IDLE: "Aucune connexion et aucune activité",
        network.STAT_CONNECTING: "Connexion en cours",
        network.STAT_WRONG_PASSWORD: "Échec de connexion - Mot de passe incorrect",
        network.STAT_NO_AP_FOUND: "Échec de connexion - Aucun point d'accès trouvé",
        network.STAT_GOT_IP: "Connexion réussie - Adresse IP obtenue"
    }
    status = wlan.status()

    if status in statuts:
        print("Statut de la connexion Wi-Fi:", statuts[status])
    else:
        print("Statut de la connexion Wi-Fi: Inconnu")

# Appel de la fonction pour afficher le statut actuel
afficher_statut()
#Configurer les paramètres L2 
def configurer_parametres():
    # @MAC, hostname, power management et tx power :
    wlan.config(mac=b'\x12\x34\x56\x78\x90\xAB', hostname='ESP32-Client', txpower=20, pm=0)
    # Affichage des paramètres configurés
    print("Paramètres configurés :")
    print("Adresse MAC :", wlan.config('mac'))
    print("Hostname :", wlan.config('hostname'))
    print("Puissance de transmission (txpower) :", wlan.config('txpower'))
    print("Gestion de l'alimentation (pm) :", wlan.config('pm'))
# Appel de la fonction pour configurer les paramètres L2
configurer_parametres()

#Afficher les paramères de connexion IP (L3) : 
def afficher_parametres_connexion():
    # Récupération des paramètres de configuration IP
    config_ip = wlan.ifconfig()
    print("Adresse IP locale:", config_ip[0])
    print("Masque de sous-réseau:", config_ip[1])
    print("Passerelle par défaut:", config_ip[2])
    print("Serveur DNS:", config_ip[3])
# Appel de la fonction pour afficher les paramètres de connexion IP
afficher_parametres_connexion()

#Configurer les paramètres de connexion IP :
wlan.ifconfig(('192.168.10.2', '255.255.255.0', '192.168.10.1', '8.8.8.8'))

# Appel de la fonction pour afficher les paramètres de connexion IP
afficher_parametres_connexion()

#***************************** Connexion L4 ************************************
# Configuration du socket UDP client (L4)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('192.168.10.1', 8081)  # Remplacez par l'adresse IP et port du serveur UDP

try:
    # Envoi de données au serveur UDP
    message = "Hello, server! UDP"
    client_socket.sendto(message.encode('utf-8'), server_address)
    print("Message envoyé au serveur UDP")

    # Réception de la réponse du serveur UDP
    data, addr = client_socket.recvfrom(1024)
    print("Réponse du serveur UDP :", data.decode('utf-8'))

finally:
    client_socket.close()


# Configuration du socket TCP client (L4)
client_socket = socket.socket()
server_address = ('192.168.10.1', 8555)  # Remplacez par l'adresse IP et port du serveur TCP
try:
    # Connexion au serveur TCP
    client_socket.connect(server_address)
    print("Connecté au serveur TCP")

    # Envoi de données au serveur TCP
    message = "Hello, server! TCP"
    client_socket.sendall(message.encode('utf-8'))

    # Réception de la réponse du serveur TCP
    data = client_socket.recv(1024)
    print("Réponse du serveur TCP :", data.decode('utf-8'))

finally:
    client_socket.close()