Mengawal ESP8266 tanpa port forwarding: laluan keluar MQTT
Broker yang boleh dicapai dari internet membolehkan peranti rumah dikawal melalui sambungan yang dibukanya sendiri. Apa yang berubah untuk memori TLS, topik dan main semula.
Peranti berada di belakang penghala rumah tanpa port forwarding dan tanpa alamat awam, namun ia masih perlu menerima konfigurasi dalam beberapa saat. Helahnya bukan lubang dalam firewall. Ia ialah sambungan yang dibuka peranti ke luar menghala ke broker yang boleh dicapainya, yang kemudian menghantar mesej kembali melalui laluan sedia ada itu. Setiap sifat yang disukai orang tentang reka bentuk ini, dan setiap perangkap di dalamnya, datang daripada penyongsangan itu.
Apa yang sebenarnya melalui NAT
Apabila peranti membuka sambungan TCP ke broker, penghala rumah mencipta pemetaan dan mengekalkannya hidup sepanjang hayat aliran. Balasan pada aliran itu kembali kepada peranti kerana pemetaan sudah wujud. Broker tidak pernah memulakan apa-apa ke arah rumah, jadi tiada paket masuk tidak diminta untuk penghala tolak. Itulah keseluruhan hujah rangkaian, dan sebab itulah pendekatan ini berfungsi pada rangkaian yang anda tidak kawal.
Peranti mesti mengekalkan sambungan hidup atau membinanya semula, yang menjadi persoalan kebolehpercayaan setelah seni bina dimuktamadkan.
Broker menghalakan topik, ia tidak memproksi HTTP
MQTT mentakrifkan pertukaran terbit dan langgan: peranti melanggan penapis topik yang dibenarkan dibacanya, dan pengawal yang diberi kuasa menerbit ke topik yang sepadan. Broker memadankan terbitan dengan langganan dan menyampaikan salinan. Ia tidak tahu apa itu permintaan pelayar, dan ia tidak akan menghantar HTTP GET ke pelayan web peranti. Jika firmware sedia ada hanya bertutur HTTP, reka bentuk broker memerlukan perubahan aplikasi atau komponen terjemahan yang disengajakan.
Nama topik juga bukan kebenaran. Kebanyakan broker menyokong senarai kawalan akses setiap klien, dan peranti harus dihadkan kepada pokok terbit dan langgan mereka sendiri daripada berkongsi satu ruang nama global.
Sumber peranti menentukan bentuk TLS
ESP8266 mempunyai RAM terhad, dan jabat tangan TLS ialah perkara paling mahal yang dilakukannya. Teras Arduino menyertakan BearSSL khusus untuk kekangan ini, dan pilihan antara mengesahkan CA dan menyematkan cap jari mengubah kedua-dua jejak memori dan apa yang boleh dilakukan oleh penyerang dengan sijil sah untuk nama lain. Mengesahkan CA broker ialah pilihan yang lebih kukuh apabila timbunan mengizinkannya. Saiz muatan juga penting: klien MQTT menyimpan penimbal, dan mesej yang lebih besar daripadanya dipotong secara senyap melainkan penimbal dinaikkan dengan sengaja.
Keepalive dan tamat masa soket adalah sebahagian daripada belanjawan yang sama, kerana klien yang tidak pernah menyedari sambungan mati berhenti menerima arahan tanpa melaporkan ralat.
Semantik mesej yang menggigit
Mesej yang dikekalkan disimpan oleh broker dan disampaikan kepada pelanggan sepadan kemudian, yang sangat baik untuk keadaan semasa dan berbahaya untuk arahan sekali guna: peranti yang menyambung semula boleh menerima arahan semalam seolah-olah ia baharu. QoS 1 menjamin penyampaian sekurang-kurangnya sekali, jadi pendua adalah normal dan aplikasi mesti selamat daripada pengulangan, idealnya dengan pengecam atau cap masa yang boleh ditolaknya. Wasiat terakhir memberi anda isyarat status apabila peranti terputus, tetapi hanya jika sambungan benar-benar gagal dan bukan tergantung.
Tingkah laku sesi bersih menentukan sama ada broker menyimpan langganan anda semasa anda tiada, dan kesilapan di situ ialah sebab sesetengah peranti terlepas mesej pertama selepas setiap sambungan semula.
TLS melindungi bahagian sehingga broker. Ia bukan penyulitan muatan hujung ke hujung terhadap pengendali broker, yang boleh membaca segala yang anda terbitkan melaluinya.
Hadkan kitaran hayat dan ujinya dengan data tidak berbahaya
Rancang sambungan semula dengan pengunduran dan bukan gelung cubaan semula yang ketat, langgan semula secara eksplisit jika sesi tidak berterusan, dan log hasil sambungan supaya peranti luar talian yang senyap meninggalkan bukti. Uji laluan sambungan semula dengan muatan contoh yang tidak melakukan apa-apa, kerana ujian pengeluaran pertama saluran arahan tidak sepatutnya menjadi arahan sebenar. Kemudian sahkan apa yang dilakukan oleh mesej dikekalkan yang lapuk semasa sambungan semula, dan tentukan sama ada tingkah laku itu boleh diterima untuk setiap topik.
Dilakukan dengan cara ini, reka bentuk menghapuskan satu keperluan rangkaian masuk dan meninggalkan perisian peranti, dasar broker dan semantik mesej sebagai kerja yang kelihatan dan bukan andaian tersembunyi.