2017-01-23 12 views
1

Я реализую клиент Paho MQTT Java для моего проекта Android. Это система обмена мгновенными сообщениями. Реализация публикации и подписки работает для меня очень хорошо, но у меня осталась проблема. Подписные клиенты могут получать сообщения, когда они публикуются, однако способность системы проверять, когда сообщение отправлено/доставлено клиентом (подписчиком) или нет, немного сложно реализовать, это, я думаю, потому, что MQTT не поддержите это.Как проверить, когда брокер доставлял сообщение клиенту (подписчику)

Есть ли у кого-нибудь идея, как реализовать эту логику по-другому?

ответ

1

В соответствии с документацией на MQTT вы можете установить MqttCallback, который имеет метод deliveryComplete(IMqttDeliveryToken token) теперь, как в документации она утверждает, что этот метод обратного вызова будет называться

при доставке на сообщение была завершена, и все подтверждения были получены.

Для обеспечения доставки установить QoS (качество обслуживания) до 2.

Если у вас есть сомнения по поводу этого подхода, можно использовать другой подход, при котором вы можете ожидать acknowledgement сообщений от клиента на доставка сообщения, однако это всего лишь еще один накладной для mqtt, и это зависит от вашего требования использовать это или нет.

Вы можете больше узнать о своих github, у него также есть пример кода, чтобы узнать больше о работе Mqtt.

Я надеюсь, что это помогает

+1

'deliveryComplete (IMqttDeliveryToken token)' вызывается, когда брокер успешно публикует ваше сообщение, это не вызывается, когда клиент получил ваше сообщение. – George

+0

@George Да, это может быть так, так как ваша проблема связана с подтверждением сообщений в конце подписчика. Я могу предложить вам отдохнуть api, который может помечать каждое отдельное сообщение как «доставленное», это должно служить цели. Если вы хотите гарантировать доставку сообщения, вы можете установить QoS на 2 и установить флаг 'cleanSession' на' false' –

2

Протоколу MQTT имеет встроенный для сквозного уведомления о доставке. Нет никакого способа узнать, сколько подписчиков есть в теме, это может быть где-то между 0 и многими.

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

+0

«_Messages также следует опубликовать и подписаться на QOS 2_». @hardillb недостаточно QoS 1 когда реализован уникальный идентификатор полезной нагрузки? –

+0

QOS 2 экономит на необходимости отслеживать сообщения в случае двойной доставки – hardillb

+0

Я знаю, что делает QoS2. В случае приложения чата OP все равно придется отслеживать идентификаторы сообщений, чтобы правильно сортировать неупорядоченные или отложенные поставки. Так что технически это реализовано на QoS1, я думаю. –