Aller au contenu principal
·14 min de lecture

Applications IoT : connecter objets et mobile intelligemment

Guide complet pour développer une application mobile connectée à des objets IoT. Bluetooth, MQTT, protocoles, architecture et retours d'expérience terrain.

IoTTechniqueInnovationMobile

Vous voulez connecter votre application mobile à des capteurs, des machines ou des objets du quotidien ? Bienvenue dans le monde de l'IoT — un univers où le hardware rencontre le software, et où les bugs peuvent venir de partout. Littéralement.

Le marché IoT atteint aujourd'hui des proportions massives. Selon Statista (2025), le secteur représente 1 060 milliards de dollars au niveau mondial. Et ce n'est que le début : IoT Analytics comptabilise 21,1 milliards d'appareils connectés en activité, avec une croissance de 14% par an. La question n'est plus "faut-il faire de l'IoT ?" mais "comment le faire correctement ?".

Dans cet article, on va décortiquer les choix techniques, les pièges à éviter, et partager ce qu'on a appris sur le terrain chez Eurus en développant des applications connectées. Pas de théorie abstraite : du concret, avec du code qui fonctionne (ou pas — on parlera aussi des échecs).

Comprendre l'architecture d'une application IoT

Avant de plonger dans le code, il faut comprendre comment les pièces s'assemblent. Une application IoT mobile, c'est généralement trois couches qui communiquent.

La première couche, c'est l'objet connecté lui-même : un capteur de température, une serrure connectée, un bracelet fitness, une machine industrielle. Cette couche embarque du firmware, souvent en C ou C++, qui tourne sur des microcontrôleurs comme ESP32, STM32 ou des puces Nordic.

La deuxième couche, c'est la communication. Comment l'objet parle-t-il à votre téléphone ou à un serveur ? C'est là qu'interviennent les protocoles : Bluetooth Low Energy (BLE) pour le local, Wi-Fi pour le réseau domestique, MQTT ou HTTP pour le cloud, LoRaWAN pour les longues distances avec faible consommation.

La troisième couche, c'est votre application mobile et son backend. C'est là qu'on structure les données, qu'on gère les utilisateurs, qu'on affiche les dashboards et qu'on déclenche des actions.

Concrètement, quand un utilisateur appuie sur un bouton dans votre app pour allumer une lampe connectée, le signal traverse ces trois couches dans les deux sens. Et chaque transition est une opportunité pour que quelque chose plante.

Bluetooth Low Energy : le choix par défaut pour le mobile

Si vous développez une app mobile qui communique directement avec un objet proche (moins de 100 mètres), le BLE est probablement votre meilleur ami. D'après IoT Analytics (2025), 24% des appareils IoT connectés dans le monde utilisent Bluetooth, ce qui en fait la deuxième technologie de connectivité après le Wi-Fi.

Comment fonctionne le BLE

Le BLE utilise un modèle client-serveur basé sur le concept de GATT (Generic Attribute Profile). Votre téléphone est le client, l'objet connecté est le serveur. Le serveur expose des "services", chaque service contient des "caractéristiques", et chaque caractéristique peut être lue, écrite ou notifiée.

Prenons un exemple concret. Une balance connectée expose un service "Weight Measurement" (UUID standardisé). Ce service contient une caractéristique "Weight" qu'on peut lire. Quand l'utilisateur monte sur la balance, la valeur change, et si on s'est abonné aux notifications, notre app reçoit automatiquement la nouvelle mesure.

// iOS - Lecture d'une caractéristique BLE
func peripheral(_ peripheral: CBPeripheral, 
                didDiscoverCharacteristicsFor service: CBService, 
                error: Error?) {
    guard let characteristics = service.characteristics else { return }
    
    for characteristic in characteristics {
        if characteristic.uuid == WEIGHT_CHARACTERISTIC_UUID {
            // Activer les notifications
            peripheral.setNotifyValue(true, for: characteristic)
        }
    }
}

func peripheral(_ peripheral: CBPeripheral, 
                didUpdateValueFor characteristic: CBCharacteristic, 
                error: Error?) {
    if let data = characteristic.value {
        let weight = parseWeightData(data)
        updateUI(weight: weight)
    }
}

Les pièges du BLE qu'on a appris à nos dépens

Sur un projet de tracking d'équipements sportifs, on a passé deux semaines à débugger un problème de connexion intermittente. L'app fonctionnait parfaitement en développement, mais plantait chez 30% des utilisateurs en production.

Le coupable ? La gestion du cycle de vie Android. Quand l'app passait en arrière-plan, le système Android tuait notre service BLE pour économiser la batterie. Au retour, on essayait de reconnecter, mais l'objet était encore "bindé" à l'ancienne session. Résultat : timeout systématique.

La solution a été de gérer proprement la déconnexion avant le passage en arrière-plan et d'implémenter un mécanisme de reconnexion avec backoff exponentiel. Leçon apprise : ne jamais faire confiance au système pour maintenir vos connexions BLE.

Un autre piège classique : les différences entre iOS et Android. Sur iOS, vous ne pouvez pas scanner les appareils BLE en arrière-plan sans déclarer des services spécifiques à écouter. Sur Android, les restrictions varient selon les versions (Doze mode depuis Android 6, restrictions renforcées depuis Android 12). Planifiez du temps pour gérer ces asymétries.

MQTT : le protocole roi pour le cloud IoT

Quand votre objet connecté doit communiquer via Internet plutôt qu'en local, MQTT devient le choix évident. Léger, efficace, conçu pour les réseaux instables — c'est le protocole que 90% des projets IoT cloud utilisent, selon une estimation d'Eclipse Foundation.

Pourquoi MQTT et pas HTTP ?

HTTP fonctionne en mode requête-réponse : le client demande, le serveur répond. Pour de l'IoT temps réel, c'est problématique. Vous voulez être notifié quand un capteur change de valeur, pas poller toutes les secondes.

MQTT fonctionne en mode publish-subscribe. Votre objet "publie" sur un topic (par exemple maison/salon/temperature). Votre app "s'abonne" à ce topic. Dès que l'objet publie une nouvelle valeur, votre app la reçoit instantanément. Pas de polling, pas de gaspillage de bande passante.

// Node.js - Backend MQTT avec Mosquitto
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.example.com');

client.on('connect', () => {
    // S'abonner à tous les capteurs d'un bâtiment
    client.subscribe('building/+/sensors/#');
});

client.on('message', (topic, message) => {
    const parts = topic.split('/');
    const floor = parts[1];
    const sensorType = parts[3];
    const value = JSON.parse(message.toString());
    
    // Stocker en base et notifier les clients web/mobile
    storeSensorData(floor, sensorType, value);
    notifyClients(floor, sensorType, value);
});

Architecture cloud pour l'IoT

Une architecture IoT robuste comprend généralement :

| Composant | Rôle | Technologies courantes | |-----------|------|------------------------| | Broker MQTT | Réception des messages IoT | Mosquitto, EMQX, AWS IoT Core | | Base temps réel | Stockage des séries temporelles | InfluxDB, TimescaleDB, QuestDB | | API REST | Interface pour l'app mobile | Node.js, FastAPI, Go | | WebSocket | Temps réel vers le mobile | Socket.io, native WS | | File d'attente | Découplage et résilience | RabbitMQ, Kafka, Redis Streams |

Chez Eurus, on utilise souvent AWS IoT Core pour les projets d'envergure. Le service gère le broker MQTT, l'authentification par certificats, les règles de routage et l'intégration native avec Lambda et DynamoDB. Pour des projets plus modestes, un broker Mosquitto auto-hébergé fait très bien l'affaire.

Cas d'usage concrets et retours terrain

Santé connectée : les contraintes qu'on n'imagine pas

Le secteur healthcare IoT pèse 534,3 milliards de dollars selon Grand View Research. Mais développer pour ce secteur, c'est accepter des contraintes drastiques.

Sur un projet de monitoring de patients à domicile, on a découvert que les utilisateurs (souvent âgés) n'avaient pas le réflexe de garder le Bluetooth activé. L'app détectait bien l'absence de connexion, mais afficher "Bluetooth désactivé" ne suffisait pas — ils ne savaient pas comment le réactiver.

On a dû implémenter un guide pas-à-pas avec captures d'écran, puis une redirection automatique vers les paramètres système. Même ça ne suffisait pas toujours. La vraie solution ? Concevoir l'objet connecté pour qu'il fonctionne aussi sans l'app, en stockant les données localement et en les synchronisant quand la connexion revient.

Les cabinets vétérinaires ont des contraintes qu'on n'imaginait pas : connexion internet instable, PC sous Windows XP, urgences qui arrivent pendant qu'on tape une ordonnance. Sur DrMilou, notre application pour vétérinaires, cette réalité nous a poussés à concevoir un mode offline-first dès le départ. Chaque donnée critique est stockée localement avant d'être synchronisée.

Industrie : la robustesse avant tout

L'IoT industriel (IIoT) représente l'un des plus gros segments du marché. Selon Gartner, les investissements IoT dans l'industrie croissent à un rythme de 15% par an depuis 2021.

La différence avec le grand public ? La tolérance zéro aux pannes. Quand un capteur de température surveille un four industriel, une déconnexion de 10 secondes peut coûter des milliers d'euros.

Pour ces projets, on recommande systématiquement :

  • Redondance des connexions : double liaison (Wi-Fi + 4G) avec failover automatique
  • Alertes multi-canal : SMS + email + push + webhook
  • Historique local : buffer de 7 jours minimum sur l'objet en cas de perte de connexion cloud
  • Watchdog hardware : redémarrage automatique du microcontrôleur en cas de freeze

Choisir le bon protocole selon votre cas

Le choix du protocole de communication dépend de trois facteurs : la distance, la consommation énergétique, et le débit de données.

| Protocole | Portée | Consommation | Débit | Cas d'usage | |-----------|--------|--------------|-------|-------------| | BLE | 10-100m | Très faible | 1 Mbps | Wearables, domotique locale | | Wi-Fi | 50m indoor | Élevée | 100+ Mbps | Caméras, hubs, appareils branchés | | Zigbee | 10-100m | Faible | 250 Kbps | Capteurs domotiques, mesh | | Z-Wave | 30m | Faible | 100 Kbps | Domotique haut de gamme | | LoRaWAN | 2-15 km | Très faible | 50 Kbps | Agriculture, villes intelligentes | | NB-IoT | National | Faible | 200 Kbps | Compteurs, tracking longue durée |

Si votre objet est alimenté par batterie et doit durer des mois, oubliez le Wi-Fi. Si vous avez besoin de vidéo en temps réel, oubliez le Bluetooth. Si vous déployez des capteurs dans des champs agricoles, regardez du côté de LoRaWAN.

Sécurité : le maillon faible de l'IoT

Je vais être direct : la majorité des objets connectés sont des passoires sécuritaires. Et si vous développez l'app mobile qui s'y connecte, c'est aussi votre problème.

Selon une étude Palo Alto Networks (2024), 57% des appareils IoT sont vulnérables à des attaques de gravité moyenne à élevée. Les failles les plus courantes ? Mots de passe par défaut, absence de chiffrement, firmware non mis à jour.

Côté application mobile, voici les minimums non négociables :

Pour le BLE :

  • Toujours utiliser le pairing sécurisé (Secure Connections depuis BLE 4.2)
  • Chiffrer les données échangées même après pairing
  • Implémenter une authentification applicative en plus du pairing

Pour le cloud MQTT :

  • TLS obligatoire, pas de connexion en clair
  • Authentification par certificat client (pas juste username/password)
  • ACL strictes sur les topics (un device ne doit pas pouvoir lire les données d'un autre)

Général :

  • Stocker les credentials dans le Keychain (iOS) ou EncryptedSharedPreferences (Android)
  • Ne jamais logger les données sensibles
  • Prévoir un mécanisme de révocation des accès

Le piège du "ça marche sur ma machine"

En 3 ans chez Eurus, j'ai vu des projets échouer non pas à cause du code, mais parce que personne n'avait vraiment testé en conditions réelles. Un capteur BLE qui fonctionne à 2 mètres dans un bureau vide peut devenir inutilisable à 10 mètres dans un entrepôt rempli de rayonnages métalliques.

Notre règle d'or maintenant : tester dans l'environnement cible le plus tôt possible. Pas à la fin, pas avant la livraison — dès le prototype.

Sur un projet de tracking de palettes en entrepôt, on a découvert au bout de 3 mois que les tags BLE qu'on avait choisis étaient perturbés par les chariots élévateurs électriques. Toute l'architecture était à revoir. Si on avait testé sur site dès la semaine 2, on aurait économisé deux mois de développement.

Un bug de timezone sur Youdy a fait que les utilisateurs au Canada recevaient leurs rappels à 3h du mat. Leçon : toujours stocker en UTC, et convertir côté client uniquement à l'affichage. Ça paraît basique, mais quand vous avez des objets IoT dans 15 fuseaux horaires différents, cette rigueur devient vitale.

Flutter et IoT : notre stack de prédilection

Pour les projets cross-platform, Flutter s'est imposé comme notre choix par défaut. Avec Getaway, notre application voyage, on a choisi Flutter pour le cross-platform. Résultat : une seule codebase pour iOS et Android, et 60% de temps dev économisé.

Pour le BLE en Flutter, la librairie flutter_blue_plus est mature et bien maintenue. Elle gère correctement les permissions, le scan, la connexion et les notifications.

// Flutter - Connexion BLE et lecture de données
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

class IoTDeviceManager {
  BluetoothDevice? _device;
  
  Future<void> connectToDevice(String deviceId) async {
    final results = await FlutterBluePlus.startScan(
      timeout: Duration(seconds: 10),
    );
    
    _device = results
        .firstWhere((r) => r.device.id.toString() == deviceId)
        .device;
    
    await _device!.connect(autoConnect: false);
    
    final services = await _device!.discoverServices();
    for (var service in services) {
      for (var characteristic in service.characteristics) {
        if (characteristic.properties.notify) {
          await characteristic.setNotifyValue(true);
          characteristic.value.listen((data) {
            _handleSensorData(characteristic.uuid, data);
          });
        }
      }
    }
  }
  
  void _handleSensorData(Guid uuid, List<int> data) {
    // Parser les données selon le type de capteur
    // ...
  }
}

Pour MQTT, mqtt_client fait le travail côté Dart. On l'utilise généralement avec un backend qui agrège et filtre les données avant de les pousser vers l'app, plutôt que de connecter l'app directement au broker IoT.

Tester une application IoT : méthodologie

Tester une app IoT, c'est tester trois systèmes qui peuvent chacun être responsables d'un bug. Voici notre approche :

Tests unitaires : mocker les réponses BLE/MQTT pour tester la logique métier indépendamment du hardware.

Tests d'intégration : utiliser de vrais devices dans un environnement contrôlé. On garde une "box de test" au bureau avec un assortiment de capteurs et d'objets connectés.

Tests de charge : simuler des centaines de devices qui publient simultanément. On utilise des scripts Python avec paho-mqtt pour ça.

Tests de résilience : couper la connexion à des moments aléatoires, vider la batterie du device, rebooter le broker. Votre app doit survivre à tout ça gracieusement.

Tests terrain : absolument indispensables. Une journée sur site vaut 100 heures en labo.

FAQ : vos questions sur le développement IoT

Faut-il développer le firmware soi-même ou acheter des modules prêts à l'emploi ?

Ça dépend de votre volume. Pour moins de 1 000 unités, utilisez des modules existants (ESP32 avec firmware standard, Nordic avec SDK). Au-delà, le développement custom devient rentable pour optimiser les coûts et les fonctionnalités.

Comment gérer les mises à jour firmware à distance ?

L'OTA (Over-The-Air) est indispensable. La plupart des SDK modernes le supportent nativement. Côté app, prévoyez un écran de mise à jour avec barre de progression et gestion des erreurs. Ne laissez jamais un device dans un état incohérent.

Quelle autonomie batterie peut-on espérer ?

Avec du BLE bien optimisé (advertising toutes les 2 secondes, connexions courtes), on peut tenir 6 mois sur une pile bouton CR2032. Avec du Wi-Fi permanent, comptez plutôt quelques heures. Le LoRaWAN peut tenir plusieurs années sur batterie.

Comment gérer des milliers de devices en production ?

Utilisez une plateforme IoT managée (AWS IoT, Azure IoT Hub, Google Cloud IoT). Elles gèrent le provisioning, les certificats, les règles de routage et le monitoring à l'échelle. Ne réinventez pas la roue.

Conclusion : l'IoT, c'est 50% de software et 50% de terrain

Développer une application IoT, c'est accepter que le code parfait ne suffit pas. Les ondes radio, les batteries, les environnements physiques — tout ça échappe à votre contrôle. La clé, c'est d'anticiper les échecs et de concevoir des systèmes résilients.

Chez Eurus, on a appris à intégrer le hardware très tôt dans nos cycles de développement. Un MVP en 6 semaines max, avec un prototype physique fonctionnel dès la semaine 2. Au-delà, on perd le feedback terrain et on risque de construire quelque chose qui ne survit pas au monde réel.

Si vous avez un projet d'application connectée en tête, parlons-en. Que ce soit du Bluetooth pour de la domotique, du MQTT pour de l'industrie, ou un cas d'usage qu'on n'a pas encore rencontré — on aime les défis techniques.

Besoin d'accompagnement ?

Discutons de votre projet et voyons comment Eurus peut vous aider.

Nous contacter
Prendre RDV