Marco multiplataforma para la comunicación de dispositivos integrados a través de LAN e Internet

Actualmente estoy en un proyecto en el que nos comunicaremos entre un electrodoméstico (por ejemplo, un horno) con una computadora integrada y un dispositivo móvil (teléfono). He aquí un breve resumen de la configuración:

  • El dispositivo integrado ejecutará Java, probablemente en Android, pero posiblemente alguna variante de Linux
  • El dispositivo móvil ejecutará C# (a través de Xamarin) en iOS o Android.
  • La comunicación se producirá a través de Internet cuando el usuario no esté en casa, por lo que necesitamos algún tipo de servidor proxy para enrutar los mensajes entre el dispositivo móvil y el dispositivo (para eludir los cortafuegos NAT, etc.). Soy más o menos agnóstico al lenguaje/plataforma del servidor
  • Sin embargo, cuando el usuario está en casa y conectado a su red Wi-Fi, nos gustaría que la comunicación se produzca directamente entre el dispositivo y el teléfono a través de la LAN, en caso de que no se pueda acceder al servidor por algún motivo. Me imagino que esto significaría que el dispositivo tiene que actuar como servidor.
  • El dispositivo incorporado le dará al teléfono actualizaciones en "tiempo real" (aproximadamente cada 1 a 5 segundos) sobre ciertos puntos de datos (por ejemplo, la temperatura). Es posible que tengamos hasta unos pocos miles de clientes accediendo al servidor proxy. Esto es básicamente un patrón de publicación/suscripción
  • El teléfono debe poder enviar solicitudes de acción al dispositivo (p. ej., encender/apagar, configurar la temperatura), y el dispositivo debe poder responder con un mensaje de éxito/fallo. Esto es básicamente un patrón RPC

¿Existen marcos que admitan comunicación en tiempo real a través de Internet y LAN, publicación-suscripción y RPC, y que se ejecuten tanto en Java como en C#? Tengo algunos buenos candidatos, pero especialmente no veo forma de compartir protocolos entre la comunicación a través de Internet y la comunicación a través de LAN (¿es esto posible?). Mi lista actual consta de (en orden):

  1. RabbitMQ: admite todas las plataformas principales, autenticación/SSL/PubSub/RPC integrado, pero no veo ninguna forma de hacer que los dos dispositivos hablen a través de una LAN si no hay conexión a Internet si estamos ejecutando el dispositivo Android.
  2. Un marco websocket como SignalR, XSockets, AutoBahn o Socket.IO. Estos no son multiplataforma entre .Net y Java (XSockets/AutoBahn) o nos encontramos con el problema de LAN anterior (SignalR)
  3. ZeroMQ: esto parece conceptualmente factible, pero parece de un nivel bastante bajo y parece que tienes que reinventar un poco la rueda para que incluso PubSub básico con monitoreo de latidos funcione.
  4. Haciendo uno de los anteriores a través de Internet y elaborando en casa algún protocolo sobre sockets sin formato para la comunicación a través de la LAN (un poco desordenado, parece que este ya debería ser un problema resuelto)

XMPP también parece que podría ser prometedor, pero por lo que he visto en la comunidad y la documentación/los ejemplos no parecen sólidos, también he leído que el rendimiento con XMPP no es del todo en tiempo real.

Respuestas (1)

Entonces, esta no es realmente una respuesta (más información), pero es demasiado para el campo de comentarios.

¡Suena como un proyecto divertido! Solo puedo hablar por XSockets, pero estoy seguro de que alguien más llenará los espacios en blanco para los demás técnicos.

Dado que XSockets tiene comunicación de "protocolo cruzado" y permite protocolos personalizados como complementos, la comunicación se puede realizar entre cualquier dispositivo que tenga TCP/IP.

La V 4.0 está a punto de ser lanzada pronto y admitirá pub/sub así como también rpc. Hay clientes para .NETMF, .NET 2.0, 3.5, 4.0 e iOS + Android (Xamarin), pero debido a la función de protocolo cruzado, puede conectar sockets sin procesar para hablar con estos clientes si lo desea.

Ejecuto el servidor XSockets en casa en una raspberry pi y tengo Arduino y Netduinos conectados, así como un cliente iOS (además de un sitio web y una aplicación de consola). Funciona bien a pesar de que es solo por diversión y no es un producto real. Acabo de comprobar la temperatura y el movimiento en mi casa como prueba de concepto.


Para llegar a su pregunta/problema... elegiría un marco en tiempo real, no las opciones de MQ. La mayoría de las cosas anteriores serían bastante sencillas con un buen marco. La única pregunta es la LAN. No tengo experiencia en intentarlo, pero debería ser factible, especialmente si puede tener un servidor en tiempo real en la LAN que se hace cargo cuando el dispositivo llega a casa.

De todos modos, suena como un proyecto divertido. ¡La mejor de las suertes!

¡Muy interesante! Acabo de ver sus videos de Youtube sobre protocolos personalizados. ¿Cuánto trabajo cree que sería agregar autorización y latidos para un protocolo personalizado? ¿Puedes mantener el estado de aspecto impresionante si usamos un protocolo personalizado de Java?
Hola, sí, el protocolo sería solo la capa de conexión. Agregue un "apretón de manos" adecuado al protocolo si es necesario. Después de eso, tiene estado en el controlador como todos los demás protocolos. No importa el idioma que uses para comunicarte.
Ohh.. No respondí todo. Heartbeats está integrado con ping/pong (fotogramas). No crea que tomará mucho tiempo cuando sepa manejar XSockets. Especialmente si sigue el modelo de mensaje de XSockets, será fácil. Si construye su propio modelo, aún será factible, pero llevará más tiempo.