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