MQTT: доставка при потере связи
Когда я собирал систему «Умный дом» в загородном доме, столкнулся с двумя классическими проблемами, которые, наверное, знакомы многим, кто строит IoT на Wi-Fi:1. В подвале коммутатор управления отоплением периодически «глотал» команды. Аналогичные пропуски случались и в других менее критичных системах, расположенных в дальних пыльных (от туда и название проекта) углах дома с неуверенным покрытием Wi-Fi.2. Не все устройства одинаково хорошо переносили слишком частую отправку команд.Тянуть Ethernet по всему дому и сверлить стены или развешивать дополнительные роутеры/повторители мне категорически не хотелось. Поэтому первую проблему нужно было решать чисто программно.### Почему стандартные возможности брокера не подошлиМногие MQTT-брокеры (в том числе популярный Mosquitto) позволяют включить «хранение последнего сообщения» (retain) и QoS 1/2. Но этого оказалось недостаточно.Например, когда нужно передать на электронный замок целый список RFID-меток — одной «последней» командой не обойтись. Если устройство в момент отправки было недоступно, список просто терялся.### Решение: контракт с подтверждениемЯ изменил договорённость между брокером и потребителем (consumer):- При получении любого сообщения устройство обязано ответить подтверждением.- Только после получения подтверждения сообщение считается доставленным.- Если подтверждение не пришло за заданное время — сообщение автоматически уходит в очередь на повторную отправку.В тот же модуль я добавил защиту от слишком частой отправки: Читать далее