Įsisavinkite MQTT protokolą daiktų internetui su Python. Šiame išsamiame vadove – principai, Paho-MQTT biblioteka, saugumas ir praktinis projekto įgyvendinimas.
Python daiktų internetui: Išsamus MQTT diegimo vadovas
Sujungtas pasaulis: kodėl DI protokolai yra svarbūs
Gyvename precedento neturinčio susietumo eroje. Daiktų internetas (DI) nebėra futuristinė koncepcija; tai pasaulinė realybė, tyliai audžianti milijardų išmaniųjų įrenginių tinklą, kuris stebi mūsų aplinką, automatizuoja mūsų namus, optimizuoja mūsų pramonės šakas ir modernizuoja mūsų miestus. Nuo išmaniojo termostato namuose Seule iki žemės ūkio jutiklio lauke Kenijos kaime, šie įrenginiai generuoja milžinišką duomenų kiekį. Bet kaip jie visi bendrauja tarpusavyje ir su debesija, ypač kai jie dažnai yra maži, mažos galios ir veikia nepatikimuose tinkluose? Atsakymas slypi specializuotuose komunikacijos protokoluose.
Nors HTTP protokolas palaiko didžiąją dalį interneto, kurį naudojame kasdien, jis dažnai yra per sunkus ir reikalaujantis per daug energijos ribotų galimybių DI pasauliui. Būtent čia išryškėja protokolai, sukurti specialiai mašinų tarpusavio (M2M) komunikacijai. Tarp jų vienas tapo dominuojančia jėga: MQTT.
Šis išsamus vadovas skirtas programuotojams, inžinieriams ir entuziastams visame pasaulyje, kurie nori išnaudoti MQTT galią naudodami Python – vieną universaliausių ir populiariausių programavimo kalbų DI srityje. Keliausime nuo fundamentalių MQTT koncepcijų iki saugių, patikimų ir plečiamų DI programų kūrimo.
Kas yra MQTT? Protokolas, sukurtas apribojimams
MQTT reiškia Message Queuing Telemetry Transport. Jį 1999 m. išrado Dr. Andy Stanford-Clark iš IBM ir Arlen Nipper iš Arcom (dabar Cirrus Link), siekdami stebėti naftotiekius per nepatikimus palydovinius tinklus. Jo atsiradimo istorija puikiai atspindi jo paskirtį: būti lengvasvoriu, patikimu ir efektyviu pranešimų siuntimo protokolu įrenginiams, veikiantiems esant dideliems apribojimams.
Publikavimo/prenumeravimo (Pub/Sub) modelio paaiškinimas
MQTT pagrindas – elegantiškas publikavimo/prenumeravimo architektūrinis modelis. Tai esminis skirtumas nuo užklausos/atsakymo modelio, būdingo HTTP, su kuriuo daugelis programuotojų yra susipažinę. Vietoj to, kad klientas tiesiogiai prašytų informacijos iš serverio, komunikacija yra atsieta.
Įsivaizduokite pasaulinę naujienų agentūrą. Žurnalistai (publikuotojai) nesiunčia savo straipsnių tiesiogiai kiekvienam skaitytojui. Vietoj to, jie siunčia savo straipsnius į agentūros centrinį mazgą (brokerį) ir suskirsto juos pagal konkrečias temas, pavyzdžiui, „Pasaulio politika“ ar „Technologijos“. Skaitytojams (prenumeratoriams) nereikia klausti žurnalistų apie naujienas; jie tiesiog praneša agentūrai, kurios temos juos domina. Tuomet agentūra automatiškai persiunčia visus naujus straipsnius tomis temomis suinteresuotiems skaitytojams. Žurnalistams ir skaitytojams niekada nereikia žinoti apie vienas kito egzistavimą, vietą ar būseną.
MQTT modelyje šis principas atsieją duomenis siunčiantį įrenginį (publikuotoją) nuo juos gaunančio įrenginio ar programos (prenumeratoriaus). Tai nepaprastai galinga DI srityje, nes:
- Erdvinis atsiejimas: Publikuotojui ir prenumeratoriui nereikia žinoti vienas kito IP adreso ar vietos.
- Laiko atsiejimas: Jiems nereikia veikti tuo pačiu metu. Jutiklis gali publikuoti rodmenį, o programa gali jį gauti po kelių valandų, jei sistema taip suprojektuota.
- Sinchronizacijos atsiejimas: Operacijos abiejose pusėse neturi būti stabdomos, laukiant, kol kita pusė užbaigs pranešimų apsikeitimą.
Pagrindiniai MQTT ekosistemos komponentai
MQTT architektūra pagrįsta keliais pagrindiniais komponentais:
- Brokeris: Centrinis mazgas arba serveris. Tai MQTT pasaulio paštas. Brokeris yra atsakingas už visų pranešimų gavimą iš publikuotojų, jų filtravimą pagal temą ir siuntimą atitinkamiems prenumeratoriams. Populiarūs brokeriai apima atvirojo kodo parinktis, tokias kaip Mosquitto ir VerneMQ, bei valdomas debesijos paslaugas, tokias kaip AWS IoT Core, Azure IoT Hub ir Google Cloud IoT Core.
- Klientas: Bet koks įrenginys ar programa, kuri jungiasi prie brokerio. Klientas gali būti publikuotojas, prenumeratorius arba abu. DI jutiklis yra klientas, o serverio programa, apdorojanti jutiklio duomenis, taip pat yra klientas.
- Tema: UTF-8 eilutė, kuri veikia kaip pranešimų adresas ar etiketė. Brokeris naudoja temas pranešimams nukreipti. Temos yra hierarchinės, naudojant pasviruosius brūkšnius kaip skyriklius, panašiai kaip failų sistemos kelyje. Pavyzdžiui, gera tema temperatūros jutikliui svetainėje, esančioje pastate Londone, galėtų būti:
JK/Londonas/Pastatas-A/1-Aukštas/Svetainė/Temperatūra. - Naudingoji apkrova (Payload): Tai yra faktinis pranešimo duomenų turinys. MQTT yra agnostiškas duomenims, o tai reiškia, kad naudingoji apkrova gali būti bet kas: paprasta eilutė, sveikasis skaičius, JSON, XML ar net užšifruoti dvejetainiai duomenys. JSON yra labai paplitęs pasirinkimas dėl savo lankstumo ir skaitomumo.
Kodėl MQTT dominuoja DI komunikacijoje
MQTT projektavimo principai jį ypač gerai pritaiko DI iššūkiams:
- Lengvasvoris: MQTT pranešimai turi labai mažą antraštę (vos 2 baitai), kas sumažina tinklo pralaidumo naudojimą. Tai yra kritiškai svarbu įrenginiams, naudojantiems brangius mobiliuosius planus ar mažo pralaidumo tinklus, tokius kaip LoRaWAN.
- Efektyvus: Mažos protokolo pridėtinės išlaidos tiesiogiai virsta mažesniu energijos suvartojimu, leidžiančiu baterijomis maitinamiems įrenginiams veikti mėnesius ar net metus.
- Patikimas: Jame yra funkcijos, užtikrinančios pranešimų pristatymą net ir nestabiliuose, didelės delsos tinkluose. Tai valdoma per paslaugos kokybės (Quality of Service) lygius.
- Plečiamas: Vienas brokeris gali vienu metu aptarnauti tūkstančių ar net milijonų klientų jungtis, todėl jis tinka didelio masto diegimams.
- Dvikryptis: MQTT leidžia bendrauti iš įrenginio į debesiją (telemetrija) ir iš debesijos į įrenginį (komandos), o tai yra gyvybiškai svarbus reikalavimas valdant įrenginius nuotoliniu būdu.
Paslaugos kokybės (QoS) supratimas
MQTT suteikia tris paslaugos kokybės (QoS) lygius, leidžiančius programuotojams pasirinkti tinkamą patikimumo ir pridėtinių išlaidų balansą konkrečiam naudojimo atvejui.
- QoS 0 (Daugiausiai kartą): Tai yra „iššauk ir pamiršk“ lygis. Pranešimas siunčiamas vieną kartą, be patvirtinimo apie gavimą iš brokerio ar galutinio prenumeratoriaus. Tai greičiausias metodas, bet nesiūlo jokios pristatymo garantijos. Naudojimo atvejis: Nekritiški, didelio dažnio jutiklių duomenys, pavyzdžiui, kambario aplinkos temperatūros rodmuo, siunčiamas kas 10 sekundžių. Prarasti vieną rodmenį nėra problema.
- QoS 1 (Bent kartą): Šis lygis garantuoja, kad pranešimas bus pristatytas bent vieną kartą. Siuntėjas saugo pranešimą, kol gauna patvirtinimą (PUBACK paketą) iš gavėjo. Jei patvirtinimas negaunamas, pranešimas siunčiamas iš naujo. Kartais tai gali lemti pasikartojančius pranešimus, jei patvirtinimas prarandamas. Naudojimo atvejis: Komanda įjungti išmaniąją lemputę. Jums reikia būti tikriems, kad komanda gauta, o jos gavimas du kartus nesukelia žalos.
- QoS 2 (Lygiai kartą): Tai patikimiausias, bet ir lėčiausias lygis. Jis naudoja keturių dalių „rankos paspaudimą“, siekiant užtikrinti, kad pranešimas būtų pristatytas lygiai vieną kartą, be dublikatų. Naudojimo atvejis: Kritinės operacijos, kur dublikatai galėtų būti katastrofiški, pavyzdžiui, finansinė operacija, komanda išduoti tikslų vaistų kiekį ar roboto rankos valdymas gamykloje.
Jūsų Python MQTT aplinkos paruošimas
Dabar pereikime prie praktikos. Norėdami pradėti kurti MQTT programas su Python, jums reikia dviejų dalykų: Python bibliotekos MQTT klientui ir MQTT brokerio, su kuriuo galėtumėte bendrauti.
Python MQTT bibliotekos pasirinkimas: Paho-MQTT
Plačiausiai naudojama ir brandžiausia MQTT biblioteka Python kalbai yra Paho-MQTT iš Eclipse Foundation. Tai tvirta, funkcijomis gausi biblioteka, kuri suteikia kliento klasę prisijungimui prie brokerio ir temų publikavimui ar prenumeravimui. Ją įdiegti paprasta naudojant pip, Python paketų tvarkyklę.
Atidarykite savo terminalą arba komandinę eilutę ir paleiskite:
pip install paho-mqtt
Ši viena komanda įdiegia viską, ko reikia norint pradėti rašyti MQTT klientus su Python.
MQTT brokerio paruošimas
Brokeriui turite kelias parinktis, nuo jo paleidimo savo vietiniame kompiuteryje kūrimo tikslais iki galingos debesijos paslaugos naudojimo produkcijoje.
- Vietinis brokeris (kūrimui ir mokymuisi): Populiariausias pasirinkimas vietiniam brokeriui yra Mosquitto, kitas Eclipse projektas. Jis yra lengvasvoris, atvirojo kodo ir lengvai įdiegiamas.
- Debian pagrindo Linux (pvz., Ubuntu, Raspberry Pi OS):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - macOS (naudojant Homebrew):
brew install mosquitto - Windows: Atsisiųskite diegimo programą iš Mosquitto svetainės.
127.0.0.1arbalocalhost). - Debian pagrindo Linux (pvz., Ubuntu, Raspberry Pi OS):
- Viešas/debesijos brokeris (greitam testavimui): Pradiniams eksperimentams, nieko neįdiegiant, galite naudoti nemokamą, viešą brokerį. Du populiarūs yra
test.mosquitto.orgirbroker.hivemq.com. Svarbu: Jie yra vieši ir nešifruoti. Nesiųskite jiems jokių jautrių ar privačių duomenų. Jie skirti tik mokymosi ir testavimo tikslams.
Praktika: Publikavimas ir prenumeravimas su Python
Parašykime savo pirmąją Python MQTT programą. Sukursime du atskirus scenarijus: publikuotoją, kuris siunčia pranešimus, ir prenumeratorių, kuris juos gauna. Šiam pavyzdžiui, darysime prielaidą, kad naudojate vietinį Mosquitto brokerį.
Paprasto MQTT publikuotojo kūrimas (publisher.py)
Šis scenarijus prisijungs prie brokerio ir kas dvi sekundes publikuos pranešimą „Sveikas, MQTT!“ į temą `python/mqtt/test`.
Sukurkite failą pavadinimu `publisher.py` ir pridėkite šį kodą:
import paho.mqtt.client as mqtt
import time
# --- Konfigūracija ---
BROKER_ADDRESS = "localhost" # Naudokite 'test.mosquitto.org' viešam brokeriui
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Atgalinio ryšio funkcija prisijungimui ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Prisijungta prie MQTT brokerio!")
else:
print(f"Nepavyko prisijungti, grąžinimo kodas {rc}")
# --- Pagrindinis scenarijus ---
# 1. Sukurkite kliento egzempliorių
client = mqtt.Client("PublisherClient")
# 2. Priskirkite on_connect atgalinio ryšio funkciją
client.on_connect = on_connect
# 3. Prisijunkite prie brokerio
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Paleiskite foninę giją tinklo ciklui
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Sveikas, MQTT! Pranešimas #{count}"
# 5. Publikuokite pranešimą
result = client.publish(TOPIC, message)
# Patikrinkite, ar publikavimas buvo sėkmingas
status = result[0]
if status == 0:
print(f"Išsiųsta `{message}` į temą `{TOPIC}`")
else:
print(f"Nepavyko išsiųsti pranešimo į temą {TOPIC}")
time.sleep(2)
except KeyboardInterrupt:
print("Publikavimas sustabdytas.")
finally:
# 6. Sustabdykite tinklo ciklą ir atsijunkite
client.loop_stop()
client.disconnect()
print("Atsijungta nuo brokerio.")
Paprasto MQTT prenumeratoriaus kūrimas (subscriber.py)
Šis scenarijus prisijungs prie to paties brokerio, prenumeruos temą `python/mqtt/test` ir atspausdins visus gautus pranešimus.
Sukurkite kitą failą pavadinimu `subscriber.py`:
import paho.mqtt.client as mqtt
# --- Konfigūracija ---
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Atgalinio ryšio funkcijos ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Prisijungta prie MQTT brokerio!")
# Sėkmingai prisijungus, prenumeruokite temą
client.subscribe(TOPIC)
else:
print(f"Nepavyko prisijungti, grąžinimo kodas {rc}")
def on_message(client, userdata, msg):
# Dekoduokite pranešimo turinį iš baitų į eilutę
payload = msg.payload.decode()
print(f"Gautas pranešimas: `{payload}` temoje `{msg.topic}`")
# --- Pagrindinis scenarijus ---
# 1. Sukurkite kliento egzempliorių
client = mqtt.Client("SubscriberClient")
# 2. Priskirkite atgalinio ryšio funkcijas
client.on_connect = on_connect
client.on_message = on_message
# 3. Prisijunkite prie brokerio
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Paleiskite tinklo ciklą (blokuojantis iškvietimas)
# Ši funkcija automatiškai tvarko prisijungimą iš naujo ir pranešimų apdorojimą.
print("Prenumeratorius klausosi...")
client.loop_forever()
Pavyzdžio paleidimas
- Atidarykite du atskirus terminalo langus.
- Pirmajame terminale paleiskite prenumeratoriaus scenarijų:
python subscriber.py - Turėtumėte pamatyti pranešimą „Prenumeratorius klausosi...“. Dabar jis laukia pranešimų.
- Antrajame terminale paleiskite publikuotojo scenarijų:
python publisher.py - Pamatysite, kaip publikuotojas siunčia pranešimus kas dvi sekundes. Tuo pačiu metu šie pranešimai pasirodys prenumeratoriaus terminalo lange.
Sveikiname! Jūs ką tik sukūrėte pilnai veikiančią MQTT komunikacijos sistemą naudojant Python.
Anapus pagrindų: Išplėstinės Paho-MQTT funkcijos
Realaus pasaulio DI sistemoms reikia daugiau patikimumo nei mūsų paprastam pavyzdžiui. Panagrinėkime keletą išplėstinių MQTT funkcijų, kurios yra būtinos kuriant produkcijai paruoštas programas.
Paskutinė valia ir testamentas (LWT)
Kas nutinka, jei kritiškai svarbus įrenginys, pavyzdžiui, apsaugos kamera ar širdies monitorius, netikėtai atsijungia dėl elektros gedimo ar tinklo praradimo? LWT funkcija yra MQTT sprendimas. Kai klientas jungiasi, jis gali užregistruoti „paskutinės valios“ pranešimą pas brokerį. Jei klientas atsijungia netvarkingai (neišsiųsdamas DISCONNECT paketo), brokeris automatiškai publikuos šį paskutinės valios pranešimą jo vardu į nurodytą temą.
Tai neįkainojama įrenginių būsenos stebėjimui. Galite turėti įrenginį, kuris, prisijungęs, publikuoja `įrenginiai/įrenginys-123/būsena` pranešimą su turiniu `"prisijungęs"` ir užregistruoja LWT pranešimą tai pačiai temai, bet su turiniu `"atsijungęs"`. Bet kuri stebėjimo paslauga, prenumeruojanti šią temą, iškart sužinos įrenginio būseną.
Norėdami įdiegti LWT Paho-MQTT, nustatykite jį prieš prisijungdami:
client.will_set('įrenginiai/įrenginys-123/būsena', payload='atsijungęs', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
Išsaugomi pranešimai
Įprastai, jei prenumeratorius prisijungia prie temos, jis gaus tik tuos pranešimus, kurie buvo publikuoti po to, kai jis prenumeravo. Bet ką daryti, jei jums reikia naujausios vertės iš karto? Būtent tam ir skirti išsaugomi pranešimai. Kai pranešimas publikuojamas su `retain` žyme, nustatyta į `True`, brokeris išsaugo tą pranešimą tai konkrečiai temai. Kiekvieną kartą, kai naujas klientas prenumeruoja tą temą, jis iš karto gauna paskutinį išsaugotą pranešimą.
Tai puikiai tinka būsenos informacijai. Įrenginys gali publikuoti savo būseną (pvz., `{"būsena": "ĮJUNGTA"}`) su `retain=True`. Bet kuri programa, kuri pasileidžia ir prenumeruoja, iš karto žinos dabartinę įrenginio būseną, nereikės laukti kito atnaujinimo.
Paho-MQTT, jūs tiesiog pridedate `retain` žymę prie savo publikavimo iškvietimo:
client.publish(TOPIC, payload, qos=1, retain=True)
Išliekančios sesijos ir švarios sesijos
Kliento prisijungimo užklausoje esanti `clean_session` žymė kontroliuoja, kaip brokeris tvarko kliento sesiją.
- Švari sesija (
clean_session=True, numatytoji): Kai klientas atsijungia, brokeris išmeta visą informaciją apie jį, įskaitant jo prenumeratas ir bet kokius eilėje laukiančius QoS 1 ar 2 pranešimus. Kai jis vėl prisijungia, tai yra tarsi visiškai naujas klientas. - Išliekanti sesija (
clean_session=False): Kai klientas su unikaliu Kliento ID prisijungia šiuo būdu, brokeris išlaiko jo sesiją po atsijungimo. Tai apima jo prenumeratas ir bet kokius QoS 1 ar 2 pranešimus, kurie buvo publikuoti, kai jis buvo neprisijungęs. Kai klientas vėl prisijungia, brokeris siunčia visus praleistus pranešimus. Tai labai svarbu įrenginiams, esantiems nepatikimuose tinkluose, kurie negali sau leisti prarasti svarbių komandų.
Norėdami sukurti išliekančią sesiją, turite pateikti stabilų, unikalų Kliento ID ir nustatyti `clean_session=False`, kurdami kliento egzempliorių:
client = mqtt.Client(client_id="mano-išliekantis-įrenginys-001", clean_session=False)
Saugumas nėra pasirinkimas: MQTT apsauga su Python
Bet kurioje realaus pasaulio programoje saugumas yra svarbiausias. Neapsaugotas MQTT brokeris yra atviras kvietimas piktavaliams šnipinėti jūsų duomenis, siųsti melagingas komandas jūsų įrenginiams ar vykdyti paslaugos trikdymo atakas. MQTT apsauga apima tris pagrindinius ramsčius: autentifikavimą, šifravimą ir autorizavimą.
Autentifikavimas: Kas jūs esate?
Autentifikavimas patvirtina prie brokerio besijungiančio kliento tapatybę. Paprasčiausias metodas yra naudoti vartotojo vardą ir slaptažodį. Galite sukonfigūruoti savo Mosquitto brokerį, kad reikalautų prisijungimo duomenų, ir tada pateikti juos savo Python kliente.
Savo Python kliente naudokite `username_pw_set()` metodą:
client.username_pw_set(username="manovartotojas", password="manoslaptazodis")
client.connect(BROKER_ADDRESS, PORT, 60)
Šifravimas: Duomenų apsauga perdavimo metu su TLS/SSL
Vartotojo vardas ir slaptažodis mažai naudingi, jei jie siunčiami atviru tekstu per tinklą. Šifravimas užtikrina, kad visa komunikacija tarp kliento ir brokerio yra užkoduota ir neįskaitoma niekam, kas šnipinėja tinklą. Tai pasiekiama naudojant transporto lygmens saugumą (TLS), tą pačią technologiją, kuri apsaugo svetaines (HTTPS).
Norėdami naudoti TLS su MQTT (dažnai vadinamu MQTTS), turite sukonfigūruoti savo brokerį, kad jis palaikytų šią funkciją (paprastai per 8883 prievadą) ir pateikti reikiamus sertifikatus savo klientui. Paprastai tai apima sertifikatų institucijos (CA) sertifikatą brokerio tapatybei patvirtinti.
Paho-MQTT, jūs naudojate `tls_set()` metodą:
client.tls_set(ca_certs="kelias/iki/ca.crt")
client.connect(BROKER_ADDRESS, 8883, 60)
Autorizavimas: Ką jums leidžiama daryti?
Kai klientas yra autentifikuotas, autorizavimas nustato, ką jam leidžiama daryti. Pavyzdžiui, temperatūros jutikliui turėtų būti leidžiama publikuoti tik į savo temą (pvz., `jutikliai/temp-A/duomenys`), bet ne į temą, naudojamą gamyklos mašinų valdymui (pvz., `gamykla/1-aukštas/roboto-ranka/komanda`). Tai paprastai tvarkoma brokerio lygmeniu naudojant prieigos kontrolės sąrašus (ACL). Jūs konfigūruojate brokerį su taisyklėmis, kurios apibrėžia, kurie vartotojai gali `skaityti` (prenumeruoti) ar `rašyti` (publikuoti) į konkrečius temų šablonus.
Viską sujungiame: paprastas išmanios aplinkos stebėjimo projektas
Sukurkime šiek tiek realistiškesnį projektą, kad įtvirtintume šias koncepcijas. Simuliuosime jutiklio įrenginį, kuris publikuoja aplinkos duomenis kaip JSON objektą, ir stebėjimo programą, kuri prenumeruoja šiuos duomenis ir juos rodo.
Projekto apžvalga
- Jutiklis (Publikuotojas): Python scenarijus, kuris simuliuoja temperatūros ir drėgmės jutiklio rodmenis. Jis supakuos šiuos duomenis į JSON naudingąją apkrovą ir publikuos ją į temą
išmani_aplinka/įrenginys01/telemetrijakas 5 sekundes. - Stebėtojas (Prenumeratorius): Python scenarijus, kuris prenumeruoja
išmani_aplinka/įrenginys01/telemetrija, gauna JSON duomenis, juos išanalizuoja ir atspausdina patogų būsenos atnaujinimą.
Jutiklio kodas (sensor_publisher.py)
import paho.mqtt.client as mqtt
import time
import json
import random
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "išmani_aplinka/įrenginys01/telemetrija"
client = mqtt.Client("SensorDevice01")
client.connect(BROKER_ADDRESS, PORT, 60)
client.loop_start()
print("Jutiklio publikuotojas paleistas...")
try:
while True:
# Simuliuoti jutiklio rodmenis
temperature = round(random.uniform(20.0, 30.0), 2)
humidity = round(random.uniform(40.0, 60.0), 2)
# Sukurti JSON naudingąją apkrovą
payload = {
"timestamp": time.time(),
"temperature": temperature,
"humidity": humidity
}
payload_str = json.dumps(payload)
# Publikuoti pranešimą su QoS 1
result = client.publish(TOPIC, payload_str, qos=1)
result.wait_for_publish() # Blokuoti, kol publikavimas bus patvirtintas
print(f"Publikuota: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("Stabdomas jutiklio publikuotojas...")
finally:
client.loop_stop()
client.disconnect()
Stebėjimo prietaisų skydelio kodas (monitor_subscriber.py)
import paho.mqtt.client as mqtt
import json
import datetime
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "išmani_aplinka/įrenginys01/telemetrija"
def on_connect(client, userdata, flags, rc):
print(f"Prisijungta su rezultato kodu {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- Gautas naujas pranešimas ---")
try:
# Dekoduoti turinio eilutę ir išanalizuoti kaip JSON
payload = json.loads(msg.payload.decode())
timestamp = datetime.datetime.fromtimestamp(payload.get('timestamp'))
temperature = payload.get('temperature')
humidity = payload.get('humidity')
print(f"Įrenginys: {msg.topic}")
print(f"Laikas: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Temperatūra: {temperature}°C")
print(f"Drėgmė: {humidity}%")
except json.JSONDecodeError:
print("Klaida dekoduojant JSON turinį.")
except Exception as e:
print(f"Įvyko klaida: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("Stebėjimo prietaisų skydelis veikia...")
client.loop_forever()
Nuo prototipo iki produkcijos: MQTT gerosios praktikos
Perkeliant savo projektą nuo paprasto scenarijaus iki tvirtos, plečiamos produkcinės sistemos, reikia kruopštaus planavimo. Štai keletas esminių gerųjų praktikų:
- Sukurkite aiškią temų hierarchiją: Atidžiai suplanuokite savo temų struktūrą nuo pat pradžių. Gera hierarchija yra aprašomoji, plečiama ir leidžia lanksčias prenumeratas naudojant pakaitos simbolius. Įprastas modelis yra
./ /<įrenginio_tipas>/<įrenginio_id>/ - Tinkamai tvarkykite tinklo atsijungimus: Tinklai yra nepatikimi. Jūsų kliento kode turėtų būti įdiegta tvirta prisijungimo iš naujo logika. `on_disconnect` atgalinio ryšio funkcija Paho-MQTT yra puiki vieta pradėti tai daryti, įgyvendinant strategiją, tokią kaip eksponentinis atsitraukimas, siekiant išvengti tinklo užtvindymo prisijungimo bandymais.
- Naudokite struktūrizuotas duomenų naudingąsias apkrovas: Visada naudokite struktūrizuotą duomenų formatą, pavyzdžiui, JSON ar Protocol Buffers, savo pranešimų turiniui. Tai padaro jūsų duomenis savaime aprašomus, versijuojamus ir lengvai analizuojamus skirtingoms programoms (parašytoms bet kuria kalba).
- Apsaugokite viską pagal numatytuosius nustatymus: Nediekite DI sistemos be saugumo. Mažiausiai naudokite vartotojo vardo/slaptažodžio autentifikavimą ir TLS šifravimą. Didesniems saugumo poreikiams išnagrinėkite kliento sertifikatais pagrįstą autentifikavimą.
- Stebėkite savo brokerį: Produkcinėje aplinkoje jūsų MQTT brokeris yra kritinė infrastruktūros dalis. Naudokite stebėjimo įrankius jo būklei sekti, įskaitant CPU/atminties naudojimą, prijungtų klientų skaičių, pranešimų dažnį ir prarastus pranešimus. Daugelis brokerių atveria specialią `$SYS` temų hierarchiją, kuri teikia šią būsenos informaciją.
Išvada: Jūsų kelionė su Python ir MQTT
Nukeliavome nuo fundamentalios „kodėl“ apie MQTT iki praktinės „kaip“ jį įgyvendinti su Python. Sužinojote apie publikavimo/prenumeravimo modelio galią, QoS svarbą ir kritinį saugumo vaidmenį. Pamatėte, kaip Paho-MQTT biblioteka leidžia nepaprastai paprastai kurti sudėtingus klientus, galinčius publikuoti jutiklių duomenis ir prenumeruoti komandas.
MQTT yra daugiau nei tik protokolas; tai pagrindinė daiktų interneto technologija. Jo lengvasvoriškumas ir tvirtos funkcijos pavertė jį pasirinkimu milijonams įrenginių visame pasaulyje, nuo išmaniųjų miestų iki susietojo žemės ūkio ir pramonės automatizavimo.
Kelionė čia nesibaigia. Kitas žingsnis – paimti šias koncepcijas ir pritaikyti jas realiai techninei įrangai. Eksperimentuokite su Raspberry Pi, ESP32 ar kitais mikrovaldikliais. Prijunkite fizinius jutiklius, integruokite su debesijos DI platformomis ir kurkite programas, kurios sąveikauja su fiziniu pasauliu. Su Python ir MQTT jūs turite galingą įrankių rinkinį, skirtą kurti naujos kartos susietus sprendimus.