Управување со ESP8266 без проследување порта: излезна MQTT патека
Достапен broker од интернетот овозможува домашниот уред да се управува преку врска што тој сам ја отворил. Што менува тоа за TLS меморијата, темите и повторувањето.
Уредот стои зад домашен рутер без проследување порта и без јавна адреса, и сѐ уште мора да ја добие конфигурацијата во рок од неколку секунди. Трикот не е дупка во firewall-от. Тоа е врска што уредот ја отвора нанадвор кон broker до кој може да стигне, а тој потоа ги враќа пораките по истиот воспоставен пат. Секое својство што луѓето го сакаат во овој дизајн, и секоја стапица во него, доаѓа од тоа превртување.
Што всушност поминува низ NAT
Кога уредот отвора TCP врска кон broker-от, домашниот рутер создава мапирање и го одржува живо за целиот век на текот. Одговорите на тој тек се враќаат кај уредот затоа што мапирањето веќе постои. Broker-от никогаш не иницира ништо кон куќата, па нема непобарана дојдовна пакетка што рутерот би ја одбил. Тоа е целиот мрежен аргумент, и затоа овој пристап работи во мрежи што не ги контролирате.
Уредот мора да ја одржува врската жива или повторно да ја воспостави, што станува прашање на доверливост откако архитектурата ќе се утврди.
Broker-от насочува теми, тој не е HTTP прокси
MQTT дефинира размени на објавување и претплата: уредот се претплатува на филтер на теми што му е дозволено да го чита, а овластен контролер објавува на соодветна тема. Broker-от ги совпаѓа објавувањата со претплатите и доставува копии. Тој не знае што е барање на прелистувач и нема да пренесе HTTP GET до веб-серверот на уредот. Ако постоечкиот firmware зборува само HTTP, дизајнот со broker бара промена во апликацијата или намерна компонента за превод.
Имињата на темите исто така не се авторизација. Повеќето broker-и поддржуваат списоци за контрола на пристап по клиент, и уредите треба да бидат ограничени на сопствените дрва за објавување и претплата наместо да делат еден глобален именски простор.
Ресурсите на уредот ја одредуваат формата на TLS
ESP8266 има ограничена RAM, а TLS ракувањето е најскапото нешто што го прави. Arduino јадрото го доставува BearSSL токму поради ова ограничување, а изборот помеѓу проверка на CA и закачување отпечаток ги менува и меморискиот отпечаток и тоа што може да направи напаѓач со валиден сертификат за друго име. Проверката на CA на broker-от е посилна опција кога купот го дозволува. Големината на носивиот товар е исто така важна: MQTT клиентот држи бафер, а пораките поголеми од него се сечат тивко ако баферот не се зголеми намерно.
Keepalive и тајмаутите на сокетот се дел од истиот буџет, зашто клиент што никогаш не забележи мртва врска престанува да прима команди без да пријави грешка.
Семантиката на пораките што каснува
Задржаната порака broker-от ја чува и ја доставува на подоцнежните соодветни претплатници, што е одлично за тековната состојба и опасно за еднократни команди: уред што повторно ќе се поврзе може да ја добие вчерашната команда како да е нова. QoS 1 гарантира доставување барем еднаш, така што дупликатите се нормални и апликацијата мора да биде безбедна при повторување, идеално со идентификатор или временска ознака што може да ја одбие. Последната волја ви дава сигнал за состојба кога уредот паѓа, но само ако врската навистина не успее наместо да виси.
Однесувањето на чиста сесија одлучува дали broker-от ги чува вашите претплати додека ве нема, и грешката во тоа е причината зошто некои уреди ја пропуштаат првата порака по секое повторно поврзување.
TLS го штити делот до broker-от. Тоа не е криптирање на носивиот товар од крај до крај против операторот на broker-от, кој може да чита сѐ што објавувате преку него.
Ограничете го животниот циклус и тестирајте го со безопасни податоци
Планирајте повторно поврзување со повлекување наместо цврст циклус на повторни обиди, претплатете се повторно експлицитно ако сесијата не е постојана, и логирајте го резултатот од поврзувањето за тивок офлајн уред да остави доказ. Тестирајте го патот за повторно поврзување со примерни носиви товари што не прават ништо, зашто првиот производствен тест на канал за команди не треба да биде вистинска команда. Потоа потврдете што прави застарена задржана порака при повторно поврзување, и одлучете дали тоа однесување е прифатливо за секоја тема.
Направен вака, дизајнот отстранува едно дојдовно мрежно барање и го остава софтверот на уредот, политиката на broker-от и семантиката на пораките како видлива работа наместо скриени претпоставки.