Portfolio
CV
10 avr. 2026 Case Study

HeroLink : Hub Logistique IoT

Application desktop en C# pour automatiser la mesure et le pesage de colis via des capteurs laser et une balance connectée.

C#.NET 10AvaloniaUIIoTHardware
Représentation par IA de l'interface de HeroLink

Illustration générée par IA pour représenter le wireframe de l'interface, respectant le design réel

Le Défi

Dans la logistique e-commerce, saisir manuellement les dimensions et le poids des colis prend du temps et génère des erreurs de frappe, ce qui finit par coûter cher en surcharges d’expédition.

L’objectif de HeroLink était de créer une station “Plug-and-Play”. L’application gère 4 périphériques en simultané (1 balance + 3 lasers) pour récupérer les dimensions d’un colis dès qu’un code-barres est scanné, puis envoie les données à un ERP via une API.

Choix Techniques

Pourquoi .NET 10 & Avalonia UI ?

  • .NET 10 & C# : J’ai choisi C# car .NET 10 permet de profiter des dernières performances sur l’asynchrone et est un langage de confiance pour une utilisation sous Windows.
  • Avalonia UI : Choisi pour son moteur de rendu moderne et son système de styling flexible. Avalonia permet de rester ouvert au multiplateforme si besoin, et est la relève de WPF.

La Stack Matérielle

Tout repose sur System.IO.Ports pour la communication série (COM) :

  • Scale : Lecture de trames texte/hexa pour le poids.
  • Laser : Développement d’un parser pour extraire les distances depuis des trames binaires (ex: AA 00 00 20...).

Le Problème : Instabilité des ports série

Pendant les tests, la connexion avec la balance n’était pas stable. Après une dizaine de minutes, elle cessait de répondre. Cela bloquait parfois l’interface utilisateur, obligeant à redémarrer le logiciel.

La Solution : Gestion du multithread

Pour régler ça, j’ai revu la gestion des accès aux ports :

  • Thread-Safety : Utilisation de SemaphoreSlim pour éviter que deux tâches n’écrivent sur le port en même temps.
  • Découplage : La lecture des ports se fait sur des tâches de fond pour ne pas figer l’interface.
  • Auto-reconnect : Ajout d’une surveillance qui détecte si un capteur ne répond plus pour relancer la connexion automatiquement.

Zoom Technique : API

J’ai utilisé Refit pour transformer l’API en une interface C# simple à utiliser :

  • Sécurité : Injection de la clé d’API dans le pipeline HTTP.
  • Endpoints : Gestion des scans, du multi-colis et des points relais.

Ce que j’ai appris

  • Prise en main d’Avalonia : J’ai découvert ce framework, sa gestion des ressources et sa communauté.
  • UX de terrain : En entrepôt, chaque clic compte. J’ai configuré l’app pour qu’elle réagisse aux événements (scan, stabilisation du poids) afin de limiter au maximum les manipulations manuelles.

Rétrospective

Le projet a été déployé récemment, mais si je devais le refaire, j’essaierais d’isoler la gestion hardware dans un Service Windows (Background Worker) séparé. L’interface ne ferait que l’affichage, ce qui rendrait le système encore plus robuste en cas de crash de l’interface graphique.