You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/sr/1-getting-started/lessons/4-connect-internet/README.md

45 KiB

Повежите свој уређај на интернет

Преглед лекције у облику скице

Скица од Nitya Narasimhan. Кликните на слику за већу верзију.

Ова лекција је део серије Hello IoT коју организује Microsoft Reactor. Лекција је представљена кроз два видеа - један сат лекције и један сат додатних консултација са дубљим објашњењима и одговорима на питања.

Лекција 4: Повежите свој уређај на интернет

Лекција 4: Повежите свој уређај на интернет - Консултације

🎥 Кликните на слике изнад да бисте погледали видео записе

Квиз пре лекције

Квиз пре лекције

Увод

И у IoT означава Интернет - облачну повезаност и услуге које омогућавају многе функције IoT уређаја, од прикупљања мерења са сензора повезаних са уређајем до слања порука за контролу актуатора. IoT уређаји обично се повезују са једном облачном IoT услугом користећи стандардни комуникациони протокол, а та услуга је повезана са остатком ваше IoT апликације, од AI услуга за доношење паметних одлука на основу података до веб апликација за контролу или извештавање.

🎓 Подаци прикупљени са сензора и послати у облак називају се телеметрија.

IoT уређаји могу примати поруке из облака. Често те поруке садрже команде - инструкције за извршавање одређене радње, било интерно (као што је поновно покретање или ажурирање фирмвера), или помоћу актуатора (као што је укључивање светла).

Ова лекција представља неке од комуникационих протокола које IoT уређаји могу користити за повезивање са облаком, као и типове података које могу слати или примати. Такође ћете практично радити са њима, додајући интернет контролу вашем ноћном светлу, премештајући логику контроле LED-а у 'серверски' код који се локално извршава.

У овој лекцији обрадићемо:

Комуникациони протоколи

Постоји велики број популарних комуникационих протокола које IoT уређаји користе за комуникацију са интернетом. Најпопуларнији су засновани на објављивању/претплати на поруке преко неког брокера. IoT уређаји се повезују са брокером и објављују телеметрију и претплаћују се на команде. Облачне услуге такође се повезују са брокером, претплаћују се на све поруке телеметрије и објављују команде, било за одређене уређаје или за групе уређаја.

IoT уређаји се повезују са брокером, објављују телеметрију и претплаћују се на команде. Облачне услуге се повезују са брокером, претплаћују се на све телеметријске поруке и шаљу команде одређеним уређајима.

MQTT је најпопуларнији комуникациони протокол за IoT уређаје и обрађен је у овој лекцији. Остали протоколи укључују AMQP и HTTP/HTTPS.

Message Queueing Telemetry Transport (MQTT)

MQTT је лаган, отворени стандард за слање порука између уређаја. Дизајниран је 1999. године за праћење нафтовода, а IBM га је 15 година касније објавио као отворени стандард.

MQTT има једног брокера и више клијената. Сви клијенти се повезују са брокером, а брокер усмерава поруке релевантним клијентима. Поруке се усмеравају користећи именоване теме, уместо да се шаљу директно појединачном клијенту. Клијент може објавити поруку на одређену тему, а сви клијенти који су претплаћени на ту тему добиће поруку.

IoT уређај објављује телеметрију на теми /telemetry, а облачна услуга се претплаћује на ту тему

Урадите истраживање. Ако имате велики број IoT уређаја, како можете осигурати да ваш MQTT брокер може обрадити све поруке?

Повежите свој IoT уређај са MQTT

Први корак у додавању интернет контроле вашем ноћном светлу је повезивање са MQTT брокером.

Задатак

Повежите свој уређај са MQTT брокером.

У овом делу лекције, повезаћете свој IoT ноћни светло са интернетом како би могло бити даљински контролисано. Касније у лекцији, ваш IoT уређај ће послати телеметријску поруку преко MQTT-а јавном MQTT брокеру са нивоом светлости, где ће је преузети серверски код који ћете написати. Овај код ће проверити ниво светлости и послати командну поруку назад уређају са инструкцијама да укључи или искључи LED.

Реални пример за овакву поставку могао би бити прикупљање података са више сензора светлости пре него што се одлучи да се укључе светла, на локацији са много светала, као што је стадион. Ово би могло спречити укључивање светала ако је само један сензор покривен облацима или птицом, али остали сензори детектују довољно светлости.

Које друге ситуације би захтевале процену података са више сензора пре слања команди?

Уместо да се бавите сложеностима постављања MQTT брокера као део овог задатка, можете користити јавни тест сервер који покреће Eclipse Mosquitto, отворени MQTT брокер. Овај тест брокер је јавно доступан на test.mosquitto.org и не захтева креирање налога, што га чини одличним алатом за тестирање MQTT клијената и сервера.

💁 Овај тест брокер је јаван и није сигуран. Свако може слушати оно што објављујете, па се не би требало користити за податке који морају остати приватни.

Дијаграм задатка који приказује читање и проверу нивоа светлости, и контролу LED-а

Пратите релевантне кораке испод да бисте повезали свој уређај са MQTT брокером:

Детаљније о MQTT-у

Теме могу имати хијерархију, а клијенти могу да се претплате на различите нивое хијерархије користећи замене. На пример, можете слати телеметријске поруке о температури на тему /telemetry/temperature и поруке о влажности на тему /telemetry/humidity, а затим у вашој облачној апликацији претплатити се на тему /telemetry/* да бисте примали и поруке о температури и влажности.

Поруке могу бити послате са различитим нивоима квалитета услуге (QoS), што одређује гаранцију да ће порука бити примљена.

  • Највише једном - порука се шаље само једном, а клијент и брокер не предузимају додатне кораке за потврду испоруке (пошаљи и заборави).
  • Најмање једном - порука се више пута шаље од стране пошиљаоца док се не добије потврда (потврђена испорука).
  • Тачно једном - пошиљалац и прималац се ангажују у двостепеном процесу потврде како би осигурали да се само једна копија поруке прими (загарантована испорука).

Које ситуације би захтевале загарантовану испоруку поруке уместо "пошаљи и заборави"?

Иако назив укључује Message Queueing (MQ у MQTT), протокол заправо не подржава редове порука. То значи да ако се клијент искључи, па поново повеже, неће примити поруке послате током искључења, осим оних које је већ почео да обрађује кроз QoS процес. Поруке могу имати заставицу за задржавање. Ако је ова заставица постављена, MQTT брокер ће чувати последњу поруку послату на тему са овом заставицом и послати је свим клијентима који се касније претплате на тему. На овај начин, клијенти ће увек добити најновију поруку.

MQTT такође подржава функцију одржавања везе која проверава да ли је веза још увек активна током дугих пауза између порука.

🦟 Mosquitto из Eclipse Foundation има бесплатан MQTT брокер који можете сами покренути за експериментисање са MQTT-ом, као и јавни MQTT брокер који можете користити за тестирање вашег кода, хостован на test.mosquitto.org.

MQTT везе могу бити јавне и отворене, или шифроване и обезбеђене коришћењем корисничких имена и лозинки, или сертификата.

💁 MQTT комуницира преко TCP/IP-а, истог основног мрежног протокола као HTTP, али на другом порту. Такође можете користити MQTT преко вебсокета за комуникацију са веб апликацијама које се извршавају у претраживачу, или у ситуацијама где заштитни зидови или друга мрежна правила блокирају стандардне MQTT везе.

Телеметрија

Реч телеметрија потиче од грчких корена који значе "мерити на даљину". Телеметрија је чин прикупљања података са сензора и слања у облак.

💁 Један од најранијих телеметријских уређаја изумљен је у Француској 1874. године и слао је податке о времену и дубини снега у реалном времену са Мон Блана у Париз. Користио је физичке жице јер бежичне технологије тада нису биле доступне.

Погледајмо пример паметног термостата из Лекције 1.

Термостат повезан на интернет који користи више сензора у просторијама

Термостат има сензоре температуре за прикупљање телеметрије. Вероватно би имао један уграђени сензор температуре, а могао би се повезати са више спољних сензора температуре преко бежичног протокола као што је Bluetooth Low Energy (BLE).

Пример телеметријских података које би слао могао би бити:

Име Вредност Опис
thermostat_temperature 18°C Температура измерена уграђеним сензором температуре термостата
livingroom_temperature 19°C Температура измерена удаљеним сензором температуре који је назван livingroom ради идентификације просторије у којој се налази
bedroom_temperature 21°C Температура измерена удаљеним сензором температуре који је назван bedroom ради идентификације просторије у којој се налази

Облачна услуга може користити ове телеметријске податке за доношење одлука о томе које команде да пошаље за контролу грејања.

Слање телеметрије са вашег IoT уређаја

Следећи корак у додавању интернет контроле вашем ноћном светлу је слање телеметрије о нивоу светлости MQTT брокеру на телеметријску тему.

Задатак - слање телеметрије са вашег IoT уређаја

Пошаљите телеметрију о нивоу светлости MQTT брокеру.

Подаци се шаљу кодирани као JSON - скраћеница за JavaScript Object Notation, стандард за кодирање података у тексту користећи парове кључ/вредност.

Ако нисте раније наишли на JSON, можете сазнати више о њему на JSON.org документацији.

Пратите релевантне кораке испод да бисте послали телеметрију са вашег уређаја MQTT брокеру:

Примање телеметрије од MQTT брокера

Нема смисла слати телеметрију ако нема никога на другом крају да је слуша. Телеметрија о нивоу светлости захтева нешто што ће је слушати и обрађивати податке. Овај 'серверски' код је врста кода коју ћете поставити на облачну услугу као део веће IoT апликације, али овде ћете овај код извршавати локално на вашем рачунару (или на вашем Raspberry Pi-ју ако директно радите на њему). Серверски код се састоји од Python апликације која слуша телеметријске поруке преко MQTT-а са нивоима светлости. Касније у лекцији, учинићете да одговара командном поруком са инструкцијама за укључивање или искључивање LED-а.

Урадите истраживање: Шта се дешава са MQTT порукама ако нема слушаоца?

Инсталирајте Python и VS Code

Ако немате Python и VS Code инсталиране локално, потребно је да их инсталирате како бисте писали серверски код. Ако користите виртуелни IoT уређај или радите на вашем Raspberry Pi-ју, можете прескочити овај корак јер би требало да су већ инсталирани и конфигурисани.

Задатак - инсталирајте Python и VS Code

Инсталирајте Python и VS Code.

  1. Инсталирајте Python. Погледајте страницу за преузимање Python-а за упутства о инсталирању најновије верзије Python-а.

  2. Инст 💁 Слободно користите било који Python IDE или уређивач за ове лекције ако имате омиљени алат, али лекције ће давати упутства заснована на коришћењу VS Code.

  3. Инсталирајте Pylance екстензију за VS Code. Ово је екстензија за VS Code која пружа подршку за Python језик. Погледајте документацију за Pylance екстензију за упутства о инсталирању ове екстензије у VS Code.

Конфигуришите Python виртуелно окружење

Једна од моћних карактеристика Python-а је могућност инсталирања pip пакета - то су пакети кода које су написали други људи и објавили на интернету. Можете инсталирати pip пакет на свој рачунар једном командом, а затим користити тај пакет у свом коду. Користићете pip за инсталирање пакета за комуникацију преко MQTT-а.

Подразумевано, када инсталирате пакет, он је доступан свуда на вашем рачунару, што може довести до проблема са верзијама пакета - на пример, једна апликација зависи од једне верзије пакета која престаје да ради када инсталирате нову верзију за другу апликацију. Да бисте заобишли овај проблем, можете користити Python виртуелно окружење, које је у суштини копија Python-а у посебном фолдеру, а када инсталирате pip пакете, они се инсталирају само у тај фолдер.

Задатак - конфигуришите Python виртуелно окружење

Конфигуришите Python виртуелно окружење и инсталирајте MQTT pip пакете.

  1. Из вашег терминала или командне линије, покрените следеће команде на локацији по вашем избору да бисте креирали и прешли у нови директоријум:

    mkdir nightlight-server
    cd nightlight-server
    
  2. Сада покрените следеће команде да бисте креирали виртуелно окружење у .venv фолдеру:

    python3 -m venv .venv
    

    💁 Потребно је експлицитно позвати python3 да бисте креирали виртуелно окружење у случају да имате инсталиран Python 2 поред Python 3 (најновије верзије). Ако имате инсталиран Python 2, позивање python ће користити Python 2 уместо Python 3.

  3. Активирајте виртуелно окружење:

    • На Windows-у:

      • Ако користите Command Prompt или Command Prompt преко Windows Terminal-а, покрените:

        .venv\Scripts\activate.bat
        
      • Ако користите PowerShell, покрените:

        .\.venv\Scripts\Activate.ps1
        
    • На macOS-у или Linux-у, покрените:

      source ./.venv/bin/activate
      

    💁 Ове команде треба покренути са исте локације на којој сте покренули команду за креирање виртуелног окружења. Никада нећете морати да улазите у .venv фолдер, увек треба да покренете команду за активацију и било које команде за инсталирање пакета или покретање кода из фолдера у којем сте креирали виртуелно окружење.

  4. Када је виртуелно окружење активирано, подразумевана python команда ће покренути верзију Python-а која је коришћена за креирање виртуелног окружења. Покрените следеће да бисте добили верзију:

    python --version
    

    Излаз ће бити сличан следећем:

    (.venv) ➜  nightlight-server python --version
    Python 3.9.1
    

    💁 Ваша Python верзија може бити другачија - све док је верзија 3.6 или новија, све је у реду. Ако није, обришите овај фолдер, инсталирајте новију верзију Python-а и покушајте поново.

  5. Покрените следеће команде да бисте инсталирали pip пакет за Paho-MQTT, популарну MQTT библиотеку.

    pip install paho-mqtt
    

    Овај pip пакет ће бити инсталиран само у виртуелном окружењу и неће бити доступан ван њега.

Напишите серверски код

Сада можете написати серверски код у Python-у.

Задатак - напишите серверски код

Напишите серверски код.

  1. Из вашег терминала или командне линије, покрените следеће унутар виртуелног окружења да бисте креирали Python фајл под називом app.py:

    • На Windows-у покрените:

      type nul > app.py
      
    • На macOS-у или Linux-у покрените:

      touch app.py
      
  2. Отворите тренутни фолдер у VS Code:

    code .
    
  3. Када се VS Code покрене, активираће Python виртуелно окружење. Ово ће бити приказано у доњој статусној траци:

    VS Code приказује изабрано виртуелно окружење

  4. Ако је VS Code терминал већ покренут када се VS Code отвори, виртуелно окружење неће бити активирано у њему. Најлакше је угасити терминал помоћу дугмета Kill the active terminal instance:

    VS Code дугме за гашење активног терминала

  5. Покрените нови VS Code терминал избором Terminal -> New Terminal, или притиском на CTRL+`. Нови терминал ће учитати виртуелно окружење, са позивом за активацију који ће се појавити у терминалу. Име виртуелног окружења (.venv) ће такође бити у промпту:

    ➜  nightlight-server source .venv/bin/activate
    (.venv) ➜  nightlight 
    
  6. Отворите app.py фајл из VS Code explorer-а и додајте следећи код:

    import json
    import time
    
    import paho.mqtt.client as mqtt
    
    id = '<ID>'
    
    client_telemetry_topic = id + '/telemetry'
    client_name = id + 'nightlight_server'
    
    mqtt_client = mqtt.Client(client_name)
    mqtt_client.connect('test.mosquitto.org')
    
    mqtt_client.loop_start()
    
    def handle_telemetry(client, userdata, message):
        payload = json.loads(message.payload.decode())
        print("Message received:", payload)
    
    mqtt_client.subscribe(client_telemetry_topic)
    mqtt_client.on_message = handle_telemetry
    
    while True:
        time.sleep(2)
    

    Замените <ID> у линији 6 са јединственим ID-јем који сте користили приликом креирања кода за уређај.

    ⚠️ Ово мора бити исти ID који сте користили на свом уређају, иначе серверски код неће претплатити или објављивати на праву тему.

    Овај код креира MQTT клијент са јединственим именом и повезује се са test.mosquitto.org брокером. Затим покреће процесни циклус који ради у позадинској нити и слуша поруке на било којим претплаћеним темама.

    Клијент се затим претплаћује на поруке на телеметријској теми и дефинише функцију која се позива када се порука прими. Када се прими телеметријска порука, позива се функција handle_telemetry, која штампа примљену поруку у конзолу.

    На крају, бесконачна петља одржава апликацију активном. MQTT клијент слуша поруке у позадинској нити и ради све време док је главна апликација активна.

  7. Из VS Code терминала, покрените следеће да бисте покренули вашу Python апликацију:

    python app.py
    

    Апликација ће почети да слуша поруке са IoT уређаја.

  8. Уверите се да ваш уређај ради и шаље телеметријске поруке. Подесите ниво светлости који детектује ваш физички или виртуелни уређај. Примљене поруке ће бити исписане у терминалу.

    (.venv) ➜  nightlight-server python app.py
    Message received: {'light': 0}
    Message received: {'light': 400}
    

    Фајл app.py у виртуелном окружењу nightlight мора бити покренут да би фајл app.py у виртуелном окружењу nightlight-server примао поруке које се шаљу.

💁 Овај код можете пронаћи у code-server/server фолдеру.

Колико често треба слати телеметрију?

Једно важно питање код телеметрије је колико често треба мерити и слати податке? Одговор је - зависи. Ако често мерите, можете брже реаговати на промене у мерењима, али користите више енергије, више пропусног опсега, генеришете више података и треба вам више ресурса у облаку за обраду. Треба мерити довољно често, али не превише често.

За термостат, мерење сваких неколико минута је вероватно више него довољно јер се температуре не мењају тако често. Ако мерите само једном дневно, могли бисте завршити са грејањем куће за ноћне температуре усред сунчаног дана, док ако мерите сваке секунде, имаћете хиљаде непотребно дуплираних мерења температуре која ће утицати на брзину и пропусни опсег интернета корисника (проблем за људе са ограниченим плановима пропусног опсега), користити више енергије што може бити проблем за уређаје на батерије као што су удаљени сензори, и повећати трошкове ресурса за обраду и складиштење у облаку.

Ако пратите податке око машине у фабрици која, ако се поквари, може изазвати катастрофалну штету и милионе долара изгубљеног прихода, онда мерење више пута у секунди може бити неопходно. Боље је потрошити пропусни опсег него пропустити телеметрију која указује да машину треба зауставити и поправити пре него што се поквари.

💁 У овој ситуацији, могли бисте размотрити коришћење edge уређаја за обраду телеметрије како бисте смањили ослањање на интернет.

Губитак конекције

Интернет конекције могу бити непоуздане, са честим прекидима. Шта би IoT уређај требало да ради у овим околностима - да ли би требало да изгуби податке или да их чува док се конекција не обнови? Опет, одговор је - зависи.

За термостат, подаци се вероватно могу изгубити чим се узме ново мерење температуре. Грејни систем не брине о томе да је пре 20 минута температура била 20.5°C ако је сада 19°C, садашња температура одређује да ли грејање треба да буде укључено или искључено.

За машине можда желите да задржите податке, посебно ако се користе за праћење трендова. Постоје модели машинског учења који могу детектовати аномалије у токовима података гледајући податке из одређеног временског периода (као што је последњи сат) и уочавајући аномалне податке. Ово се често користи за предиктивно одржавање, тражећи индикације да би нешто могло ускоро да се поквари како бисте могли да поправите или замените пре него што се то догоди. Можда ћете желети да сваки део телеметрије за машину буде послат како би се обрадио за детекцију аномалија, тако да када IoT уређај поново успостави конекцију, он ће послати сву телеметрију генерисану током прекида интернет конекције.

Дизајнери IoT уређаја такође треба да размотре да ли се IoT уређај може користити током прекида интернет конекције или губитка сигнала због локације. Паметни термостат би требало да буде у стању да донесе неке ограничене одлуке за контролу грејања ако не може да шаље телеметрију у облак због прекида.

Овај Ferrari је постао неупотребљив јер је неко покушао да га ажурира под земљом где нема сигнала

Да би MQTT обрадио губитак конекције, уређај и серверски код ће морати да буду одговорни за осигурање испоруке порука ако је то потребно, на пример захтевањем да све послате поруке буду одговорене додатним порукама на теми за одговор, а ако нису, да се ручно ставе у ред за касније слање.

Команде

Команде су поруке које облак шаље уређају, упућујући га да уради нешто. Већину времена то укључује давање неке врсте излаза преко актуатора, али то може бити и инструкција за сам уређај, као што је поновно покретање или прикупљање додатне телеметрије и враћање као одговор на команду.

Интернет повезан термостат прима команду да укључи грејање

Термостат би могао примити команду из облака да укључи грејање. На основу телеметријских података са свих сензора, ако је облачна услуга одлучила да грејање треба да буде укључено, шаље одговарајућу команду.

Слање команди MQTT брокеру

Следећи корак за наш интернет контролисани ноћни светлосни уређај је да серверски код пошаље команду назад IoT уређају како би контролисао светло на основу нивоа светлости које детектује.

  1. Отворите серверски код у VS Code-у

  2. Додајте следећу линију након декларације client_telemetry_topic да дефинишете на коју тему ће се слати команде:

    server_command_topic = id + '/commands'
    
  3. Додајте следећи код на крај функције handle_telemetry:

    command = { 'led_on' : payload['light'] < 300 }
    print("Sending message:", command)
    
    client.publish(server_command_topic, json.dumps(command))
    

    Ово шаље JSON поруку на тему команде са вредношћу led_on постављеном на true или false у зависности од тога да ли је светло мање од 300 или не. Ако је светло мање од 300, шаље се true да би се уређају наложило да укључи LED.

  4. Покрените код као и раније

  5. Подесите ниво светлости који детектује ваш физички или виртуелни уређај. Примљене поруке и послате команде ће бити исписане у терминалу:

    (.venv) ➜  nightlight-server python app.py
    Message received: {'light': 0}
    Sending message: {'led_on': True}
    Message received: {'light': 400}
    Sending message: {'led_on': False}
    

💁 Телеметрија и команде се шаљу на једну тему свако. То значи да ће телеметрија са више уређаја бити приказана на истој телеметријској теми, а команде за више уређаја ће бити приказане на истој теми за команде. Ако желите да пошаљете команду одређеном уређају, могли бисте користити више тема, именованих са јединственим ID-јем уређаја, као што су /commands/device1, /commands/device2. На тај начин уређај може слушати поруке намењене само том уређају.

💁 Овај код можете пронаћи у code-commands/server фолдеру.

Обрада команди на IoT уређају

Сада када се команде шаљу са сервера, можете додати код на IoT уређај да их обради и контролише LED.

Пратите одговарајући корак испод да бисте слушали команде са MQTT брокера:

Када је овај код написан и покренут, експериментишите са променом нивоа светлости. Пратите излаз са сервера и уређаја, и посматрајте LED док мењате нивое светлости.

Губитак конекције

Шта би облачна услуга требало да уради ако треба да пошаље команд За ове уређаје, размислите о томе које поруке могу слати или примати. Који телеметријски подаци се шаљу? Које поруке или команде могу примати? Да ли мислите да су безбедни?

Квиз након предавања

Квиз након предавања

Преглед и самостално учење

Прочитајте више о MQTT-у на MQTT Википедији.

Покушајте сами да покренете MQTT брокер користећи Mosquitto и повежите се са њим из вашег IoT уређаја и серверског кода.

💁 Савет - подразумевано Mosquitto не дозвољава анонимне конекције (то јест, повезивање без корисничког имена и лозинке), и не дозвољава конекције са рачунара који није онај на коме се покреће. Ово можете поправити помоћу mosquitto.conf конфигурационог фајла са следећим:

listener 1883 0.0.0.0
allow_anonymous true

Задатак

Упоредите и контрастирајте MQTT са другим комуникационим протоколима


Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.