Керування ESP8266 без переспрямування портів: вихідний шлях через MQTT
Брокер, доступний з інтернету, дозволяє керувати домашнім пристроєм через з'єднання, яке той сам відкрив. Що це змінює для пам'яті TLS, тем і повторної доставки.
Пристрій стоїть за домашнім роутером без переспрямування портів і без публічної адреси, і все ж мусить отримати конфігурацію за секунди. Трюк не в дірці в міжмережевому екрані. Це з'єднання, яке пристрій відкриває назовні до брокера, до якого може дістатися, а той потім повертає повідомлення тим самим установленим шляхом. Кожна властивість, яка людям подобається в цьому дизайні, і кожна пастка в ньому походять із цього перевертання.
Що насправді проходить через NAT
Коли пристрій відкриває TCP-з'єднання до брокера, домашній роутер створює відображення і тримає його живим увесь час існування потоку. Відповіді в цьому потоці повертаються до пристрою, бо відображення вже існує. Брокер ніколи не ініціює нічого в бік дому, тому немає небажаного вхідного пакета, який роутер мав би відхилити. Це вся мережева аргументація, і саме тому підхід працює в мережах, які ви не контролюєте.
Пристрій повинен підтримувати з'єднання живим або відновлювати його, і це стає питанням надійності, щойно архітектуру визначено.
Брокер маршрутизує теми, а не проксіює HTTP
MQTT визначає обміни публікації та підписки: пристрій підписується на фільтр тем, який йому дозволено читати, а уповноважений контролер публікує в відповідну тему. Брокер зіставляє публікації з підписками і доставляє копії. Він не знає, що таке запит браузера, і не пересилатиме HTTP GET на веб-сервер пристрою. Якщо наявна прошивка говорить лише HTTP, дизайну з брокером потрібна зміна застосунку або навмисний компонент перекладу.
Назви тем теж не авторизація. Більшість брокерів підтримують списки контролю доступу для кожного клієнта, і пристрої слід обмежувати їхніми власними деревами публікації та підписки, а не ділити один глобальний простір імен.
Ресурси пристрою визначають форму TLS
ESP8266 має обмежену RAM, і рукостискання TLS — найдорожче, що він робить. Ядро Arduino постачає BearSSL саме через це обмеження, а вибір між перевіркою CA і закріпленням відбитка змінює і обсяг пам'яті, і те, що може зробити зловмисник із чинним сертифікатом на інше ім'я. Перевірка CA брокера — сильніший варіант, коли купа дозволяє. Розмір корисного навантаження теж важливий: клієнт MQTT тримає буфер, і повідомлення більші за нього мовчки обрізаються, якщо буфер не збільшено навмисно.
Keepalive і тайм-аути сокета — частина того самого бюджету, бо клієнт, який ніколи не помічає мертвого з'єднання, перестає отримувати команди, не повідомляючи про помилку.
Семантика повідомлень, яка кусає
Збережене повідомлення брокер зберігає й доставляє пізнішим відповідним підписникам, що чудово для поточного стану і небезпечно для одноразових команд: пристрій, що підключився знову, може отримати вчорашню команду як нову. QoS 1 гарантує доставку принаймні один раз, тож дублікати нормальні, і застосунок має бути стійким до повторення, в ідеалі з ідентифікатором або позначкою часу, яку він може відхилити. Остання воля дає сигнал стану, коли пристрій падає, але лише якщо з'єднання справді відмовляє, а не зависає.
Поведінка чистої сесії вирішує, чи зберігає брокер ваші підписки, поки вас немає, і помилка тут — причина, чому деякі пристрої гублять перше повідомлення після кожного перепідключення.
TLS захищає ділянку до брокера. Це не наскрізне шифрування корисного навантаження від оператора брокера, який може читати все, що ви публікуєте через нього.
Обмежте життєвий цикл і перевірте його нешкідливими даними
Плануйте перепідключення з відступом, а не щільним циклом повторів, підписуйтеся знову явно, якщо сесія не постійна, і записуйте результат з'єднання, щоб мовчазний офлайн-пристрій залишав сліди. Перевірте шлях перепідключення на зразках корисного навантаження, які нічого не роблять, бо перший виробничий тест каналу команд не повинен бути справжньою командою. Потім підтвердьте, що робить застаріле збережене повідомлення під час перепідключення, і вирішіть, чи прийнятна така поведінка для кожної теми.
Зроблений так, дизайн прибирає одну вхідну мережеву вимогу і залишає програмне забезпечення пристрою, політику брокера і семантику повідомлень видимою роботою, а не прихованими припущеннями.