Plattformübergreifendes Framework für eingebettete Gerätekommunikation über LAN und Internet

Ich arbeite derzeit an einem Projekt, bei dem wir zwischen einem Haushaltsgerät (z. B. einem Ofen) mit einem eingebetteten Computer und einem mobilen Gerät (Telefon) kommunizieren werden. Hier ist eine kurze Zusammenfassung der Einrichtung:

  • Das eingebettete Gerät wird Java ausführen, muss wahrscheinlich auf Android, aber möglicherweise auf einer Variante von Linux laufen
  • Auf dem mobilen Gerät wird C# (über Xamarin) unter iOS oder Android ausgeführt.
  • Die Kommunikation erfolgt über das Internet, wenn der Benutzer nicht zu Hause ist, daher benötigen wir eine Art Proxy-Server, um die Nachrichten zwischen dem Mobilgerät und der Appliance weiterzuleiten (um NAT-Firewalls usw. zu umgehen). Ich bin mehr oder weniger agnostisch gegenüber der Serversprache/Plattform
  • Wenn der Benutzer jedoch zu Hause und mit seinem WLAN-Netzwerk verbunden ist, möchten wir, dass die Kommunikation direkt zwischen dem Gerät und dem Telefon über das LAN erfolgt, nur für den Fall, dass der Server aus irgendeinem Grund nicht erreichbar ist. Ich würde mir vorstellen, dass dies bedeuten würde, dass die Appliance als Server fungieren muss.
  • Das eingebettete Gerät gibt dem Telefon "Echtzeit" (etwa alle 1-5 Sekunden) Aktualisierungen über bestimmte Datenpunkte (z. B. Temperatur). Wir können bis zu ein paar tausend Clients haben, die auf den Proxy-Server zugreifen. Dies ist im Grunde ein Publish/Subscribe-Muster
  • Das Telefon sollte in der Lage sein, Aktionsanforderungen an das Gerät zu senden (z. B. Ein-/Ausschalten, Temperatur einstellen), und das Gerät sollte in der Lage sein, mit einer Erfolgs-/Fehlermeldung zu antworten. Dies ist im Grunde ein RPC-Muster

Gibt es Frameworks, die Echtzeitkommunikation über das Internet und LAN, Publish-Subscribe und RPC unterstützen und sowohl auf Java als auch auf C# laufen? Ich habe ein paar gute Kandidaten, aber ich sehe insbesondere keine Möglichkeit, Protokolle zwischen der Kommunikation über das Internet und der Kommunikation über das LAN zu teilen (ist das überhaupt möglich?). Meine aktuelle Shortlist besteht aus (in der Reihenfolge):

  1. RabbitMQ – Unterstützt alle wichtigen Plattformen, Authentifizierung/SSL/PubSub/RPC integriert, aber ich sehe keine Möglichkeit, die beiden Geräte dazu zu bringen, über ein LAN zu kommunizieren, wenn keine Internetverbindung besteht, wenn wir auf der Seite der Android-Appliance laufen
  2. Ein Websocket-Framework wie SignalR, XSockets, AutoBahn oder Socket.IO. Diese sind entweder nicht plattformübergreifend zwischen .Net und Java (XSockets/AutoBahn) oder wir stoßen auf das obige LAN-Problem (SignalR)
  3. ZeroMQ - das sieht konzeptionell machbar aus, aber es sieht ziemlich niedrig aus und es sieht so aus, als müsste man das Rad ziemlich neu erfinden, um selbst einfaches PubSub mit Heartbeat-Überwachung zum Laufen zu bringen.
  4. Einen der oben genannten Schritte über das Internet ausführen und ein Protokoll über Raw-Sockets für die Kommunikation über das LAN selbst erstellen (ein wenig chaotisch, scheint so, als ob dies bereits ein gelöstes Problem sein sollte)

XMPP sieht auch so aus, als könnte es vielversprechend sein, aber von dem, was ich gesehen habe, scheinen die Community und die Dokumentation/Beispiele nicht robust zu sein, ich habe auch gelesen, dass die Leistung mit XMPP nicht ganz in Echtzeit ist.

Antworten (1)

Das ist also nicht wirklich eine Antwort (mehr Informationen), aber es ist zu lang für das Kommentarfeld.

Klingt nach einem lustigen Projekt! Ich kann nur für XSockets sprechen, aber ich bin sicher, dass jemand anderes die Lücken für die anderen Techniker füllen wird.

Da XSockets über eine "protokollübergreifende" Kommunikation verfügt und benutzerdefinierte Protokolle als Plugins zulässt, kann die Kommunikation zwischen allen Geräten mit TCP/IP erfolgen.

V 4.0 steht kurz vor der Veröffentlichung und wird sowohl Pub/Sub als auch RPC unterstützen. Es gibt Clients für .NETMF, .NET 2.0, 3.5, 4.0 und iOS + Android (Xamarin), aber aufgrund der Cross-Protocol-Funktion können Sie Raw-Sockets verbinden, um mit diesen Clients zu kommunizieren, wenn Sie möchten.

Ich betreibe den XSockets-Server zu Hause auf einem Himbeer-Pi und habe sowohl Arduino und Netduinos als auch einen iOS-Client (plus eine Website und eine Konsolen-App) damit verbunden. Es funktioniert gut, obwohl es nur zum Spaß und kein echtes Produkt ist. Ich überprüfe nur Temperatur und Bewegung in meinem Haus als Proof of Concept.


Um zu Ihrer Frage / Ihrem Problem zu kommen ... Ich würde mich für ein Echtzeit-Framework entscheiden, nicht für die MQ-Optionen. Die meisten oben genannten Dinge wären mit einem guten Framework ziemlich einfach. Die einzige Frage ist die LAN-Sache. Ich habe keine Erfahrung damit, aber es sollte machbar sein, besonders wenn Sie einen Echtzeitserver im LAN haben können, der übernimmt, wenn das Gerät nach Hause kommt.

Wie auch immer, klingt nach einem lustigen Projekt. Viel Glück!

Sehr interessant! Ich habe gerade Ihre Youtube-Videos zu benutzerdefinierten Protokollen gesehen. Wie viel Arbeit wäre es Ihrer Meinung nach, Autorisierung und Heartbeats für ein benutzerdefiniertes Protokoll hinzuzufügen? Können Sie die fantastisch aussehende Statefulness beibehalten, wenn wir ein benutzerdefiniertes Protokoll von Java verwenden?
Hallo, ja, das Protokoll wäre nur die Verbindungsschicht. Fügen Sie dem Protokoll bei Bedarf den richtigen "Handshake" hinzu. Danach müssen Sie auf dem Controller wie alle anderen Protokolle angeben. Welche Sprache Sie zur Kommunikation verwenden, spielt keine Rolle.
Ohh.. Ich habe nicht alles beantwortet. Heartbeats ist in Ping/Pong (Frames) integriert. Glauben Sie nicht, dass es viel Zeit in Anspruch nehmen würde, wenn Sie sich mit XSockets auskennen. Besonders wenn Sie dem Nachrichtenmodell von XSockets folgen, wird es einfach sein. Wenn Sie Ihr eigenes Modell bauen, wird es immer noch machbar sein, aber mehr Zeit in Anspruch nehmen.