Objets Connectés et Internet des Objets (IoT)

Découvrez l'univers de l'IoT : protocoles de communication sans fil, architecture cloud, maisons intelligentes et projets connectés avec ESP32 et MQTT

Intermédiaire50 min220 XP

Il y a plus de 15 milliards d'objets connectés dans le monde en 2024 : montres, ampoules, thermostats, caméras, voitures... L'Internet des Objets (IoT) transforme notre quotidien en connectant le monde physique au monde numérique. Apprenons à créer nos propres objets intelligents !

Objectifs d'apprentissage

  • Comprendre l'architecture de l'Internet des Objets
  • Identifier les protocoles de communication IoT (WiFi, Bluetooth, LoRa, Zigbee)
  • Maîtriser le protocole MQTT pour la communication machine-to-machine
  • Concevoir un projet IoT complet avec ESP32
  • Analyser les enjeux de sécurité et de vie privée des objets connectés

Erreurs courantes à éviter

  • Utiliser HTTP au lieu de MQTT pour les communications IoT (trop lourd)
  • Négliger la sécurité (mots de passe par défaut, pas de chiffrement)
  • Sous-estimer la consommation énergétique des communications sans fil
  • Ignorer la gestion des déconnexions et reconnexions réseau

Contenu du cours

L'IoT repose sur une architecture en couches qui connecte les capteurs physiques au cloud et aux applications. **Les 4 couches de l'IoT :** | Couche | Rôle | Exemples | |--------|------|----------| | **Perception** | Capteurs et actuateurs | Température, humidité, LED, moteurs | | **Réseau** | Communication | WiFi, Bluetooth, LoRa, Zigbee | | **Traitement** | Analyse des données | Edge computing, serveurs locaux | | **Application** | Interface utilisateur | Apps mobiles, dashboards web | **Architecture typique :** ``` [Capteurs] → [Microcontrôleur] → [Passerelle] → [Cloud] → [Application] │ │ │ │ │ Mesures ESP32/Arduino Routeur AWS/Azure Mobile ``` **Types de communications :** - **Device-to-Cloud (D2C)** : Capteur envoie des données au cloud - **Cloud-to-Device (C2D)** : Cloud envoie des commandes - **Device-to-Device (D2D)** : Communication directe entre appareils - **Device-to-Gateway (D2G)** : Via une passerelle locale **Exemples de plateformes IoT :** | Plateforme | Fournisseur | Points forts | |------------|-------------|--------------| | AWS IoT | Amazon | Scalabilité, intégration AWS | | Azure IoT Hub | Microsoft | Entreprise, analytics | | Google Cloud IoT | Google | IA/ML intégré | | ThingSpeak | MathWorks | Gratuit, visualisation | | Blynk | Blynk Inc | Apps mobiles faciles |
Code Python - Simulation
# Simulation d'architecture IoT
# Communication entre capteurs, passerelle et cloud

import time
import random
import json
from datetime import datetime

class CapteurIoT:
    """Simule un capteur IoT (température/humidité)"""

    def __init__(self, id_capteur, type_capteur, localisation):
        self.id = id_capteur
        self.type = type_capteur
        self.localisation = localisation
        self.batterie = 100
        self.connecte = False

    def lire_donnees(self):
        """Lit les données du capteur"""
        # Simuler les mesures
        if self.type == "temperature":
            valeur = 20 + random.gauss(0, 2)
            unite = "°C"
        elif self.type == "humidite":
            valeur = 50 + random.gauss(0, 10)
            unite = "%"
        elif self.type == "luminosite":
            valeur = random.randint(0, 1000)
            unite = "lux"
        else:
            valeur = random.random() * 100
            unite = ""

        # Consommer de la batterie
        self.batterie = max(0, self.batterie - 0.1)

        return {
            "device_id": self.id,
            "type": self.type,
            "value": round(valeur, 2),
            "unit": unite,
            "location": self.localisation,
            "battery": round(self.batterie, 1),
            "timestamp": datetime.now().isoformat()
        }

    def envoyer_message(self, message):
        """Simule l'envoi d'un message (D2C)"""
        if self.connecte and self.batterie > 0:
            print(f"  [{self.id}] → Message envoyé: {message['type']}={message['value']}{message['unit']}")
            return True
        return False

class PasserelleIoT:
    """Passerelle/Gateway qui collecte les données des capteurs"""

    def __init__(self, nom):
        self.nom = nom
        self.capteurs = []
        self.buffer_messages = []
        self.connecte_cloud = False

    def enregistrer_capteur(self, capteur):
        """Enregistre un capteur sur la passerelle"""
        self.capteurs.append(capteur)
        capteur.connecte = True
        print(f"[Gateway {self.nom}] Capteur {capteur.id} enregistré")

    def collecter_donnees(self):
        """Collecte les données de tous les capteurs"""
        donnees = []
        for capteur in self.capteurs:
            if capteur.batterie > 0:
                data = capteur.lire_donnees()
                capteur.envoyer_message(data)
                donnees.append(data)
        self.buffer_messages.extend(donnees)
        return donnees

    def synchroniser_cloud(self, cloud):
        """Envoie les données au cloud"""
        if self.buffer_messages:
            print(f"\n[Gateway {self.nom}] Synchronisation cloud...")
            print(f"  → Envoi de {len(self.buffer_messages)} messages")
            cloud.recevoir_donnees(self.buffer_messages)
            self.buffer_messages = []
            return True
        return False

class CloudIoT:
    """Simule un service cloud IoT"""

    def __init__(self, nom):
        self.nom = nom
        self.base_donnees = []
        self.regles_alertes = []
        self.abonnes = []

    def recevoir_donnees(self, donnees):
        """Reçoit et stocke les données"""
        for d in donnees:
            self.base_donnees.append(d)
            print(f"  [Cloud] Reçu: {d['device_id']} - {d['type']}={d['value']}")

            # Vérifier les règles d'alerte
            self.verifier_alertes(d)

    def ajouter_regle_alerte(self, type_capteur, condition, seuil, message):
        """Ajoute une règle d'alerte"""
        self.regles_alertes.append({
            'type': type_capteur,
            'condition': condition,
            'seuil': seuil,
            'message': message
        })

    def verifier_alertes(self, donnee):
        """Vérifie les conditions d'alerte"""
        for regle in self.regles_alertes:
            if donnee['type'] == regle['type']:
                declenchee = False
                if regle['condition'] == '>' and donnee['value'] > regle['seuil']:
                    declenchee = True
                elif regle['condition'] == '<' and donnee['value'] < regle['seuil']:
                    declenchee = True

                if declenchee:
                    print(f"  🚨 ALERTE: {regle['message']} ({donnee['value']}{donnee['unit']})")
                    self.notifier_abonnes(regle['message'], donnee)

    def abonner(self, callback):
        """Abonne un utilisateur aux notifications"""
        self.abonnes.append(callback)

    def notifier_abonnes(self, message, donnee):
        """Notifie tous les abonnés"""
        for callback in self.abonnes:
            callback(message, donnee)

    def statistiques(self):
        """Calcule des statistiques sur les données"""
        stats = {}
        for d in self.base_donnees:
            key = d['type']
            if key not in stats:
                stats[key] = {'values': [], 'count': 0}
            stats[key]['values'].append(d['value'])
            stats[key]['count'] += 1

        print("\n📊 STATISTIQUES CLOUD")
        print("-" * 40)
        for type_c, data in stats.items():
            moy = sum(data['values']) / len(data['values'])
            mini = min(data['values'])
            maxi = max(data['values'])
            print(f"  {type_c}: {data['count']} mesures")
            print(f"    Min={mini:.1f} | Moy={moy:.1f} | Max={maxi:.1f}")

# ================================================================
# SIMULATION COMPLÈTE
# ================================================================

print("="*60)
print("   SIMULATION ARCHITECTURE IoT COMPLÈTE")
print("="*60)

# Créer le cloud
cloud = CloudIoT("MonCloud")

# Ajouter des règles d'alerte
cloud.ajouter_regle_alerte("temperature", ">", 25, "Température élevée!")
cloud.ajouter_regle_alerte("temperature", "<", 15, "Température basse!")
cloud.ajouter_regle_alerte("humidite", ">", 70, "Humidité élevée!")

# Abonner un utilisateur
def notification_utilisateur(message, donnee):
    print(f"  📱 [Notification] {message}")

cloud.abonner(notification_utilisateur)

# Créer la passerelle
gateway = PasserelleIoT("GW_Maison")

# Créer les capteurs
print("\n📡 ENREGISTREMENT DES CAPTEURS")
print("-" * 40)

capteurs = [
    CapteurIoT("TEMP_SALON", "temperature", "Salon"),
    CapteurIoT("TEMP_CHAMBRE", "temperature", "Chambre"),
    CapteurIoT("HUM_SDB", "humidite", "Salle de bain"),
    CapteurIoT("LUM_JARDIN", "luminosite", "Jardin"),
]

for c in capteurs:
    gateway.enregistrer_capteur(c)

# Simuler plusieurs cycles de collecte
print("\n🔄 CYCLES DE COLLECTE")
print("-" * 40)

for cycle in range(3):
    print(f"\n--- Cycle {cycle + 1} ---")
    gateway.collecter_donnees()
    gateway.synchroniser_cloud(cloud)
    time.sleep(0.1)

# Afficher les statistiques
cloud.statistiques()

# État des batteries
print("\n🔋 ÉTAT DES BATTERIES")
print("-" * 40)
for c in capteurs:
    symbole = "🟢" if c.batterie > 50 else "🟡" if c.batterie > 20 else "🔴"
    print(f"  {symbole} {c.id}: {c.batterie:.1f}%")

print("\n" + "="*60)

Quiz de validation

1. Quel protocole est le plus adapté pour la communication IoT légère ?

2. Dans MQTT, quel composant centralise tous les messages ?

3. Quel protocole sans fil offre la plus longue portée pour l'IoT ?

4. Quelle est la principale vulnérabilité des objets connectés grand public ?

5. Que signifie QoS 2 dans MQTT ?

Pixel