2016-09-05 4 views
1

Мой издатель и брокер работают в разных системах. Я использую QOS = 2 для доставки сообщений. Я использую python paho mqtt broker. Это еще одно расширение для MQTT. Есть ли способ проверить, все ли подключен клиент.paho mqtt клиентское брокерское соединение

1) Когда я публикую сообщение подключенному брокеру, он подтверждает меня, вызывая обратный вызов on_publish(). но когда я отключил свой брокер, работающий на другой машине из сети, издатель сохраняет сообщение публикации на локальном компьютере, и снова, когда я подключу своего брокера к сети, он публикует все предыдущие сообщения брокерам. Я думаю, что эти сообщения хранятся в виде сообщений о переполнении (не подтверждены), если эти сообщения являются информационными сообщениями, а затем, где хранятся эти сообщения, существует ли какой-либо предел этих информационных сообщений, поскольку в моем коде не содержится ничего, относящееся к информационным сообщениям.

+0

В качестве дополнительной опции для спецификации mqtt вы можете посмотреть исходный код https://github.com/eclipse/paho. mqtt.c/blob/master/src/MQTTProtocolClient.c, строка 142, он сохраняет сообщения в локальном списке при публикации. – Jackie

ответ

1

Сообщения Mqtt, которые не доставлены (клиент не получил пакет PUBREL), хранятся в локальной области хранения сеанса. , Аналогично, если сервер не получил ответ PUBCOMP для сообщения PUBREL, он должен обработать сообщение как неподтвержденное и сохранить соответствующее состояние сеанса в своей локальной области хранения сеанса.

Размер кеша с обеих сторон (сервера и клиента) напрямую определяется конфигурацией клиента или сервера. Это упоминается в первом Non-нормативном комментарии в начале раздела 4.1 в стандарте OASIS.

Существует хорошее описание (если иногда сбивает с толку) описание этого процесса для QoS 2 сообщений на the OASIS standard

+0

это локальное хранилище существует только в том случае, если наш клиент постоянно подключается к источнику питания, если клиент отключается от напряжения питания, все данные будут потеряны .. если я прав? Если да, есть ли способ сохранить эти данные, отправьте брокеру, когда клиент снова подключится к брокеру? –

+0

Убедитесь, что вы не потеряли данные о хранении, когда ваше устройство отключено. В какой-то момент вы должны принять потерю сообщений, потому что вы не можете делать такие вещи, как «сохранить сообщение, которое еще не было отправлено». Но если сообщение было отправлено, но не выполнено процесс подтверждения, оно должно быть в кеше сервера. Для сообщений QoS 2, по крайней мере. Но опять же, если сеть упадет до того, как сообщение будет отправлено, а затем вы потеряете питание, и у вас нет постоянного хранилища на устройстве, тогда сообщение будет потеряно. –

+0

Спасибо, Jeff, я хочу задать еще один вопрос. Может ли мой клиент мгновенно обнаружить неожиданный отключенный от брокера. Я использую mosquitto python library, есть функция обратного вызова, называемая on_disconnect(), которая вызывает, когда клиент снова подключается к брокеру после отключения, он не вызывается немедленно. и еще одна вещь - вызов функции on_disconnect() только тогда, когда я выключаю свой брокер, он не вызывается, когда я отключу своего брокера из сети. –

0

клиента Pāho MQTT Python в настоящее время не предлагают диск буферизации.

Для клиента Paho Java по умолчанию сообщения о освещении сохраняются в памяти (1). Для сохранения сообщений после сбоя питания вы можете указать класс устойчивости MqttDefaultFilePersistence (2)

Смежные вопросы