Logo AWS IoT

AWS IoT

La plateforme complète qui connecte vos objets au cloud, permettant une communication bidirectionnelle sécurisée et une analyse intelligente des données IoT.

Pour les non-initiés

Qu'est-ce qu'AWS IoT ?

Imaginez pouvoir communiquer avec tous les objets qui vous entourent : votre réfrigérateur, votre système d'arrosage, votre thermostat, ou même les plantes de votre jardin.

AWS IoT est comme un traducteur universel qui permet à ces objets de se connecter à internet, d'envoyer des informations au cloud, et de recevoir des instructions. C'est la plateforme qui rend possible la maison intelligente et l'industrie connectée.

Pourquoi est-ce important ?

Information en temps réel

Savoir instantanément ce qui se passe : niveau d'humidité des plantes, température ambiante, consommation d'énergie...

Contrôle à distance

Piloter vos appareils de n'importe où : allumer des lumières, ajuster le chauffage, ou activer l'arrosage depuis votre smartphone.

En résumé, AWS IoT transforme des objets ordinaires en appareils intelligents, communiquant avec le cloud pour vous offrir plus de confort, d'économies d'énergie et de nouvelles possibilités d'automatisation.

Pour les développeurs

Fonctionnement technique

AWS IoT est un ensemble de services cloud qui permettent de connecter, gérer et analyser les appareils IoT à grande échelle. Il offre une infrastructure sécurisée pour la communication bidirectionnelle entre les appareils connectés et AWS.

Les composants clés

AWS IoT Core

Le service principal qui permet aux appareils de se connecter au cloud de manière sécurisée, en utilisant des protocoles comme MQTT, HTTP et WebSockets. Il gère l'authentification, l'autorisation et le routage des messages vers d'autres services AWS comme Icône AWS LambdaAWS Lambda ou Icône DynamoDBDynamoDB.

Voici un exemple de capteur d'humidité Arduino/ESP32 qui envoie des données à AWS IoT :

Capteur d'humidité Arduino avec envoi de données AWS IoT
// Exemple de code Arduino pour capteur d'humidité avec connexion à AWS IoT #include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include <DHT.h> // Configuration Wi-Fi const char* ssid = "votre_ssid_wifi"; const char* password = "votre_mot_de_passe_wifi"; // Configuration AWS IoT const char* aws_iot_endpoint = "xxxxxxx-ats.iot.us-east-1.amazonaws.com"; const int aws_iot_port = 8883; const char* client_id = "plant_monitor_device"; const char* publish_topic = "plant/moisture/data"; // Configuration capteur DHT #define DHTPIN 4 // Le pin où est connecté le capteur DHT #define DHTTYPE DHT22 // DHT 22 (AM2302) DHT dht(DHTPIN, DHTTYPE); // Configuration capteur d'humidité du sol const int soilMoisturePin = 36; // Pin analogique pour le capteur d'humidité const int dryValue = 3600; // Valeur lue quand le sol est sec const int wetValue = 1200; // Valeur lue quand le sol est mouillé // Variables globales WiFiClientSecure wifi_client; PubSubClient mqtt_client(wifi_client); unsigned long lastPublishTime = 0; const unsigned long publishInterval = 60000; // Publier une fois par minute void setup() { Serial.begin(115200); dht.begin(); // Connexion au Wi-Fi connectToWiFi(); // Configuration du client MQTT setupMQTT(); } void loop() { // Maintenir la connexion MQTT if (!mqtt_client.connected()) { reconnectMQTT(); } mqtt_client.loop(); // Publier des données à intervalle régulier unsigned long currentTime = millis(); if (currentTime - lastPublishTime >= publishInterval) { publishSensorData(); lastPublishTime = currentTime; } } void connectToWiFi() { Serial.print("Connexion au Wi-Fi"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("Wi-Fi connecté!"); Serial.print("Adresse IP: "); Serial.println(WiFi.localIP()); } void setupMQTT() { // Configuration des certificats TLS (code omis pour simplifier l'exemple) mqtt_client.setServer(aws_iot_endpoint, aws_iot_port); } void reconnectMQTT() { while (!mqtt_client.connected()) { Serial.print("Tentative de connexion à AWS IoT..."); if (mqtt_client.connect(client_id)) { Serial.println("Connecté à AWS IoT!"); } else { Serial.print("Échec, rc="); Serial.print(mqtt_client.state()); Serial.println(" Nouvelle tentative dans 5 secondes"); delay(5000); } } } void publishSensorData() { // Lire l'humidité et la température float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); // Lire l'humidité du sol int soilMoistureRaw = analogRead(soilMoisturePin); int soilMoisturePercent = map(soilMoistureRaw, dryValue, wetValue, 0, 100); soilMoisturePercent = constrain(soilMoisturePercent, 0, 100); // Vérifier si les lectures sont valides if (isnan(humidity) || isnan(temperature)) { Serial.println("Échec de lecture depuis le capteur DHT!"); return; } // Créer un objet JSON pour les données StaticJsonDocument<200> doc; doc["device_id"] = client_id; doc["temperature"] = temperature; doc["humidity"] = humidity; doc["soil_moisture"] = soilMoisturePercent; doc["timestamp"] = millis(); // Convertir le document JSON en chaîne char jsonBuffer[512]; serializeJson(doc, jsonBuffer); // Publier sur AWS IoT Serial.println("Publication des données du capteur:"); Serial.println(jsonBuffer); if (mqtt_client.publish(publish_topic, jsonBuffer)) { Serial.println("Publication réussie!"); } else { Serial.println("Échec de publication"); } }

AWS IoT Device Shadow

Représentation virtuelle d'un appareil qui stocke son état actuel et désiré, permettant aux applications de communiquer avec les appareils même lorsqu'ils sont hors ligne. Les shadows synchronisent automatiquement l'état lorsque l'appareil se reconnecte.

La fonction Shadow est particulièrement utile pour les appareils qui peuvent être intermittents, comme des dispositifs sur batterie ou ceux avec une connectivité instable.

AWS IoT Rules Engine

Moteur d'analyse et de transformation des messages qui permet de définir des actions à déclencher lorsque des données spécifiques sont reçues. Les règles sont écrites en SQL et peuvent déclencher des actions comme l'envoi de notifications Icône SNSSNS, l'invocation de fonctions Icône LambdaLambda, ou le stockage de données dans Icône DynamoDBDynamoDB.

Règle AWS IoT pour enregistrer les données dans DynamoDB
// AWS IoT Rule pour enregistrer les données dans DynamoDB { "sql": "SELECT device_id, temperature, humidity, soil_moisture, timestamp FROM 'plant/moisture/data'", "actions": [ { "dynamoDB": { "tableName": "plant_moisture_data", "roleArn": "arn:aws:iam::123456789012:role/PlantMonitorDynamoDBRole", "hashKeyField": "device_id", "hashKeyValue": "${device_id}", "rangeKeyField": "timestamp", "rangeKeyValue": "${timestamp}", "payloadField": "data" } }, { "sns": { "targetArn": "arn:aws:sns:us-east-1:123456789012:plant_alert", "roleArn": "arn:aws:iam::123456789012:role/PlantMonitorSNSRole", "messageFormat": "JSON" } } ] }

Contrôle des appareils

AWS IoT permet également de contrôler les appareils à distance, en envoyant des commandes depuis le cloud. Par exemple, voici comment contrôler des LED RGB avec une bande FastLED :

Contrôle de LEDs RGB avec AWS IoT et FastLED
// Exemple de code Arduino pour contrôler des LEDs via AWS IoT #include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include <FastLED.h> // Configuration Wi-Fi const char* ssid = "votre_ssid_wifi"; const char* password = "votre_mot_de_passe_wifi"; // Configuration AWS IoT const char* aws_iot_endpoint = "xxxxxxx-ats.iot.us-east-1.amazonaws.com"; const int aws_iot_port = 8883; const char* client_id = "led_control_device"; const char* subscribe_topic = "device/leds/control"; // Configuration FastLED #define LED_PIN 5 #define NUM_LEDS 30 #define LED_TYPE WS2812B #define COLOR_ORDER GRB CRGB leds[NUM_LEDS]; // Variables globales WiFiClientSecure wifi_client; PubSubClient mqtt_client(wifi_client); void setup() { Serial.begin(115200); // Initialisation des LEDs FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(50); // Luminosité à 50/255 // LED par défaut (toutes éteintes) fill_solid(leds, NUM_LEDS, CRGB::Black); FastLED.show(); // Connexion au Wi-Fi connectToWiFi(); // Configuration du client MQTT setupMQTT(); } void loop() { // Maintenir la connexion MQTT if (!mqtt_client.connected()) { reconnectMQTT(); } mqtt_client.loop(); // Le reste du traitement est géré dans la fonction de callback } void connectToWiFi() { Serial.print("Connexion au Wi-Fi"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("Wi-Fi connecté!"); Serial.print("Adresse IP: "); Serial.println(WiFi.localIP()); } void setupMQTT() { // Configuration des certificats TLS (code omis pour simplifier l'exemple) mqtt_client.setServer(aws_iot_endpoint, aws_iot_port); mqtt_client.setCallback(messageReceived); } void reconnectMQTT() { while (!mqtt_client.connected()) { Serial.print("Tentative de connexion à AWS IoT..."); if (mqtt_client.connect(client_id)) { Serial.println("Connecté à AWS IoT!"); // S'abonner au topic de contrôle mqtt_client.subscribe(subscribe_topic); Serial.println("Abonné au topic de contrôle"); } else { Serial.print("Échec, rc="); Serial.print(mqtt_client.state()); Serial.println(" Nouvelle tentative dans 5 secondes"); delay(5000); } } } void messageReceived(char* topic, byte* payload, unsigned int length) { Serial.print("Message reçu ["); Serial.print(topic); Serial.print("]: "); // Convertir le payload en chaîne char message[length + 1]; for (int i = 0; i < length; i++) { message[i] = (char)payload[i]; } message[length] = '\0'; Serial.println(message); // Analyser le message JSON StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, message); if (error) { Serial.print("Erreur d'analyse JSON: "); Serial.println(error.c_str()); return; } // Extraire les données const char* action = doc["action"]; if (strcmp(action, "set_color") == 0) { int r = doc["red"]; int g = doc["green"]; int b = doc["blue"]; // Définir la couleur de toutes les LEDs fill_solid(leds, NUM_LEDS, CRGB(r, g, b)); FastLED.show(); Serial.printf("Couleur définie à RGB(%d, %d, %d)\n", r, g, b); } else if (strcmp(action, "rainbow") == 0) { // Effet arc-en-ciel fill_rainbow(leds, NUM_LEDS, 0, 7); FastLED.show(); Serial.println("Mode arc-en-ciel activé"); } else if (strcmp(action, "off") == 0) { // Éteindre toutes les LEDs fill_solid(leds, NUM_LEDS, CRGB::Black); FastLED.show(); Serial.println("LEDs éteintes"); } }

Interaction depuis Node.js

Côté backend, nous pouvons utiliser le SDK AWS pour Node.js afin d'envoyer des commandes aux appareils IoT :

Envoi de commandes à un appareil IoT avec Node.js
// Exemple de code Node.js pour envoyer des commandes à un appareil via AWS IoT const AWS = require('aws-sdk'); const { v4: uuidv4 } = require('uuid'); // Configuration des informations d'identification AWS AWS.config.update({ region: 'us-east-1', credentials: new AWS.Credentials({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }) }); // Créer une instance du client AWS IoT const iotData = new AWS.IotData({ endpoint: 'xxxxxxx-ats.iot.us-east-1.amazonaws.com' }); // Fonction pour contrôler les LEDs async function controlLeds(action, color = null) { // Préparer le message const message = { timestamp: Date.now(), requestId: uuidv4(), action: action }; // Ajouter des informations de couleur si nécessaire if (action === 'set_color' && color) { message.red = color.red; message.green = color.green; message.blue = color.blue; } // Paramètres pour publier sur AWS IoT const params = { topic: 'device/leds/control', payload: JSON.stringify(message), qos: 0 }; try { // Publier le message const result = await iotData.publish(params).promise(); console.log('Message envoyé avec succès:', message); return result; } catch (error) { console.error('Erreur lors de l'envoi du message:', error); throw error; } } // Exemples d'utilisation async function runExamples() { try { // Allumer les LEDs en rouge await controlLeds('set_color', { red: 255, green: 0, blue: 0 }); console.log('LEDs allumées en rouge'); // Attendre 5 secondes await new Promise(resolve => setTimeout(resolve, 5000)); // Activer le mode arc-en-ciel await controlLeds('rainbow'); console.log('Mode arc-en-ciel activé'); // Attendre 5 secondes await new Promise(resolve => setTimeout(resolve, 5000)); // Éteindre les LEDs await controlLeds('off'); console.log('LEDs éteintes'); } catch (error) { console.error('Erreur lors de l'exécution des exemples:', error); } } // Exécuter les exemples runExamples();

AWS IoT Button

Un exemple pratique est l'AWS IoT Button, un bouton programmable qui peut déclencher diverses actions dans le cloud. Voici un exemple de fonction Lambda traitant les événements d'un bouton IoT pour contrôler des LEDs :

Traitement d'événements AWS IoT Button avec Lambda
// Code AWS Lambda pour traiter les événements AWS IoT Button exports.handler = async (event, context) => { console.log('Événement IoT Button reçu:', JSON.stringify(event, null, 2)); // Extraire les informations du bouton const buttonSerialNumber = event.serialNumber; const clickType = event.clickType; // 'SINGLE', 'DOUBLE', ou 'LONG' const batteryVoltage = event.batteryVoltage; let action; // Déterminer l'action en fonction du type de clic switch (clickType) { case 'SINGLE': action = { command: 'set_color', color: { red: 0, green: 0, blue: 255 } // Bleu }; break; case 'DOUBLE': action = { command: 'rainbow' }; break; case 'LONG': action = { command: 'off' }; break; default: return { statusCode: 400, body: 'Type de clic non reconnu' }; } try { // Envoyer la commande à l'appareil IoT // (En production, vous appelleriez une fonction pour publier sur AWS IoT) console.log(`Envoi de la commande ${action.command} pour le bouton ${buttonSerialNumber}`); return { statusCode: 200, body: JSON.stringify({ message: 'Commande traitée avec succès', buttonSerialNumber, clickType, action }) }; } catch (error) { console.error('Erreur lors du traitement de la commande:', error); return { statusCode: 500, body: 'Erreur lors du traitement de la commande' }; } };

Services complémentaires

  • AWS IoT Analytics - Service entièrement géré pour l'analyse des données IoT à grande échelle
  • AWS IoT Events - Service de détection et de réponse aux événements des appareils IoT
  • AWS IoT SiteWise - Service pour collecter, organiser et analyser les données industrielles
  • AWS IoT Greengrass - Extension du cloud qui permet l'exécution locale de calculs, messagerie et synchronisation de données
  • AWS IoT Device Defender - Service pour auditer les configurations, surveiller les appareils et détecter les comportements anormaux

Protocoles de communication

  • MQTT - Protocole léger basé sur la publication/souscription, idéal pour les appareils à ressources limitées
  • HTTP - Protocole standard pour les appareils disposant de plus de ressources
  • WebSockets - Pour les communications bidirectionnelles en temps réel
  • LoRaWAN - Protocole pour les réseaux longue portée et basse consommation, supporté par AWS IoT Core

Sécurité

La sécurité est fondamentale dans l'IoT. AWS IoT fournit plusieurs mécanismes :

  • Authentification mutuelle TLS - Chaque appareil s'authentifie avec un certificat X.509
  • Stratégies IAM - Définition précise des autorisations pour chaque appareil
  • Device Defender - Surveillance continue des comportements anormaux
  • Chiffrement des données - En transit et au repos
Applications concrètes

Cas d'usage

Domotique et maison intelligente

Contrôle d'éclairage, thermostats intelligents, systèmes de sécurité, et gestion de l'énergie domestique. Intégration avec des assistants vocaux comme Alexa.

Agriculture intelligente

Surveillance de l'humidité du sol, systèmes d'irrigation automatisés, suivi des conditions météorologiques et optimisation des cultures. Parfait pour les potagers connectés.

Surveillance environnementale

Capteurs de qualité de l'air, monitoring de la pollution, suivi des niveaux d'eau et détection précoce des risques environnementaux.

Industrie 4.0

Maintenance prédictive, surveillance des équipements, optimisation des chaînes de production et gestion des actifs industriels.

Applications populaires avec ESP32 et Arduino

Les microcontrôleurs ESP32 et Arduino sont parfaits pour créer des projets IoT personnalisés avec AWS IoT :

Stations météo
Arrosage automatique
Éclairage intelligent
Cadres photos connectés
Monitoring énergétique
Contrôleurs LED RGB
Damien Gilbrin
Damien Gilbrin

Ce que j'ai réalisé avec AWS IoT

Des projets connectés et intelligents

J'ai utilisé AWS IoT dans divers projets personnels et professionnels, en créant des solutions connectées innovantes et robustes.

Système de monitoring pour plantes

Développement d'un système de suivi de l'humidité du sol et d'arrosage automatique pour les plantes d'intérieur, utilisant des capteurs Arduino connectés à AWS IoT Core et Icône DynamoDBDynamoDB pour stocker l'historique des données.

Cadre photo intelligent connecté

Création d'un cadre photo ESP32 connecté à AWS IoT, capable d'afficher des photos envoyées depuis une application mobile, avec des animations LED contrôlées par Icône AWS LambdaAWS Lambda et Icône AWS S3AWS S3.