Aufbau einer industriellen IoT-Plattform mit .NET und Azure
06.02.2026
Über fünf Jahre bei HUSS B.V. habe ich eine industrielle IoT-Plattform entworfen und aufgebaut, die Daten von Fertigungsanlagen erfasst, nahezu in Echtzeit verarbeitet und über Berichts-Dashboards darstellt. Was als Prototyp begann, wuchs zu einem Produktionssystem, das mehrere Fertigungskunden bedient. Hier ist, was ich dabei gelernt habe.
Wie sieht eine industrielle IoT-Plattform aus?
Eine industrielle IoT-Plattform verbindet physische Maschinen auf einer Fabriketage mit Software, die deren Daten nutzbar macht. Im Kern ist es eine Pipeline: Geräte erzeugen Telemetriedaten, diese werden aufgenommen und verarbeitet, dann gespeichert und visualisiert. Das Ziel ist es, Fertigungsbetreibern und Managern Einblick in die Anlagenleistung, Produktionsleistung und Anomalien zu geben - ohne dass sie die Halle begehen müssen.
Unsere Plattform bei HUSS folgte einer Schichtenarchitektur:
- Geräteebene - SPSen und Sensoren an Fertigungsanlagen, die Daten per MQTT oder HTTP senden
- Aufnahmeebene - Azure-gehostete Endpunkte, die Telemetriedaten empfangen und Authentifizierung sowie Drosselung behandeln
- Verarbeitungsebene - .NET Core-Worker, die eingehende Daten normalisieren, validieren und anreichern
- Speicherebene - SQL Server für strukturierte Telemetrie- und Metadaten
- Dashboard-Ebene - Blazor Server-Anwendung mit Echtzeit- und historischen Berichtsansichten
Jede Schicht war unabhängig deploybar. Diese Trennung war nicht von Tag eins an vorhanden - sie entstand nach dem ersten Jahr, als wir erkannten, dass die enge Kopplung von Aufnahme und Verarbeitung bei Spitzenlasten Engpässe verursachte.
Die richtigen Azure-Dienste für IoT auswählen
Die Wahl der richtigen Aufnahme- und Messaging-Dienste war eine der frühesten - und folgenreichsten - Entscheidungen. Azure bietet mehrere Optionen, und die Kompromisse sind nicht immer offensichtlich, bis man mitten im Produktionsverkehr steckt.
So haben wir sie bewertet:
| Dienst | Stärken | Einschränkungen | Unsere Entscheidung |
|---|---|---|---|
| Azure IoT Hub | Geräteverwaltung, geräteindividuelle Authentifizierung, Twin State, Cloud-zu-Gerät-Kommunikation | Höhere Kosten bei Skalierung, Komplexität für reine Telemetrieszenarien | Verwendet für Geräte, die bidirektionale Kommunikation benötigen |
| Azure Event Hubs | Hoher Durchsatz, einfaches Producer-Modell, kosteneffektiv für reine Telemetrieströme | Keine Geräteverwaltung, keine Cloud-zu-Gerät-Kommunikation | Primärer Aufnahmepfad für Hochvolumen-Telemetrie |
| Eigene REST-Endpunkte | Volle Kontrolle, einfach zu debuggen, passt zu bestehender Geräte-Firmware | Sie tragen die Verantwortung für Zuverlässigkeit, Skalierung und Gegendruck vollständig | Verwendet für ältere Geräte mit reiner HTTP-Firmware |
Wir landeten bei einer Hybridlösung. Event Hubs übernahm den Großteil der Telemetrieaufnahme, weil die meisten unserer Geräte nur Daten nach oben senden mussten. IoT Hub war für Geräte reserviert, bei denen wir Firmware-Updates oder Remote-Konfiguration brauchten. Eine Handvoll älterer Maschinen konnte nur einfache HTTP-POST-Anfragen senden, daher betrieben wir eine kleine .NET Core-API als Zwischenschicht vor Event Hubs für diese Geräte.
Die Lektion: Greifen Sie nicht automatisch zum funktionsreichsten Dienst. Passen Sie den Dienst an die Gerätefähigkeit und das Kommunikationsmuster an.
Warum Blazor für das Dashboard
Wir haben uns für Blazor Server für das Berichts-Dashboard entschieden, weil es uns ermöglichte, eine reichhaltige, interaktive Benutzeroberfläche zu bauen und dabei den gesamten Stack in C# und .NET zu halten. Für ein kleines Team - manchmal nur ich allein - war diese Konsistenz wichtiger als jeder Framework-Benchmark.
Blazor Server funktionierte für unseren Anwendungsfall besonders gut, weil:
- Echtzeit-Updates über SignalR quasi kostenlos mitgeliefert wurden. Wenn neue Telemetriedaten eintrafen, spiegelten die Dashboards sie innerhalb von Sekunden wider, ohne Polling.
- Serverseitiges Rendering bedeutete, dass wir keine APIs für das Frontend bereitstellen mussten. Das Dashboard fragte die Datenbank direkt über Services ab.
- Geteilte Modelle zwischen der Backend-Verarbeitungspipeline und dem Dashboard eliminierten eine ganze Klasse von Serialisierungsfehlern.
Der Kompromiss war Latenzempfindlichkeit. Blazor Server erfordert eine persistente WebSocket-Verbindung, und wenn das Netzwerk des Benutzers kurz aussetzte, fror die Benutzeroberfläche ein. Für Kiosk-Terminals in der Fabrik über kabelgebundenes Ethernet war das in Ordnung. Für Manager, die Dashboards aus dem Hotel-WLAN abrufen - weniger. Wir haben das mit Reconnection-Logik und einem Ladezustand abgemildert, der ehrlich kommunizierte, was gerade passierte.
Würde ich Blazor heute wieder wählen? Für ein internes oder B2B-Dashboard mit bekannter Benutzergruppe, ja. Für ein öffentliches Verbraucherprodukt würde ich eine entkoppelte SPA genauer prüfen.
Umgang mit unzuverlässiger Gerätekonnektivität
Fertigungsumgebungen sind feindlich gegenüber Netzwerkverbindungen. Metallgehäuse, elektromagnetische Störungen durch schwere Maschinen und Anlagen, in denen das Verlegen neuer Kabel ein sechsmonatiger Beschaffungsprozess ist. Die Auslegung auf intermittierende Konnektivität war nicht optional - sie war die Grundannahme.
Unser Ansatz hatte drei Säulen:
- Lokale Pufferung auf Geräten. Jeder Geräteagent speicherte Telemetriedaten lokal und leitete sie weiter, wenn die Konnektivität wiederhergestellt war. Nachrichten enthielten Zeitstempel von der Geräteuhr, sodass verspätete Daten in das richtige Zeitfenster eingeordnet wurden.
- Idempotente Aufnahme. Jede Telemetrienachricht trug eine eindeutige ID. Die Aufnahmeschicht deduplizierte beim Einfügen, sodass wiederholte Nachrichten von sich neu verbindenden Geräten keine Aggregate verfälschten.
- Gesundheitsüberwachung mit Abwesenheitserkennung. Anstatt nur bei fehlerhaften Daten zu alarmieren, alarmierten wir bei fehlenden Daten. Wenn ein Gerät, das normalerweise alle 30 Sekunden meldet, 5 Minuten lang schwieg, löste das eine Untersuchung aus.
Die Abwesenheitserkennung erwies sich als wertvoller als jede Anomalieerkennung auf den Daten selbst. Eine Maschine, die seltsame Zahlen produziert, ist besorgniserregend. Eine Maschine, die keine Zahlen produziert, bedeutet normalerweise, dass tatsächlich etwas nicht stimmt.
Warum SQL Server für Zeitreihendaten
Das ist die Entscheidung, die die meisten Augenbrauen hochzieht. Zeitreihendatenbanken wie InfluxDB oder TimescaleDB existieren genau für diese Art von Workload. Wir haben uns trotzdem für SQL Server entschieden, weil er bereits im Stack war, das Team ihn gut kannte und er für unsere Datenmengen mehr als ausreichend performte.
Unser Telemetrievolumen lag bei zehn Millionen Zeilen pro Monat - signifikant, aber nicht enorm nach Zeitreihenstandards. Mit korrekter Indizierung, Tabellenpartitionierung nach Datum und einem geplanten Job, der Rohdaten in stündliche und tägliche Aggregate zusammenfasste, bewältigte SQL Server Abfragen über Monate von Daten in unter einer Sekunde.
Die praktischen Vorteile waren real:
- Vertrautes Tooling. Entity Framework Core, SQL Server Management Studio und gut verstandene Backup- und Wiederherstellungsverfahren.
- Joins über Domänen hinweg. Telemetriedaten neben Gerätemetadaten, Kundenkonfiguration und Benutzereinstellungen in derselben Datenbank - keine systemübergreifenden Abfragen.
- Betriebliche Einfachheit. Eine Datenbank-Engine zum Überwachen, Patchen und Tunen statt zwei.
Hätte unser Volumen 10x höher gelegen oder hätten wir Abfragen unter einer Sekunde über Jahre von Rohdaten benötigt, wäre ein dedizierter Zeitreihenspeicher die richtige Wahl gewesen. Kennen Sie Ihre Datenmengen, bevor Sie zu spezialisierter Infrastruktur greifen.
Skalierung vom Prototyp zur Produktion
Der Prototyp war ein einzelner Azure App Service, der alles ausführte - Aufnahme, Verarbeitung, Speicherzugriff und das Dashboard. Er funktionierte für drei Geräte. Für dreißig funktionierte er nicht.
Die größten Änderungen vom Prototyp zur Produktion betrafen nicht den Code - sie betrafen den Betrieb. Im Einzelnen:
- Infrastructure-as-Code mit ARM Templates ersetzte die manuelle Konfiguration über das Azure-Portal. Jede Umgebung - Entwicklung, Staging, Produktion - war aus einem Template reproduzierbar. Kein „bei mir funktioniert es” mehr, wenn die Antwort eine fehlende App-Einstellung war.
- CI/CD-Pipelines in Azure DevOps automatisierten Build, Test und Deployment. Pull-Request-Builds fingen Probleme ab, bevor sie eine gemeinsame Umgebung erreichten. Release-Pipelines beförderten durch Stufen mit Freigabetoren.
- Strukturiertes Logging und Application Insights ersetzten Debugging im Stil von console.log. Wenn die Daten eines Geräts nicht mehr in den Dashboards erschienen, konnten wir den vollständigen Pfad von der Aufnahme über die Verarbeitung bis zur Speicherung nachverfolgen und genau finden, wo er abbrach.
- Getrennte Skalierung für Aufnahme und Dashboard. Die Aufnahme-Worker skalierten basierend auf dem Event Hub-Partition-Lag. Das Blazor-Dashboard skalierte basierend auf aktiven WebSocket-Verbindungen. Sie hatten völlig unterschiedliche Lastmuster und brauchten unabhängige Skalierungsregeln.
Das Einrichten dieser betrieblichen Grundlage kostete echte Zeit - Wochen, nicht Tage. Aber jede investierte Stunde zahlte sich zehnfach aus, wenn um 2 Uhr nachts etwas schiefging und das Monitoring uns genau sagte, was und wo.
Erkenntnisse aus fünf Jahren
Fünf Jahre an einer einzigen Plattform lehren Sie Dinge, die kein Greenfield-Projekt vermitteln kann:
- Schemamigrationen auf aktiven Telemetrietabellen sind beängstigend. Planen Sie Ihr Datenmodell von Tag eins an mit Erweiterbarkeit. Wir haben früh eine JSON-Metadatenspalte hinzugefügt, die uns Dutzende von Schemaänderungen ersparte.
- Geräte-Firmware ist am schwierigsten zu aktualisieren. Ihr Cloud-Code kann in Minuten deployt werden. Firmware auf einer Maschine in einer Fabrik hinter der Firewall eines Kunden kann Wochen für den Rollout brauchen. Entwerfen Sie Ihr Protokoll so, dass es immer abwärtskompatibel ist.
- Monitoring ist ein Feature, kein Overhead. Die Dashboards, die wir für die Maschinen unserer Kunden gebaut haben? Wir brauchten dasselbe für die Gesundheit unserer eigenen Plattform. Behandeln Sie Observability als erstklassige Produktanforderung.
- Starten Sie mit weniger Azure-Diensten. Jeder verwaltete Dienst fügt einen Rechnungsposten, einen Fehlermodus und etwas zu Lernendes hinzu. Fügen Sie Komplexität nur hinzu, wenn ein konkretes Problem es erfordert.
Häufig gestellte Fragen
Welche Programmiersprache eignet sich am besten für industrielle IoT-Plattformen?
C# mit .NET Core ist eine starke Wahl für industrielle IoT-Plattformen aufgrund seiner Leistung, starken Typisierung und tiefen Integration mit Azure-Diensten. Das Ökosystem bietet Bibliotheken für MQTT, HTTP und Message-Queue-Protokolle von Haus aus. Allerdings ist die beste Sprache diejenige, für die Ihr Team Personal finden und die es langfristig warten kann - Python und Go sind in diesem Bereich ebenfalls verbreitet.
Wie behandelt man Zeitreihendaten ohne eine Zeitreihendatenbank?
SQL Server kann Zeitreihen-Workloads bei moderatem Volumen - zehn Millionen Zeilen pro Monat - effektiv bewältigen, mit korrekter Tabellenpartitionierung, datumsbasierter Indizierung und vorberechneten Aggregationstabellen. Der Schlüssel liegt in der Trennung von Rohdatenaufbewahrung und Berichtsabfragen. Rohdaten werden in stündliche und tägliche Aggregate zusammengefasst, und die meisten Dashboard-Abfragen treffen die Aggregattabellen statt die rohe Telemetrie zu durchsuchen.
Ist Blazor geeignet für Echtzeit-IoT-Dashboards?
Blazor Server ist gut geeignet für Echtzeit-IoT-Dashboards in kontrollierten Netzwerkumgebungen. Die eingebaute SignalR-Verbindung ermöglicht Push-Updates ohne Polling, und da das Rendering serverseitig stattfindet, hat das Dashboard direkten Zugriff auf Backend-Daten ohne eine API-Schicht. Die Haupteinschränkung ist die Abhängigkeit von einer stabilen WebSocket-Verbindung, was es weniger ideal für unzuverlässige Mobilfunknetze macht.
Welche Azure-Dienste braucht man für eine IoT-Plattform?
Eine minimale Azure-IoT-Plattform benötigt einen Aufnahmedienst - Event Hubs für reine Telemetrie oder IoT Hub für bidirektionale Kommunikation - eine Compute-Schicht wie App Service oder Azure Functions für die Verarbeitung, eine Datenbank zur Speicherung und Application Insights zur Überwachung. Starten Sie mit diesen vier Bausteinen und fügen Sie Dienste wie Stream Analytics oder Time Series Insights erst hinzu, wenn eine spezifische Anforderung die zusätzliche Komplexität und Kosten rechtfertigt.
Wie stellt man Datenzuverlässigkeit bei unzuverlässigen Fabriknetzwerkverbindungen sicher?
Zuverlässigkeit in Fabrikumgebungen erfordert eine dreiteilige Strategie: lokale Pufferung auf dem Gerät, damit Daten Konnektivitätsausfälle überstehen, idempotente Aufnahme auf dem Server, damit doppelte Nachrichten von Neuverbindungen harmlos sind, und abwesenheitsbasiertes Monitoring, das alarmiert, wenn erwartete Daten ausbleiben. Der geräteseitige Puffer ist das kritischste Element - kein noch so gutes Cloud-Engineering kann Daten wiederherstellen, die nie lokal gespeichert wurden.