ApgÅ«stiet MQTT protokolu IoT jomÄ, izmantojot Python. Å is detalizÄtais ceļvedis aptver principus, Paho-MQTT bibliotÄku, droŔību un reÄlu projektu ievieÅ”anu.
Python lietu internetam (IoT): VisaptveroÅ”s ceļvedis MQTT ievieÅ”anÄ
SavienotÄ pasaule: KÄpÄc IoT protokoli ir svarÄ«gi
MÄs dzÄ«vojam bezprecedenta savienojamÄ«bas laikmetÄ. Lietu internets (IoT) vairs nav futÅ«ristisks koncepts; tÄ ir globÄla realitÄte, kas klusi veido miljardiem viedo ierÄ«Äu tÄ«klu, kuras uzrauga mÅ«su vidi, automatizÄ mÅ«su mÄjas, optimizÄ mÅ«su nozares un pilnveido mÅ«su pilsÄtas. No viedÄ termostata mÄjÄs SeulÄ lÄ«dz lauksaimniecÄ«bas sensoram laukÄ Kenijas laukos, Ŕīs ierÄ«ces rada milzÄ«gu datu apjomu. Bet kÄ tÄs visas sazinÄs savÄ starpÄ un ar mÄkoni, Ä«paÅ”i, ja tÄs bieži ir mazas, mazjaudÄ«gas un darbojas neuzticamos tÄ«klos? Atbilde slÄpjas specializÄtos komunikÄcijas protokolos.
Lai gan HTTP protokols nodroÅ”ina lielÄko daļu interneta, ko mÄs ikdienÄ lietojam, tas bieži ir pÄrÄk smagnÄjs un energoietilpÄ«gs ierobežotajai IoT pasaulei. Å eit izceļas protokoli, kas Ä«paÅ”i izstrÄdÄti maŔīnas-maŔīnai (M2M) komunikÄcijai. Starp tiem viens ir kļuvis par dominÄjoÅ”u spÄku: MQTT.
Å is visaptveroÅ”ais ceļvedis ir paredzÄts izstrÄdÄtÄjiem, inženieriem un entuziastiem visÄ pasaulÄ, kuri vÄlas izmantot MQTT jaudu ar Python palÄ«dzÄ«bu, kas ir viena no daudzpusÄ«gÄkajÄm un populÄrÄkajÄm programmÄÅ”anas valodÄm IoT jomÄ. MÄs dosimies ceļojumÄ no MQTT pamatkonceptiem lÄ«dz droÅ”u, robustu un mÄrogojamu IoT lietojumprogrammu izveidei.
Kas ir MQTT? Protokols, kas radīts ierobežojumiem
MQTT ir saÄ«sinÄjums no Message Queuing Telemetry Transport (ZiÅojumu rindoÅ”anas telemetrijas transports). To 1999. gadÄ izgudroja Dr. Endijs Stenford-KlÄrks no IBM un Ärlens Nipers no Arcom (tagad Cirrus Link), lai uzraudzÄ«tu naftas vadus, izmantojot neuzticamus satelÄ«tu tÄ«klus. TÄ izcelsmes stÄsts lieliski raksturo tÄ mÄrÄ·i: bÅ«t vieglam, uzticamam un efektÄ«vam ziÅojumapmaiÅas protokolam ierÄ«cÄm, kas darbojas ar bÅ«tiskiem ierobežojumiem.
PublicÄÅ”anas/abonÄÅ”anas (Pub/Sub) modeļa skaidrojums
MQTT pamatÄ ir elegants publicÄÅ”anas/abonÄÅ”anas arhitektÅ«ras modelis. TÄ ir fundamentÄla atkÄpe no pieprasÄ«juma/atbildes modeļa, ar ko daudzi izstrÄdÄtÄji ir pazÄ«stami HTTP protokolÄ. TÄ vietÄ, lai klients tieÅ”i pieprasÄ«tu informÄciju no servera, komunikÄcija ir atsaistÄ«ta.
IedomÄjieties globÄlu ziÅu aÄ£entÅ«ru. ŽurnÄlisti (publicÄtÄji) nesÅ«ta savus stÄstus tieÅ”i katram lasÄ«tÄjam. TÄ vietÄ viÅi sÅ«ta savus stÄstus uz aÄ£entÅ«ras centrÄlo mezglu (brokeri) un kategorizÄ tos pÄc konkrÄtÄm tÄmÄm, piemÄram, "Pasaules politika" vai "TehnoloÄ£ijas". LasÄ«tÄjiem (abonentiem) nav jÄlÅ«dz žurnÄlistiem jaunumi; viÅi vienkÄrÅ”i paziÅo aÄ£entÅ«rai, kuras tÄmas viÅus interesÄ. PÄc tam aÄ£entÅ«ra automÄtiski pÄrsÅ«ta visus jaunos stÄstus par Ŕīm tÄmÄm ieinteresÄtajiem lasÄ«tÄjiem. ŽurnÄlistiem un lasÄ«tÄjiem nekad nav jÄzina par viena otra esamÄ«bu, atraÅ”anÄs vietu vai statusu.
MQTT Å”is modelis atsaista ierÄ«ci, kas sÅ«ta datus (publicÄtÄju), no ierÄ«ces vai lietojumprogrammas, kas tos saÅem (abonentu). Tas ir neticami spÄcÄ«gs risinÄjums IoT jomÄ, jo:
- TelpiskÄ atsaiste: PublicÄtÄjam un abonentam nav jÄzina viena otra IP adrese vai atraÅ”anÄs vieta.
- Laika atsaiste: Tiem nav jÄdarbojas vienlaicÄ«gi. Sensors var publicÄt nolasÄ«jumu, un lietojumprogramma to var saÅemt stundÄm vÄlÄk, ja sistÄma ir tÄ izstrÄdÄta.
- SinhronizÄcijas atsaiste: OperÄcijas abÄs pusÄs nav jÄaptur, lai gaidÄ«tu, kamÄr otra puse pabeidz ziÅojumu apmaiÅu.
MQTT ekosistÄmas galvenie komponenti
MQTT arhitektūra ir veidota uz dažiem galvenajiem komponentiem:
- Brokeris: CentrÄlais mezgls jeb serveris. TÄ ir MQTT pasaules pasta nodaļa. Brokeris ir atbildÄ«gs par visu ziÅojumu saÅemÅ”anu no publicÄtÄjiem, to filtrÄÅ”anu pÄc tÄmas un nosÅ«tīŔanu attiecÄ«gajiem abonentiem. PopulÄri brokeri ietver atvÄrtÄ koda risinÄjumus, piemÄram, Mosquitto un VerneMQ, un pÄrvaldÄ«tus mÄkoÅpakalpojumus, piemÄram, AWS IoT Core, Azure IoT Hub un Google Cloud IoT Core.
- Klients: Jebkura ierÄ«ce vai lietojumprogramma, kas savienojas ar brokeri. Klients var bÅ«t publicÄtÄjs, abonents vai abi. IoT sensors ir klients, un servera lietojumprogramma, kas apstrÄdÄ sensora datus, arÄ« ir klients.
- TÄma (Topic): UTF-8 virkne, kas darbojas kÄ adrese vai iezÄ«me ziÅojumiem. Brokeris izmanto tÄmas, lai marÅ”rutÄtu ziÅojumus. TÄmas ir hierarhiskas, izmantojot slÄ«psvÄ«tras kÄ atdalÄ«tÄjus, lÄ«dzÄ«gi kÄ failu sistÄmas ceļŔ. PiemÄram, laba tÄma temperatÅ«ras sensoram viesistabÄ ÄkÄ LondonÄ varÄtu bÅ«t:
UK/Londona/Eka-A/Stavs-1/Viesistaba/Temperatura. - LietderÄ«gÄ slodze (Payload): Tas ir ziÅojuma faktiskais datu saturs. MQTT ir datu agnostisks, kas nozÄ«mÄ, ka lietderÄ«gÄ slodze var bÅ«t jebkas: vienkÄrÅ”a virkne, vesels skaitlis, JSON, XML vai pat Å”ifrÄti binÄri dati. JSON ir ļoti izplatÄ«ta izvÄle tÄs elastÄ«bas un lasÄmÄ«bas dÄļ.
KÄpÄc MQTT dominÄ IoT komunikÄcijÄ
MQTT dizaina principi padara to Ä«paÅ”i piemÄrotu IoT izaicinÄjumiem:
- Viegls: MQTT ziÅojumiem ir ļoti maza galvene (pat tikai 2 baiti), kas samazina tÄ«kla joslas platuma izmantoÅ”anu. Tas ir kritiski svarÄ«gi ierÄ«cÄm, kas izmanto dÄrgus mobilo sakaru plÄnus vai zema joslas platuma tÄ«klus, piemÄram, LoRaWAN.
- EfektÄ«vs: Protokola zemÄ noslodze tieÅ”i nozÄ«mÄ zemÄku enerÄ£ijas patÄriÅu, ļaujot ar baterijÄm darbinÄmÄm ierÄ«cÄm darboties mÄneÅ”iem vai pat gadiem ilgi.
- Uzticams: Tas ietver funkcijas, lai nodroÅ”inÄtu ziÅojumu piegÄdi pat nestabilos, augsta latentuma tÄ«klos. To pÄrvalda, izmantojot pakalpojuma kvalitÄtes (QoS) lÄ«meÅus.
- MÄrogojams: Viens brokeris var vienlaikus apstrÄdÄt savienojumus no tÅ«kstoÅ”iem vai pat miljoniem klientu, padarot to piemÄrotu liela mÄroga ievieÅ”anai.
- Divvirzienu: MQTT ļauj sazinÄties no ierÄ«ces uz mÄkoni (telemetrija) un no mÄkoÅa uz ierÄ«ci (komandas), kas ir bÅ«tiska prasÄ«ba ierÄ«Äu attÄlinÄtai vadÄ«bai.
Izpratne par pakalpojuma kvalitÄti (QoS)
MQTT nodroÅ”ina trÄ«s pakalpojuma kvalitÄtes (QoS) lÄ«meÅus, lai izstrÄdÄtÄji varÄtu izvÄlÄties pareizo lÄ«dzsvaru starp uzticamÄ«bu un noslodzi savam konkrÄtajam lietoÅ”anas gadÄ«jumam.
- QoS 0 (AugstÄkais vienu reizi): Å is ir "izÅ”auj un aizmirsti" lÄ«menis. ZiÅojums tiek nosÅ«tÄ«ts vienu reizi, bez apstiprinÄjuma par saÅemÅ”anu no brokera vai gala abonenta. TÄ ir ÄtrÄkÄ metode, bet nepiedÄvÄ piegÄdes garantiju. LietoÅ”anas piemÄrs: Nekritiski, augstas frekvences sensoru dati, piemÄram, istabas temperatÅ«ras nolasÄ«jums, kas tiek sÅ«tÄ«ts ik pÄc 10 sekundÄm. Viena nolasÄ«juma zaudÄÅ”ana nav problÄma.
- QoS 1 (Vismaz vienu reizi): Å is lÄ«menis garantÄ, ka ziÅojums tiks piegÄdÄts vismaz vienu reizi. SÅ«tÄ«tÄjs saglabÄ ziÅojumu, lÄ«dz saÅem apstiprinÄjumu (PUBACK paketi) no saÅÄmÄja. Ja apstiprinÄjums netiek saÅemts, ziÅojums tiek nosÅ«tÄ«ts atkÄrtoti. Tas dažkÄrt var izraisÄ«t ziÅojumu dublikÄtus, ja apstiprinÄjums tiek pazaudÄts. LietoÅ”anas piemÄrs: Komanda ieslÄgt viedo apgaismojumu. Jums jÄbÅ«t pÄrliecinÄtam, ka komanda ir saÅemta, un tÄs saÅemÅ”ana divreiz nenodara kaitÄjumu.
- QoS 2 (PrecÄ«zi vienu reizi): Å is ir visuzticamÄkais, bet arÄ« lÄnÄkais lÄ«menis. Tas izmanto Äetru daļu rokasspiedienu, lai nodroÅ”inÄtu, ka ziÅojums tiek piegÄdÄts precÄ«zi vienu reizi, bez dublikÄtiem. LietoÅ”anas piemÄrs: Kritiskas operÄcijas, kur dublikÄti varÄtu bÅ«t katastrofÄli, piemÄram, finanÅ”u darÄ«jums, komanda izsniegt precÄ«zu medikamentu devu vai vadÄ«t robotizÄtu roku rÅ«pnÄ«cÄ.
Savas Python MQTT vides iestatīŔana
Tagad Ä·ersimies pie praktiskÄs puses. Lai sÄktu veidot MQTT lietojumprogrammas ar Python, jums ir nepiecieÅ”amas divas lietas: Python bibliotÄka MQTT klientam un MQTT brokeris, ar ko sazinÄties.
Python MQTT bibliotÄkas izvÄle: Paho-MQTT
VisplaÅ”Äk izmantotÄ un nobrieduÅ”ÄkÄ MQTT bibliotÄka Python valodai ir Paho-MQTT no Eclipse Foundation. TÄ ir robusta, funkcijÄm bagÄta bibliotÄka, kas nodroÅ”ina klienta klasi, lai izveidotu savienojumu ar brokeri un publicÄtu vai abonÄtu tÄmas. TÄs instalÄÅ”ana ir vienkÄrÅ”a, izmantojot pip, Python pakotÅu pÄrvaldnieku.
Atveriet savu terminÄli vai komandrindu un palaidiet:
pip install paho-mqtt
Å Ä« viena komanda instalÄ visu nepiecieÅ”amo, lai sÄktu rakstÄ«t MQTT klientus Python valodÄ.
MQTT brokera iestatīŔana
Jums ir vairÄkas brokera iespÄjas, sÄkot no tÄ palaiÅ”anas uz jÅ«su vietÄjÄ datora izstrÄdei lÄ«dz jaudÄ«ga mÄkoÅpakalpojuma izmantoÅ”anai ražoÅ”anÄ.
- VietÄjais brokeris (izstrÄdei un mÄcÄ«bÄm): PopulÄrÄkÄ izvÄle vietÄjam brokerim ir Mosquitto, vÄl viens Eclipse projekts. Tas ir viegls, atvÄrtÄ koda un viegli instalÄjams.
- On Debian-based Linux (like Ubuntu, Raspberry Pi OS):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - On macOS (using Homebrew):
brew install mosquitto - On Windows: Download the native installer from the Mosquitto website.
127.0.0.1vailocalhost). - On Debian-based Linux (like Ubuntu, Raspberry Pi OS):
- Publiskais/MÄkoÅa brokeris (Ätrai testÄÅ”anai): SÄkotnÄjiem eksperimentiem, neinstalÄjot neko, varat izmantot bezmaksas, publisku brokeri. Divi populÄri ir
test.mosquitto.orgunbroker.hivemq.com. SvarÄ«gi: Tie ir publiski un neÅ”ifrÄti. NesÅ«tiet uz tiem nekÄdus sensitÄ«vus vai privÄtus datus. Tie ir paredzÄti tikai mÄcÄ«bu un testÄÅ”anas nolÅ«kiem.
Praktiskais darbs: PublicÄÅ”ana un abonÄÅ”ana ar Python
UrakstÄ«sim savu pirmo Python MQTT lietojumprogrammu. MÄs izveidosim divus atseviŔķus skriptus: publicÄtÄju, kas sÅ«ta ziÅojumus, un abonentu, kas tos saÅem. Å ajÄ piemÄrÄ mÄs pieÅemsim, ka jÅ«s darbinÄt vietÄjo Mosquitto brokeri.
VienkÄrÅ”a MQTT publicÄtÄja izveide (publisher.py)
Å is skripts izveidos savienojumu ar brokeri un publicÄs ziÅojumu "Sveiki, MQTT!" tÄmai `python/mqtt/test` ik pÄc divÄm sekundÄm.
Izveidojiet failu ar nosaukumu `publisher.py` un pievienojiet Å”Ädu kodu:
import paho.mqtt.client as mqtt
import time
# --- KonfigurÄcija ---
BROKER_ADDRESS = "localhost" # Izmantojiet 'test.mosquitto.org' publiskam brokerim
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Atzvana funkcija savienojumam ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Savienojums ar MQTT brokeri izveidots!")
else:
print(f"NeizdevÄs izveidot savienojumu, atgrieÅ”anas kods {rc}")
# --- Galvenais skripts ---
# 1. Izveidojiet klienta instanci
client = mqtt.Client("PublisherClient")
# 2. PieŔķiriet on_connect atzvana funkciju
client.on_connect = on_connect
# 3. Savienojieties ar brokeri
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Palaidiet fona pavedienu tīkla ciklam
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Sveiki, MQTT! ZiÅojums #{count}"
# 5. PublicÄjiet ziÅojumu
result = client.publish(TOPIC, message)
# PÄrbaudiet, vai publicÄÅ”ana bija veiksmÄ«ga
status = result[0]
if status == 0:
print(f"NosÅ«tÄ«ts `{message}` uz tÄmu `{TOPIC}`")
else:
print(f"NeizdevÄs nosÅ«tÄ«t ziÅojumu uz tÄmu {TOPIC}")
time.sleep(2)
except KeyboardInterrupt:
print("PublicÄÅ”ana apturÄta.")
finally:
# 6. Apturiet tīkla ciklu un atvienojieties
client.loop_stop()
client.disconnect()
print("Atvienots no brokera.")
VienkÄrÅ”a MQTT abonenta izveide (subscriber.py)
Å is skripts izveidos savienojumu ar to paÅ”u brokeri, abonÄs tÄmu `python/mqtt/test` un izdrukÄs visus saÅemtos ziÅojumus.
Izveidojiet citu failu ar nosaukumu `subscriber.py`:
import paho.mqtt.client as mqtt
# --- KonfigurÄcija ---
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Atzvana funkcijas ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Savienojums ar MQTT brokeri izveidots!")
# AbonÄjiet tÄmu pÄc veiksmÄ«ga savienojuma
client.subscribe(TOPIC)
else:
print(f"NeizdevÄs izveidot savienojumu, atgrieÅ”anas kods {rc}")
def on_message(client, userdata, msg):
# DekodÄjiet ziÅojuma lietderÄ«go slodzi no baitiem uz virkni
payload = msg.payload.decode()
print(f"SaÅemts ziÅojums: `{payload}` tÄmÄ `{msg.topic}`")
# --- Galvenais skripts ---
# 1. Izveidojiet klienta instanci
client = mqtt.Client("SubscriberClient")
# 2. PieŔķiriet atzvana funkcijas
client.on_connect = on_connect
client.on_message = on_message
# 3. Savienojieties ar brokeri
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Palaidiet tÄ«kla ciklu (bloÄ·ÄjoÅ”s izsaukums)
# Å Ä« funkcija automÄtiski apstrÄdÄ atkÄrtotu savienoÅ”anos un ziÅojumu apstrÄdi.
print("Abonents klausÄs...")
client.loop_forever()
PiemÄra palaiÅ”ana
- Atveriet divus atseviŔķus terminÄļa logus.
- PirmajÄ terminÄlÄ« palaidiet abonenta skriptu:
python subscriber.py - Jums vajadzÄtu redzÄt ziÅojumu "Abonents klausÄs...". Tagad tas gaida ziÅojumus.
- OtrajÄ terminÄlÄ« palaidiet publicÄtÄja skriptu:
python publisher.py - JÅ«s redzÄsiet, ka publicÄtÄjs sÅ«ta ziÅojumus ik pÄc divÄm sekundÄm. TajÄ paÅ”Ä laikÄ Å”ie ziÅojumi parÄdÄ«sies abonenta terminÄļa logÄ.
Apsveicam! JÅ«s tikko esat izveidojis pilnÄ«gu, strÄdÄjoÅ”u MQTT komunikÄcijas sistÄmu, izmantojot Python.
Ärpus pamatiem: Papildu Paho-MQTT funkcijas
ReÄlÄs pasaules IoT sistÄmas prasa lielÄku robustumu nekÄ mÅ«su vienkÄrÅ”ais piemÄrs. IzpÄtÄ«sim dažas papildu MQTT funkcijas, kas ir bÅ«tiskas, lai izveidotu ražoÅ”anai gatavas lietojumprogrammas.
PÄdÄjÄ griba un testaments (LWT)
Kas notiek, ja kritiska ierÄ«ce, piemÄram, droŔības kamera vai sirds monitors, negaidÄ«ti atvienojas strÄvas padeves pÄrtraukuma vai tÄ«kla zuduma dÄļ? LWT funkcija ir MQTT risinÄjums. Kad klients izveido savienojumu, tas var reÄ£istrÄt "pÄdÄjÄs gribas" ziÅojumu pie brokera. Ja klients atvienojas nekorekti (nenosÅ«tot DISCONNECT paketi), brokeris automÄtiski publicÄs Å”o pÄdÄjÄs gribas ziÅojumu tÄ vÄrdÄ uz norÄdÄ«to tÄmu.
Tas ir nenovÄrtÄjami ierÄ«ces statusa uzraudzÄ«bai. JÅ«s varat likt ierÄ«cei publicÄt `ierices/ierice-123/statuss` ziÅojumu ar saturu `"online"`, kad tÄ savienojas, un reÄ£istrÄt LWT ziÅojumu ar to paÅ”u tÄmu, bet ar saturu `"offline"`. JebkurÅ” uzraudzÄ«bas pakalpojums, kas abonÄjis Å”o tÄmu, nekavÄjoties uzzinÄs ierÄ«ces statusu.
Lai ieviestu LWT Paho-MQTT, jÅ«s to iestatÄt pirms savienojuma izveides:
client.will_set('devices/device-123/status', payload='offline', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
SaglabÄtie ziÅojumi (Retained Messages)
Parasti, ja abonents izveido savienojumu ar tÄmu, tas saÅems tikai tos ziÅojumus, kas tiek publicÄti pÄc tam, kad tas ir abonÄjis. Bet ko darÄ«t, ja jums nekavÄjoties nepiecieÅ”ama jaunÄkÄ vÄrtÄ«ba? Å im nolÅ«kam ir paredzÄti saglabÄtie ziÅojumi. Kad ziÅojums tiek publicÄts ar `retain` karodziÅu, kas iestatÄ«ts uz `True`, brokeris saglabÄ Å”o ziÅojumu konkrÄtajai tÄmai. Katru reizi, kad jauns klients abonÄ Å”o tÄmu, tas nekavÄjoties saÅems pÄdÄjo saglabÄto ziÅojumu.
Tas ir ideÄli piemÄrots statusa informÄcijai. IerÄ«ce var publicÄt savu stÄvokli (piem., `{"state": "ON"}`) ar `retain=True`. Jebkura lietojumprogramma, kas startÄjas un abonÄ, nekavÄjoties uzzinÄs ierÄ«ces paÅ”reizÄjo stÄvokli, negaidot nÄkamo atjauninÄjumu.
Paho-MQTT jÅ«s vienkÄrÅ”i pievienojat `retain` karodziÅu savam publicÄÅ”anas izsaukumam:
client.publish(TOPIC, payload, qos=1, retain=True)
PastÄvÄ«gÄs sesijas un tÄ«rÄs sesijas
`clean_session` karodziÅÅ” klienta savienojuma pieprasÄ«jumÄ kontrolÄ, kÄ brokeris apstrÄdÄ klienta sesiju.
- Tīra sesija (
clean_session=True, noklusÄjums): Kad klients atvienojas, brokeris atmet visu informÄciju par to, ieskaitot tÄ abonementus un jebkurus rindÄ esoÅ”os QoS 1 vai 2 ziÅojumus. Kad tas atkal izveido savienojumu, tas ir kÄ pilnÄ«gi jauns klients. - PastÄvÄ«ga sesija (
clean_session=False): Kad klients ar unikÄlu klienta ID izveido Å”Ädu savienojumu, brokeris saglabÄ tÄ sesiju pÄc atvienoÅ”anÄs. Tas ietver tÄ abonementus un jebkurus QoS 1 vai 2 ziÅojumus, kas tika publicÄti, kamÄr tas bija bezsaistÄ. Kad klients atkal izveido savienojumu, brokeris nosÅ«ta visus nokavÄtos ziÅojumus. Tas ir bÅ«tiski svarÄ«gi ierÄ«cÄm neuzticamos tÄ«klos, kuras nevar atļauties zaudÄt kritiskas komandas.
Lai izveidotu pastÄvÄ«gu sesiju, jums ir jÄnodroÅ”ina stabils, unikÄls klienta ID un jÄiestata `clean_session=False`, veidojot klienta instanci:
client = mqtt.Client(client_id="my-persistent-device-001", clean_session=False)
DroŔība nav izvÄle: MQTT nodroÅ”inÄÅ”ana ar Python
JebkurÄ reÄlÄs pasaules lietojumprogrammÄ droŔība ir vissvarÄ«gÄkÄ. NenodroÅ”inÄts MQTT brokeris ir atvÄrts uzaicinÄjums ļaundariem noklausÄ«ties jÅ«su datus, sÅ«tÄ«t viltus komandas jÅ«su ierÄ«cÄm vai uzsÄkt pakalpojumatteices uzbrukumus. MQTT nodroÅ”inÄÅ”ana ietver trÄ«s galvenos pÄ«lÄrus: autentifikÄciju, Å”ifrÄÅ”anu un autorizÄciju.
AutentifikÄcija: Kas jÅ«s esat?
AutentifikÄcija pÄrbauda klienta identitÄti, kas savienojas ar brokeri. VienkÄrÅ”ÄkÄ metode ir lietotÄjvÄrda un paroles izmantoÅ”ana. JÅ«s varat konfigurÄt savu Mosquitto brokeri, lai tas pieprasÄ«tu akreditÄcijas datus, un pÄc tam tos norÄdÄ«t savÄ Python klientÄ.
SavÄ Python klientÄ izmantojiet `username_pw_set()` metodi:
client.username_pw_set(username="myuser", password="mypassword")
client.connect(BROKER_ADDRESS, PORT, 60)
Å ifrÄÅ”ana: Datu aizsardzÄ«ba pÄrsÅ«tīŔanas laikÄ ar TLS/SSL
LietotÄjvÄrdam un parolei ir maza jÄga, ja tie tiek sÅ«tÄ«ti kÄ vienkÄrÅ”s teksts tÄ«klÄ. Å ifrÄÅ”ana nodroÅ”ina, ka visa komunikÄcija starp klientu un brokeri ir Å”ifrÄta un nav lasÄma nevienam, kas noklausÄs tÄ«klu. Tas tiek panÄkts, izmantojot transporta slÄÅa droŔību (TLS), to paÅ”u tehnoloÄ£iju, kas nodroÅ”ina vietÅu droŔību (HTTPS).
Lai izmantotu TLS ar MQTT (bieži sauktu par MQTTS), jums ir jÄkonfigurÄ savs brokeris, lai tas to atbalstÄ«tu (parasti uz 8883. porta), un jÄnodroÅ”ina nepiecieÅ”amie sertifikÄti savam klientam. Tas parasti ietver sertifikÄtu autoritÄtes (CA) sertifikÄtu, lai pÄrbaudÄ«tu brokera identitÄti.
Paho-MQTT jūs izmantojat `tls_set()` metodi:
client.tls_set(ca_certs="path/to/ca.crt")
client.connect(BROKER_ADDRESS, 8883, 60)
AutorizÄcija: Ko jums ir atļauts darÄ«t?
Kad klients ir autentificÄts, autorizÄcija nosaka, ko tam ir atļauts darÄ«t. PiemÄram, temperatÅ«ras sensoram vajadzÄtu bÅ«t atļautam publicÄt tikai savÄ tÄmÄ (piem., `sensori/temp-A/dati`), bet ne tÄmÄ, ko izmanto rÅ«pnÄ«cas iekÄrtu vadÄ«bai (piem., `rupnica/stavs-1/robots/komanda`). To parasti pÄrvalda brokerÄ«, izmantojot piekļuves kontroles sarakstus (ACL). JÅ«s konfigurÄjat brokeri ar noteikumiem, kas definÄ, kuri lietotÄji var `lasÄ«t` (abonÄt) vai `rakstÄ«t` (publicÄt) noteiktos tÄmu modeļos.
Visu saliekot kopÄ: VienkÄrÅ”s viedÄs vides monitoringa projekts
Izveidosim nedaudz reÄlistiskÄku projektu, lai nostiprinÄtu Å”os jÄdzienus. MÄs simulÄsim sensora ierÄ«ci, kas publicÄ vides datus kÄ JSON objektu, un uzraudzÄ«bas lietojumprogrammu, kas abonÄ Å”os datus un tos parÄda.
Projekta pÄrskats
- Sensors (PublicÄtÄjs): Python skripts, kas simulÄ sensoru, kurÅ” nolasa temperatÅ«ru un mitrumu. Tas iepakos Å”os datus JSON formÄtÄ un publicÄs tos tÄmai `smart_env/device01/telemetry` ik pÄc 5 sekundÄm.
- Monitors (Abonents): Python skripts, kas abonÄ `smart_env/device01/telemetry`, saÅem JSON datus, tos parsÄ un izdrukÄ lietotÄjam draudzÄ«gu statusa atjauninÄjumu.
Sensora kods (sensor_publisher.py)
import paho.mqtt.client as mqtt
import time
import json
import random
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
client = mqtt.Client("SensorDevice01")
client.connect(BROKER_ADDRESS, PORT, 60)
client.loop_start()
print("Sensora publicÄtÄjs ir palaists...")
try:
while True:
# SimulÄjiet sensoru nolasÄ«jumus
temperature = round(random.uniform(20.0, 30.0), 2)
humidity = round(random.uniform(40.0, 60.0), 2)
# Izveidojiet JSON lietderīgo slodzi
payload = {
"laika_zime": time.time(),
"temperatura": temperature,
"mitrums": humidity
}
payload_str = json.dumps(payload)
# PublicÄjiet ziÅojumu ar QoS 1
result = client.publish(TOPIC, payload_str, qos=1)
result.wait_for_publish() # BloÄ·Äjiet, lÄ«dz publicÄÅ”ana ir apstiprinÄta
print(f"PublicÄts: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("Sensora publicÄtÄjs tiek apturÄts...")
finally:
client.loop_stop()
client.disconnect()
Monitoringa paneļa kods (monitor_subscriber.py)
import paho.mqtt.client as mqtt
import json
import datetime
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
def on_connect(client, userdata, flags, rc):
print(f"Savienojums izveidots ar rezultÄta kodu {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- SaÅemts jauns ziÅojums ---")
try:
# DekodÄjiet lietderÄ«gÄs slodzes virkni un parsÄjiet to kÄ JSON
payload = json.loads(msg.payload.decode())
timestamp = datetime.datetime.fromtimestamp(payload.get('laika_zime'))
temperature = payload.get('temperatura')
humidity = payload.get('mitrums')
print(f"Ierīce: {msg.topic}")
print(f"Laiks: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Temperatūra: {temperature}°C")
print(f"Mitrums: {humidity}%")
except json.JSONDecodeError:
print("Kļūda, dekodÄjot JSON lietderÄ«go slodzi.")
except Exception as e:
print(f"Notika kļūda: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("Monitoringa panelis darbojas...")
client.loop_forever()
No prototipa lÄ«dz ražoÅ”anai: MQTT labÄkÄs prakses
Projekta pÄrvÄrÅ”ana no vienkÄrÅ”a skripta par robustu, mÄrogojamu ražoÅ”anas sistÄmu prasa rÅ«pÄ«gu plÄnoÅ”anu. Å eit ir dažas bÅ«tiskas labÄkÄs prakses:
- Izveidojiet skaidru tÄmu hierarhiju: RÅ«pÄ«gi plÄnojiet savu tÄmu struktÅ«ru jau no paÅ”a sÄkuma. Laba hierarhija ir aprakstoÅ”a, mÄrogojama un ļauj elastÄ«gi abonÄt, izmantojot aizstÄjÄjzÄ«mes. IzplatÄ«ts modelis ir
./ / / / - Korekti apstrÄdÄjiet tÄ«kla atvienoÅ”anos: TÄ«kli ir neuzticami. JÅ«su klienta kodam ir jÄievieÅ” robusta atkÄrtotas savienoÅ”anÄs loÄ£ika. `on_disconnect` atzvana funkcija Paho-MQTT ir ideÄla vieta, kur to sÄkt, ievieÅ”ot tÄdu stratÄÄ£iju kÄ eksponenciÄlÄ atkÄpÅ”anÄs, lai izvairÄ«tos no tÄ«kla pÄrslogoÅ”anas ar atkÄrtotas savienoÅ”anÄs mÄÄ£inÄjumiem.
- Izmantojiet strukturÄtas datu lietderÄ«gÄs slodzes: VienmÄr izmantojiet strukturÄtu datu formÄtu, piemÄram, JSON vai Protocol Buffers, savu ziÅojumu lietderÄ«gajÄm slodzÄm. Tas padara jÅ«su datus paÅ”aprakstoÅ”us, versijÄjamus un viegli parsÄjamus dažÄdÄm lietojumprogrammÄm (rakstÄ«tÄm jebkurÄ valodÄ).
- NodroÅ”iniet visu pÄc noklusÄjuma: Neizvietojiet IoT sistÄmu bez droŔības. KÄ minimums, izmantojiet lietotÄjvÄrda/paroles autentifikÄciju un TLS Å”ifrÄÅ”anu. AugstÄkas droŔības vajadzÄ«bÄm izpÄtiet uz klienta sertifikÄtiem balstÄ«tu autentifikÄciju.
- PÄrraugiet savu brokeri: RažoÅ”anas vidÄ jÅ«su MQTT brokeris ir kritiska infrastruktÅ«ras daļa. Izmantojiet uzraudzÄ«bas rÄ«kus, lai sekotu lÄ«dzi tÄ stÄvoklim, ieskaitot CPU/atmiÅas lietojumu, savienoto klientu skaitu, ziÅojumu pÄrraides Ätrumu un nomestos ziÅojumus. Daudzi brokeri atklÄj Ä«paÅ”u `$SYS` tÄmu hierarhiju, kas sniedz Å”o statusa informÄciju.
NoslÄgums: JÅ«su ceļojums ar Python un MQTT
MÄs esam ceļojuÅ”i no fundamentÄlÄ "kÄpÄc" par MQTT lÄ«dz praktiskajam "kÄ", to ievieÅ”ot ar Python. JÅ«s esat uzzinÄjis par publicÄÅ”anas/abonÄÅ”anas modeļa spÄku, QoS nozÄ«mi un droŔības kritisko lomu. JÅ«s esat redzÄjis, kÄ Paho-MQTT bibliotÄka padara pÄrsteidzoÅ”i vienkÄrÅ”u sarežģītu klientu izveidi, kas var publicÄt sensoru datus un abonÄt komandas.
MQTT ir vairÄk nekÄ tikai protokols; tÄ ir fundamentÄla tehnoloÄ£ija lietu internetam. TÄ vieglais raksturs un robustÄs funkcijas ir padarÄ«juÅ”as to par iecienÄ«tÄko izvÄli miljoniem ierÄ«Äu visÄ pasaulÄ, no viedajÄm pilsÄtÄm lÄ«dz savienotai lauksaimniecÄ«bai un rÅ«pnieciskajai automatizÄcijai.
Ceļojums Å”eit nebeidzas. NÄkamais solis ir izmantot Å”os jÄdzienus un pielietot tos reÄlai aparatÅ«rai. EksperimentÄjiet ar Raspberry Pi, ESP32 vai citiem mikrokontrolleriem. Pievienojiet fiziskus sensorus, integrÄjiet ar mÄkoÅa IoT platformÄm un veidojiet lietojumprogrammas, kas mijiedarbojas ar fizisko pasauli. Ar Python un MQTT jÅ«su rÄ«cÄ«bÄ ir spÄcÄ«gs instrumentu komplekts, lai veidotu nÄkamÄs paaudzes savienotos risinÄjumus.