Кроссплатформенная структура для связи встроенных устройств через локальную сеть и Интернет.

В настоящее время я работаю над проектом, в котором мы будем обмениваться данными между бытовым прибором (например, духовкой) со встроенным компьютером и мобильным устройством (телефоном). Вот краткий обзор настройки:

  • Встроенное устройство будет работать под управлением Java, скорее всего, на Android, но, возможно, на каком-то варианте Linux.
  • Мобильное устройство будет работать под управлением C# (через Xamarin) на iOS или Android.
  • Связь будет происходить через Интернет, когда пользователя нет дома, поэтому нам нужен какой-то прокси-сервер для маршрутизации сообщений между мобильным устройством и устройством (чтобы обойти брандмауэры NAT и т. д.). Я более или менее агностик к серверному языку/платформе
  • Однако, когда пользователь находится дома и подключен к своей сети Wi-Fi, мы хотели бы, чтобы связь между устройством и телефоном происходила напрямую через локальную сеть, на тот случай, если сервер по какой-либо причине недоступен. Я бы предположил, что это будет означать, что устройство должно действовать как сервер.
  • Встроенное устройство будет передавать на телефон «в режиме реального времени» (примерно каждые 1-5 секунд) обновления об определенных точках данных (например, о температуре). У нас может быть до нескольких тысяч клиентов, использующих прокси-сервер. Это в основном шаблон публикации/подписки
  • Телефон должен иметь возможность отправлять на устройство запросы о действиях (например, включение/выключение, установка температуры), а устройство должно иметь возможность отвечать сообщением об успехе/неуспехе. Это в основном шаблон RPC

Существуют ли какие-либо фреймворки, которые поддерживают связь в реальном времени через Интернет и локальную сеть, публикацию-подписку и RPC и работают как на Java, так и на C#? У меня есть несколько хороших кандидатов, но я особенно не вижу возможности использовать общие протоколы для связи через Интернет и для связи по локальной сети (возможно ли это вообще?). Мой текущий шорт-лист состоит из (по порядку):

  1. RabbitMQ — поддерживает все основные платформы, встроенную аутентификацию/SSL/PubSub/RPC, но я не вижу способа заставить два устройства общаться по локальной сети, если нет подключения к Интернету, если мы используем Android на стороне устройства.
  2. Платформа веб-сокетов, например SignalR, XSockets, AutoBahn или Socket.IO. Они либо не являются кросс-платформенными между .Net и Java (XSockets/AutoBahn), либо мы сталкиваемся с проблемой локальной сети, описанной выше (SignalR).
  3. ZeroMQ — это выглядит концептуально выполнимым, но выглядит довольно низкоуровневым и похоже, что вам придется изобретать велосипед совсем немного, чтобы запустить даже базовый PubSub с мониторингом сердцебиения.
  4. Выполнение одного из вышеперечисленных действий через Интернет и создание в домашних условиях некоторого протокола через необработанные сокеты для связи по локальной сети (немного запутанно, кажется, что это уже должно быть решенной проблемой)

XMPP также выглядит многообещающим, но из того, что я видел, сообщество и документация/примеры не кажутся надежными, я также читал, что производительность с XMPP не совсем в реальном времени.

Ответы (1)

Итак, на самом деле это не ответ (больше информации), но это слишком длинное поле для комментариев.

Звучит как интересный проект! Я могу говорить только за XSockets, но я уверен, что кто-то другой заполнит пробелы для других технологий.

Поскольку XSockets имеет «межпротокольную» связь и позволяет использовать пользовательские протоколы в качестве плагинов, связь может осуществляться между любыми устройствами, поддерживающими TCP/IP.

Скоро будет выпущена версия 4.0, которая будет поддерживать как pub/sub, так и rpc. Существуют клиенты для .NETMF, .NET 2.0, 3.5, 4.0 и iOS + Android (Xamarin), но благодаря функции кросс-протокола вы можете подключать необработанные сокеты для общения с этими клиентами, если хотите.

Я запускаю сервер XSockets дома на Raspberry Pi, и к нему подключены Arduino и Netduinos, а также клиент iOS (плюс веб-сайт и консольное приложение). Это работает хорошо, хотя это просто для удовольствия, а не настоящий продукт. Я просто проверяю температуру и движение в своем доме в качестве доказательства концепции.


Чтобы перейти к вашему вопросу/проблеме... Я бы выбрал структуру реального времени, а не варианты MQ. Большинство вещей выше было бы довольно просто с хорошей структурой. Единственный вопрос - это локальная сеть. У меня нет опыта в этом, но это должно быть выполнимо, особенно если у вас есть сервер реального времени в локальной сети, который берет на себя управление, когда устройство возвращается домой.

В любом случае, звучит как забавный проект. Удачи!

Очень интересно! Я только что видел ваши видео на Youtube по пользовательским протоколам. Как вы думаете, сколько работы потребуется, чтобы добавить авторизацию и пульсацию для пользовательского протокола? Сможете ли вы сохранить потрясающе выглядящее состояние, если мы будем использовать собственный протокол из Java?
Привет. Да, протокол будет просто уровнем соединения. При необходимости добавьте в протокол правильное «рукопожатие». После этого у вас есть состояние на контроллере, как и у всех остальных протоколов. Какой язык вы используете для общения, не имеет значения.
Ооо.. Я не ответил на все это. Сердцебиение встроено в пинг/понг (кадры). Не думайте, что это займет много времени, когда вы разберетесь с XSockets. Особенно, если вы будете следовать модели сообщений XSockets, это будет легко. Если вы создадите свою собственную модель, это все равно будет выполнимо, но займет больше времени.