Есть у меня сервер (Spring), и есть куча устройств (Rasbery PI - там приложение на чистой Java). Устройства шлют данные на сервер, с этим проблем нет.
Но надо :
1. Проверять онлайн устройство или нет.
2. Периодически передавать команды с сервера на конкретное устройство (зашифрованно). Как такое сделать (вариант когда устройство делает запрос и проверяет нет ли для него команд не подходит)?
На ум приходит XMPP (с ним не работал), AMPQ, но я его юзал лишь для очередей - предназначен ли он для такой задачи? Есть что то специальное для таких задач?
Стоит отметить что команды от сервера на устройства очень редки: от раз в час до раз в сутки.
А вообще вопроса не понимаю, тут же всё просто. Надо либо инициировать коннекты с сервера к приложению на устройстве, либо действительно предлагать устройству самому часто опрашивать сервер (особенно если оно не в прямой видимости), причём если задержки между poll критичны - держать постоянный коннект.
mitaichik, ну и что, что не веб-приложение! На сервере запустите службу веб-сокетов, а на клиентах просто коннектитесь к серверу и общайтесь. Библиотеку можно использовать okhttp навпимер.
Сергей Горностаев, Можно и сокеты использовать, а поверх них придумать свой велосипед из протокола, авторизации, терминации и возобновления сессии, передачи параметров, аргументов, вызова процедур.
Вот зачем вам все вот это?! Берете и разворачиваете REST сервис, используете и на клиенте и на сервере стандартный обмен.
На самом деле, это так кажется, "вот как возьму сокет, как буду туда писать и читать", а потом возникает понимание, что кроме борьбы с таймаутами, возобновлением и прочей шелухой, вам еще нужно кучу всего сделать. И учтите, что все вот это "свое" придется поддерживать с двух сторон при любом изменении, на клиенте и на сервере!
А так есть уже отлаженный протокол http, отлаженные сервера и фреймворки, держащие по 10к+ соединений одновременно, есть отлаженные клиенты для этих протоколов с кучей возможностей - бери и пользуй, гоняй свои данные.
Да, XMPP хорош, AMQP еще лучше. Но эти протоколы хороши, когда у нас связи не один ко многим, а многие ко многим, когда клиенты через эти протоколы обмениваются между собой через общий сервер сообщений.
По мне, HTTP гораздо приятнее именно в вашей ситуации, развернуть и запустить можно все буквально в течении одного рабочего дня, с отладкой, шлюхами и преферансом.
Приконнектился клиент, сервер отдал ему все что для него нужно из накопленного в очереди, и сиди ожидай следующей команды на этом же соединении. Отвалился по таймайту через минут 10-20, переконнектился заново. Done!
PS. И да, я знаю о чем говорю, начиная от MODBUS и заканчивая тем же самым ZeroMQ, опыт за 20 с небольшим лет по протоколам - огромный.
Как это не веб, если оно работает в веб? Лол. Веб сокеты решают именно вашу задачу — двухсторонняя связь клиент <-> сервер с поддержкой SSL. Кроме того, пакеты данных при передаче шифруются (обычный XOR по ключу). И это все работает из коробки.