Android-устройство должно быть подключено к серверу — C2DM, опрос или что-то третье?

#android #connection #android-c2dm #mqtt

#Android #подключение #android-c2dm #mqtt

Вопрос:

В настоящее время я нахожусь в процессе разработки приложения, которое имеет некоторые очень высокие требования.

Проект

Требуется приложение, которое может взаимодействовать с сервером. В приложение должны быть отправлены небольшие сообщения, которые могут отображать уведомление или запускать действие.

Требования

Клиент должен быть уверен, что телефон всегда «подключен».

Клиент ожидает, что приложение сможет определить, когда оно больше не подключено (или не может подключиться) к серверу, о котором оно сообщает пользователю.

Клиент должен иметь возможность отправлять сообщения на отдельные устройства

Если клиенту необходимо передать сообщение на подключенные устройства и на отдельные устройства.

Мои мысли (или проблемы)

В настоящее время приложение опрашивает сервер http-запросом раз в минуту — если приложение не может подключиться к серверу, пользователь получает уведомление. Опрос может определить, какое устройство вызывает, и сообщить ему, есть ли у него сообщение для него.

Но…

IMO это ужасный дизайн — он генерирует много избыточного трафика, использует ресурсы, в которых, вероятно, не было необходимости, и создает множество проблем с подключением (которые я не уверен, что когда-нибудь преодолею, независимо от того, какой метод используется).

Мне нужен ваш опыт, чтобы выбрать правильное решение для моего проекта.

Я думал о C2DM, но я не уверен, что это может удовлетворить мои потребности? Является ли опрос моим единственным реальным решением? Есть ли третий вариант, о котором я не думал?

Ответ №1:

Я наткнулся на новую службу под названием Parse.com похоже, они предлагают функциональность для простой push-реализации для Android с использованием их серверной части. Это коммерческое, но у них тоже есть бесплатный тариф.

Если вы хотите создать свою собственную реализацию, похоже, есть много статей об использовании MQTT, который предназначен для устройств с низким энергопотреблением. Но я еще не видел готовых к использованию реализаций этого.

Ответ №2:

Я бы счел MQTT хорошим решением, хотя это то, с чем я больше всего знаком. Отказ от ответственности — я пишу брокер MQTT с открытым исходным кодом. Вы могли бы достичь того, что, я думаю, вы хотите, вот так:

Где-то работает брокер MQTT. Служба по телефону подключается к брокеру и подписывается на уникальную тему, например, device/23412364, где 23412364 — это уникальный идентификатор для каждого устройства, который ниже называется <идентификатор телефона>. Когда ваш клиент хочет отправить сообщение на определенный телефон, сообщение отправляется на устройство /<идентификатор телефона>. Если вы хотите, чтобы сообщения отправлялись на все телефоны, то телефоны также могут подписаться на device / all, например.

Если вы настроите качество обслуживания своих подписок и сообщений на 1 или 2 и установите для параметра «чистый сеанс» для клиентов значение false, то сообщения будут помещены в очередь на брокере, если телефон отключится по какой-либо причине. QoS = 1 означает «хотя бы один раз», а QoS = 2 означает «ровно один раз». При повторном подключении телефона эти сообщения будут доставлены.

Вы также можете попросить телефон отправить сообщение типа «регистрация <идентификатор телефона>» в фиксированную тему сразу после ее подключения (например, тема «регистрация»). Очень полезной функцией MQTT является «Последняя воля и завещание». Когда вы подключаете клиента, у вас есть возможность указать сообщение Will и тему, по которой оно должно быть доставлено, в случае, если клиент неожиданно отключается (т. Е. не сообщая брокеру, что он собирается отключиться). Таким образом, вы могли бы установить, что сообщение будет «отменить регистрацию <идентификатор телефона>» и будет доставлено в ту же фиксированную тему, что и выше («регистрация» в этом примере). Затем у вас может быть другой клиент MQTT на стороне сервера, подписанный на «register». Когда телефон подключается, он отправляет сообщение «регистрация <идентификатор телефона>», когда он отключается, брокер отправляет «отменить регистрацию <идентификатор телефона>». Таким образом, клиент MQTT может отслеживать подключенных клиентов на стороне сервера.

На конце телефона вы можете получить уведомление, если TCP-соединение прерывается через обычный сетевой код.

Некоторые соответствующие ссылки:

Комментарии:

1. Спасибо за отличный пост со ссылками на дополнительную информацию о MQTT. Я принял ваш ответ за подробное описание, которое позволило мне продвигаться вместе с моим развитием.