40 KiB
Hamishia mantiki ya programu yako kwenye wingu
Sketchnote na Nitya Narasimhan. Bofya picha kwa toleo kubwa.
Somo hili lilifundishwa kama sehemu ya Mradi wa IoT kwa Kompyuta - Mfululizo wa Kilimo Kidigitali kutoka Microsoft Reactor.
Jaribio la kabla ya somo
Utangulizi
Katika somo la mwisho, ulijifunza jinsi ya kuunganisha ufuatiliaji wa unyevu wa udongo wa mimea yako na udhibiti wa relay kwenye huduma ya IoT inayotegemea wingu. Hatua inayofuata ni kuhamisha msimbo wa seva unaodhibiti muda wa relay kwenye wingu. Katika somo hili, utajifunza jinsi ya kufanya hivyo kwa kutumia kazi zisizo na seva.
Katika somo hili tutashughulikia:
- Serverless ni nini?
- Unda programu isiyo na seva
- Unda kichocheo cha tukio la IoT Hub
- Tuma maombi ya njia ya moja kwa moja kutoka kwa msimbo usio na seva
- Hamisha msimbo wako usio na seva kwenye wingu
Serverless ni nini?
Serverless, au kompyuta isiyo na seva, inahusisha kuunda vizuizi vidogo vya msimbo vinavyoendeshwa kwenye wingu kwa kujibu aina tofauti za matukio. Tukio linapotokea, msimbo wako unaendeshwa, na unapokea data kuhusu tukio hilo. Matukio haya yanaweza kutoka kwa vitu vingi tofauti, ikiwa ni pamoja na maombi ya wavuti, ujumbe uliowekwa kwenye foleni, mabadiliko ya data kwenye hifadhidata, au ujumbe uliotumwa kwa huduma ya IoT na vifaa vya IoT.
💁 Ikiwa umewahi kutumia vichocheo vya hifadhidata, unaweza kufikiria hili kama kitu sawa, msimbo unaochochewa na tukio kama kuingiza safu.
Msimbo wako unaendeshwa tu tukio linapotokea, hakuna kitu kinachohifadhi msimbo wako ukiwa hai nyakati nyingine. Tukio linatokea, msimbo wako unapakiwa na kuendeshwa. Hii inafanya serverless kuwa na uwezo mkubwa wa kupanuka - ikiwa matukio mengi yanatokea kwa wakati mmoja, mtoa huduma wa wingu anaweza kuendesha kazi yako mara nyingi kadri unavyohitaji kwa wakati mmoja kwenye seva zozote walizonazo. Hasara ya hili ni kwamba ikiwa unahitaji kushiriki taarifa kati ya matukio, unahitaji kuziokoa mahali fulani kama hifadhidata badala ya kuzihifadhi kwenye kumbukumbu.
Msimbo wako unaandikwa kama kazi inayochukua maelezo kuhusu tukio kama parameter. Unaweza kutumia lugha mbalimbali za programu kuandika kazi hizi zisizo na seva.
🎓 Serverless pia inajulikana kama Functions as a Service (FaaS) kwani kila kichocheo cha tukio kinatekelezwa kama kazi katika msimbo.
Licha ya jina, serverless kwa kweli hutumia seva. Jina linatokana na kwamba wewe kama msanidi programu haujali kuhusu seva zinazohitajika kuendesha msimbo wako, unachojali ni kwamba msimbo wako unaendeshwa kwa kujibu tukio. Mtoa huduma wa wingu ana runtime isiyo na seva inayosimamia kugawa seva, mitandao, hifadhi, CPU, kumbukumbu na kila kitu kingine kinachohitajika kuendesha msimbo wako. Mfano huu unamaanisha huwezi kulipa kwa seva kwa huduma, kwani hakuna seva. Badala yake unalipa kwa muda msimbo wako unavyoendeshwa, na kiasi cha kumbukumbu kinachotumika.
💰 Serverless ni mojawapo ya njia za gharama nafuu za kuendesha msimbo kwenye wingu. Kwa mfano, wakati wa kuandika, mtoa huduma mmoja wa wingu huruhusu kazi zako zote zisizo na seva kutekelezwa mara 1,000,000 kwa mwezi kabla ya kuanza kukutoza, na baada ya hapo wanatoza US$0.20 kwa kila utekelezaji 1,000,000. Wakati msimbo wako hauendeshwi, hulipi.
Kama msanidi programu wa IoT, mfano wa serverless ni bora. Unaweza kuandika kazi inayoitwa kwa kujibu ujumbe uliotumwa kutoka kwa kifaa chochote cha IoT kilichounganishwa na huduma yako ya IoT inayohifadhiwa kwenye wingu. Msimbo wako utashughulikia ujumbe wote uliotumwa, lakini utaendeshwa tu unapohitajika.
✅ Angalia tena msimbo uliouandika kama msimbo wa seva unaosikiliza ujumbe kupitia MQTT. Je, unaweza kufikiria jinsi hii inaweza kuendeshwa kwenye wingu kwa kutumia serverless? Je, unafikiri msimbo unaweza kubadilishwa vipi ili kuunga mkono kompyuta isiyo na seva?
💁 Mfano wa serverless unahamia huduma nyingine za wingu pamoja na kuendesha msimbo. Kwa mfano, hifadhidata zisizo na seva zinapatikana kwenye wingu kwa kutumia mfano wa bei ya serverless ambapo unalipa kwa ombi lililofanywa dhidi ya hifadhidata, kama swala au kuingiza, kwa kawaida kwa kutumia bei kulingana na kiasi cha kazi inayofanywa kuhudumia ombi. Kwa mfano, kuchagua safu moja dhidi ya ufunguo wa msingi kutagharimu kidogo kuliko operesheni ngumu inayounganisha meza nyingi na kurudisha maelfu ya safu.
Unda programu isiyo na seva
Huduma ya kompyuta isiyo na seva kutoka Microsoft inaitwa Azure Functions.
Video fupi hapa chini ina muhtasari wa Azure Functions.
🎥 Bofya picha hapo juu kutazama video.
✅ Chukua muda kufanya utafiti na usome muhtasari wa Azure Functions katika Nyaraka za Microsoft Azure Functions.
Ili kuandika Azure Functions, unaanza na programu ya Azure Functions katika lugha unayopendelea. Azure Functions inasaidia Python, JavaScript, TypeScript, C#, F#, Java, na Powershell. Katika somo hili utajifunza jinsi ya kuandika programu ya Azure Functions kwa kutumia Python.
💁 Azure Functions pia inasaidia wahandisi maalum ili uweze kuandika kazi zako katika lugha yoyote inayounga mkono maombi ya HTTP, ikiwa ni pamoja na lugha za zamani kama COBOL.
Programu za Functions zinajumuisha moja au zaidi vichocheo - kazi zinazojibu matukio. Unaweza kuwa na vichocheo vingi ndani ya programu moja ya Functions, vyote vikishiriki usanidi wa kawaida. Kwa mfano, katika faili ya usanidi wa programu yako ya Functions unaweza kuwa na maelezo ya muunganisho wa IoT Hub yako, na kazi zote katika programu zinaweza kutumia hii kuungana na kusikiliza matukio.
Kazi - weka zana za Azure Functions
Wakati wa kuandika, zana za msimbo wa Azure Functions hazifanyi kazi kikamilifu kwenye Apple Silicon na miradi ya Python. Utahitaji kutumia Mac inayotegemea Intel, PC ya Windows, au PC ya Linux badala yake.
Moja ya vipengele bora vya Azure Functions ni kwamba unaweza kuziendesha ndani ya kompyuta yako. Runtime sawa inayotumika kwenye wingu inaweza kuendeshwa kwenye kompyuta yako, ikikuruhusu kuandika msimbo unaojibu ujumbe wa IoT na kuendesha ndani ya kompyuta yako. Unaweza hata kufuatilia msimbo wako unaposhughulikia matukio. Mara tu unapokuwa na uhakika na msimbo wako, unaweza kuuhamisha kwenye wingu.
Zana za Azure Functions zinapatikana kama CLI, inayojulikana kama Azure Functions Core Tools.
-
Weka zana za msingi za Azure Functions kwa kufuata maelekezo kwenye Nyaraka za Azure Functions Core Tools.
-
Weka kiendelezi cha Azure Functions kwa VS Code. Kiendelezi hiki kinatoa msaada wa kuunda, kufuatilia, na kuhamisha Azure Functions. Rejelea Nyaraka za kiendelezi cha Azure Functions kwa maelekezo ya jinsi ya kuweka kiendelezi hiki kwenye VS Code.
Unapohamisha programu yako ya Azure Functions kwenye wingu, inahitaji kutumia kiasi kidogo cha hifadhi ya wingu kuhifadhi vitu kama faili za programu na faili za kumbukumbu. Unapokimbia programu yako ya Functions ndani ya kompyuta yako, bado unahitaji kuungana na hifadhi ya wingu, lakini badala ya kutumia hifadhi halisi ya wingu, unaweza kutumia emulator ya hifadhi inayoitwa Azurite. Hii inaendeshwa ndani ya kompyuta yako lakini inafanya kazi kama hifadhi ya wingu.
🎓 Katika Azure, hifadhi inayotumiwa na Azure Functions ni Akaunti ya Hifadhi ya Azure. Akaunti hizi zinaweza kuhifadhi faili, blobs, data kwenye meza au data kwenye foleni. Unaweza kushiriki akaunti moja ya hifadhi kati ya programu nyingi, kama programu ya Functions na programu ya wavuti.
-
Azurite ni programu ya Node.js, kwa hivyo utahitaji kuweka Node.js. Unaweza kupata maelekezo ya kupakua na kuweka kwenye Tovuti ya Node.js. Ikiwa unatumia Mac, unaweza pia kuiweka kutoka Homebrew.
-
Weka Azurite kwa kutumia amri ifuatayo (
npm
ni zana inayowekwa unapoweka Node.js):npm install -g azurite
-
Unda folda inayoitwa
azurite
kwa Azurite kutumia kuhifadhi data:mkdir azurite
-
Endesha Azurite, ukiipatia folda hii mpya:
azurite --location azurite
Emulator ya hifadhi ya Azurite itazinduliwa na kuwa tayari kwa runtime ya Functions kuungana.
➜ ~ azurite --location azurite Azurite Blob service is starting at http://127.0.0.1:10000 Azurite Blob service is successfully listening at http://127.0.0.1:10000 Azurite Queue service is starting at http://127.0.0.1:10001 Azurite Queue service is successfully listening at http://127.0.0.1:10001 Azurite Table service is starting at http://127.0.0.1:10002 Azurite Table service is successfully listening at http://127.0.0.1:10002
Kazi - unda mradi wa Azure Functions
CLI ya Azure Functions inaweza kutumika kuunda programu mpya ya Functions.
-
Unda folda kwa programu yako ya Functions na uingie ndani yake. Ipe jina
soil-moisture-trigger
.mkdir soil-moisture-trigger cd soil-moisture-trigger
-
Unda mazingira ya kawaida ya Python ndani ya folda hii:
python3 -m venv .venv
-
Washa mazingira ya kawaida:
-
Kwenye Windows:
-
Ikiwa unatumia Command Prompt, au Command Prompt kupitia Windows Terminal, endesha:
.venv\Scripts\activate.bat
-
Ikiwa unatumia PowerShell, endesha:
.\.venv\Scripts\Activate.ps1
-
-
Kwenye macOS au Linux, endesha:
source ./.venv/bin/activate
💁 Amri hizi zinapaswa kuendeshwa kutoka eneo lile uliloendesha amri ya kuunda mazingira ya kawaida. Hautahitaji kamwe kuingia kwenye folda ya
.venv
, unapaswa kila wakati kuendesha amri ya kuamsha na amri zozote za kuweka vifurushi au kuendesha msimbo kutoka folda ulipokuwa ulipoanzisha mazingira ya kawaida. -
-
Endesha amri ifuatayo kuunda programu ya Functions ndani ya folda hii:
func init --worker-runtime python soil-moisture-trigger
Hii itaunda faili tatu ndani ya folda ya sasa:
host.json
- hati hii ya JSON ina mipangilio ya programu yako ya Functions. Hautahitaji kurekebisha mipangilio hii.local.settings.json
- hati hii ya JSON ina mipangilio ambayo programu yako ingekuwa nayo wakati wa kuendesha ndani ya kompyuta yako, kama kamba za muunganisho kwa IoT Hub yako. Mipangilio hii ni ya ndani tu, na haipaswi kuongezwa kwenye udhibiti wa msimbo wa chanzo. Unapohamisha programu kwenye wingu, mipangilio hii haihamishwi, badala yake mipangilio yako inapakiwa kutoka mipangilio ya programu. Hii itashughulikiwa baadaye katika somo hili.requirements.txt
- hii ni Faili ya mahitaji ya Pip inayojumuisha vifurushi vya Pip vinavyohitajika kuendesha programu yako ya Functions.
-
Faili ya
local.settings.json
ina mipangilio ya akaunti ya hifadhi ambayo programu ya Functions itatumia. Hii kwa kawaida ina mipangilio tupu, kwa hivyo inahitaji kuwekwa. Ili kuungana na emulator ya hifadhi ya Azurite, weka thamani hii kwa:"AzureWebJobsStorage": "UseDevelopmentStorage=true",
-
Weka vifurushi vya Pip vinavyohitajika kwa kutumia faili ya mahitaji:
pip install -r requirements.txt
💁 Vifurushi vya Pip vinavyohitajika vinapaswa kuwa kwenye faili hii, ili wakati programu ya Functions inahamishwa kwenye wingu, runtime inaweza kuhakikisha inaweka vifurushi sahihi.
-
Ili kujaribu kila kitu kinafanya kazi vizuri, unaweza kuanza runtime ya Functions. Endesha amri ifuatayo kufanya hivyo:
func start
Utaona runtime ikianza na kuripoti kwamba haijapata kazi zozote za kazi (vichocheo).
(.venv) ➜ soil-moisture-trigger func start Found Python version 3.9.1 (python3). Azure Functions Core Tools Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) Function Runtime Version: 3.0.15417.0 [2021-05-05T01:24:46.795Z] No job functions found.
⚠️ Ikiwa unapata arifa ya ukuta wa moto, ruhusu ufikiaji kwani programu ya
func
inahitaji uwezo wa kusoma na kuandika kwenye mtandao wako. ⚠️ Ikiwa unatumia macOS, kunaweza kuwa na maonyo kwenye matokeo:
> (.venv) ➜ soil-moisture-trigger func start
> Found Python version 3.9.1 (python3).
>
> Azure Functions Core Tools
> Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit)
> Function Runtime Version: 3.0.15417.0
>
> [2021-06-16T08:18:28.315Z] Cannot create directory for shared memory usage: /dev/shm/AzureFunctions
> [2021-06-16T08:18:28.316Z] System.IO.FileSystem: Access to the path '/dev/shm/AzureFunctions' is denied. Operation not permitted.
> [2021-06-16T08:18:30.361Z] No job functions found.
> ```
Unaweza kupuuza haya mradi tu programu ya Functions inaanza kwa usahihi na kuorodhesha kazi zinazofanya kazi. Kama ilivyoelezwa katika swali hili kwenye Microsoft Docs Q&A, unaweza kupuuza.
-
Zima programu ya Functions kwa kubonyeza
ctrl+c
. -
Fungua folda ya sasa kwenye VS Code, ama kwa kufungua VS Code kisha kufungua folda hii, au kwa kuendesha amri ifuatayo:
code .
VS Code itatambua mradi wako wa Functions na kuonyesha arifa ikisema:
Detected an Azure Functions Project in folder "soil-moisture-trigger" that may have been created outside of VS Code. Initialize for optimal use with VS Code?
Chagua Yes kutoka kwenye arifa hii.
-
Hakikisha mazingira ya kawaida ya Python yanafanya kazi kwenye terminal ya VS Code. Ikomeshe na uianzishe tena ikiwa ni lazima.
Unda kichocheo cha tukio la IoT Hub
Programu ya Functions ni ganda la msimbo wako wa serverless. Ili kujibu matukio ya IoT Hub, unaweza kuongeza kichocheo cha IoT Hub kwenye programu hii. Kichocheo hiki kinahitaji kuunganishwa na mkondo wa ujumbe unaotumwa kwa IoT Hub na kujibu ujumbe huo. Ili kupata mkondo huu wa ujumbe, kichocheo chako kinahitaji kuunganishwa na endpoint inayolingana na Event Hub ya IoT Hub.
IoT Hub inategemea huduma nyingine ya Azure inayoitwa Azure Event Hubs. Event Hubs ni huduma inayokuwezesha kutuma na kupokea ujumbe, IoT Hub inapanua hili kwa kuongeza vipengele kwa vifaa vya IoT. Njia unayounganisha kusoma ujumbe kutoka IoT Hub ni sawa na unavyotumia Event Hubs.
✅ Fanya utafiti: Soma muhtasari wa Event Hubs katika hati za Azure Event Hubs. Je, vipengele vya msingi vinavyolinganishwa na IoT Hub vinafanana vipi?
Ili kifaa cha IoT kiunganishwe na IoT Hub, kinapaswa kutumia ufunguo wa siri unaohakikisha kuwa ni vifaa vilivyoruhusiwa pekee vinaweza kuunganishwa. Hali hiyo hiyo inatumika wakati wa kuunganishwa kusoma ujumbe, msimbo wako utahitaji kamba ya muunganisho inayojumuisha ufunguo wa siri, pamoja na maelezo ya IoT Hub.
💁 Kamba ya muunganisho ya msingi unayopata ina ruhusa za iothubowner, ambazo zinatoa ruhusa kamili kwa msimbo wowote unaoitumia kwenye IoT Hub. Kwa kawaida, unapaswa kuunganishwa na kiwango cha chini kabisa cha ruhusa kinachohitajika. Hili litafunikwa katika somo linalofuata.
Mara kichocheo chako kinapounganishwa, msimbo ndani ya kazi utaitwa kwa kila ujumbe unaotumwa kwa IoT Hub, bila kujali ni kifaa gani kilichotuma. Kichocheo kitapokea ujumbe kama parameter.
Kazi - pata kamba ya muunganisho ya endpoint inayolingana na Event Hub
-
Kutoka kwenye terminal ya VS Code, endesha amri ifuatayo ili kupata kamba ya muunganisho kwa endpoint inayolingana na Event Hub ya IoT Hub:
az iot hub connection-string show --default-eventhub \ --output table \ --hub-name <hub_name>
Badilisha
<hub_name>
na jina ulilotumia kwa IoT Hub yako. -
Katika VS Code, fungua faili
local.settings.json
. Ongeza thamani ifuatayo ya ziada ndani ya sehemu yaValues
:"IOT_HUB_CONNECTION_STRING": "<connection string>"
Badilisha
<connection string>
na thamani kutoka hatua ya awali. Utahitaji kuongeza koma baada ya mstari wa juu ili kufanya hii kuwa JSON halali.
Kazi - unda kichocheo cha tukio
Sasa uko tayari kuunda kichocheo cha tukio.
-
Kutoka kwenye terminal ya VS Code, endesha amri ifuatayo kutoka ndani ya folda ya
soil-moisture-trigger
:func new --name iot-hub-trigger --template "Azure Event Hub trigger"
Hii inaunda Kazi mpya inayoitwa
iot-hub-trigger
. Kichocheo kitaunganishwa na endpoint inayolingana na Event Hub kwenye IoT Hub, kwa hivyo unaweza kutumia kichocheo cha Event Hub. Hakuna kichocheo maalum cha IoT Hub.
Hii itaunda folda ndani ya folda ya soil-moisture-trigger
inayoitwa iot-hub-trigger
ambayo ina kazi hii. Folda hii itakuwa na faili zifuatazo ndani yake:
-
__init__.py
- hii ni faili ya msimbo wa Python inayojumuisha kichocheo, kwa kutumia mkataba wa kawaida wa jina la faili za Python kugeuza folda hii kuwa moduli ya Python.Faili hii itakuwa na msimbo ufuatao:
import logging import azure.functions as func def main(event: func.EventHubEvent): logging.info('Python EventHub trigger processed an event: %s', event.get_body().decode('utf-8'))
Msingi wa kichocheo ni kazi ya
main
. Ni kazi hii inayoitwa na matukio kutoka IoT Hub. Kazi hii ina parameter inayoitwaevent
inayojumuishaEventHubEvent
. Kila wakati ujumbe unapotumwa kwa IoT Hub, kazi hii inaitwa ikipitisha ujumbe huo kamaevent
, pamoja na mali ambazo ni sawa na maelezo uliyoyaona katika somo la mwisho.Msingi wa kazi hii ni kuandika kumbukumbu ya tukio.
-
function.json
- hii inajumuisha usanidi wa kichocheo. Usanidi mkuu uko katika sehemu inayoitwabindings
. Binding ni neno linalomaanisha muunganisho kati ya Azure Functions na huduma nyingine za Azure. Kazi hii ina binding ya pembejeo kwa Event Hub - inaunganishwa na Event Hub na kupokea data.💁 Unaweza pia kuwa na binding za matokeo ili matokeo ya kazi yatumwe kwa huduma nyingine. Kwa mfano, unaweza kuongeza binding ya matokeo kwa hifadhidata na kurudisha tukio la IoT Hub kutoka kwa kazi, na litaingizwa moja kwa moja kwenye hifadhidata.
✅ Fanya utafiti: Soma kuhusu bindings katika hati za dhana za triggers na bindings za Azure Functions.
Sehemu ya
bindings
inajumuisha usanidi wa binding. Thamani za kuvutia ni:-
"type": "eventHubTrigger"
- hii inaiambia kazi kuwa inahitaji kusikiliza matukio kutoka Event Hub -
"name": "events"
- hii ni jina la parameter ya kutumia kwa matukio ya Event Hub. Hii inalingana na jina la parameter katika kazi yamain
kwenye msimbo wa Python. -
"direction": "in"
- hii ni binding ya pembejeo, data kutoka Event Hub inaingia kwenye kazi -
"connection": ""
- hii inafafanua jina la mpangilio wa kusoma kamba ya muunganisho. Wakati wa kuendesha kwa ndani, hii itasoma mpangilio huu kutoka faili yalocal.settings.json
.💁 Kamba ya muunganisho haiwezi kuhifadhiwa kwenye faili ya
function.json
, inapaswa kusomwa kutoka kwa mipangilio. Hii ni kuzuia kufichua kamba yako ya muunganisho kwa bahati mbaya.
-
-
Kutokana na hitilafu katika kiolezo cha Azure Functions, faili ya
function.json
ina thamani isiyo sahihi kwa uwanja wacardinality
. Sasisha uwanja huu kutokamany
hadione
:"cardinality": "one",
-
Sasisha thamani ya
"connection"
katika faili yafunction.json
ili kuelekeza kwenye thamani mpya uliyoongeza kwenye faili yalocal.settings.json
:"connection": "IOT_HUB_CONNECTION_STRING",
💁 Kumbuka - hii inahitaji kuelekeza kwenye mpangilio, si kuwa na kamba halisi ya muunganisho.
-
Kamba ya muunganisho inajumuisha thamani ya
eventHubName
, kwa hivyo thamani ya hii katika faili yafunction.json
inahitaji kufutwa. Sasisha thamani hii kuwa kamba tupu:"eventHubName": "",
Kazi - endesha kichocheo cha tukio
-
Hakikisha huendeshi mfuatiliaji wa matukio ya IoT Hub. Ikiwa hii inaendesha wakati huo huo na programu ya Functions, programu ya Functions haitakuwa na uwezo wa kuunganishwa na kutumia matukio.
💁 Programu nyingi zinaweza kuunganishwa na endpoints za IoT Hub kwa kutumia vikundi vya watumiaji tofauti. Haya yatafunikwa katika somo la baadaye.
-
Ili kuendesha programu ya Functions, endesha amri ifuatayo kutoka kwenye terminal ya VS Code:
func start
Programu ya Functions itaanza, na itagundua kazi ya
iot-hub-trigger
. Kisha itashughulikia matukio yoyote ambayo tayari yametumwa kwa IoT Hub katika siku iliyopita.(.venv) ➜ soil-moisture-trigger func start Found Python version 3.9.1 (python3). Azure Functions Core Tools Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) Function Runtime Version: 3.0.15417.0 Functions: iot-hub-trigger: eventHubTrigger For detailed output, run func with --verbose flag. [2021-05-05T02:44:07.517Z] Worker process started and initialized. [2021-05-05T02:44:09.202Z] Executing 'Functions.iot-hub-trigger' (Reason='(null)', Id=802803a5-eae9-4401-a1f4-176631456ce4) [2021-05-05T02:44:09.205Z] Trigger Details: PartitionId: 0, Offset: 1011240-1011632, EnqueueTimeUtc: 2021-05-04T19:04:04.2030000Z-2021-05-04T19:04:04.3900000Z, SequenceNumber: 2546-2547, Count: 2 [2021-05-05T02:44:09.352Z] Python EventHub trigger processed an event: {"soil_moisture":628} [2021-05-05T02:44:09.354Z] Python EventHub trigger processed an event: {"soil_moisture":624} [2021-05-05T02:44:09.395Z] Executed 'Functions.iot-hub-trigger' (Succeeded, Id=802803a5-eae9-4401-a1f4-176631456ce4, Duration=245ms)
Kila wito kwa kazi utazungukwa na block ya
Executing 'Functions.iot-hub-trigger'
/Executed 'Functions.iot-hub-trigger'
kwenye matokeo, kwa hivyo unaweza kuona ni ujumbe ngapi zilishughulikiwa katika kila wito wa kazi. -
Hakikisha kifaa chako cha IoT kinafanya kazi. Utaona ujumbe mpya wa unyevu wa udongo ukionekana kwenye programu ya Functions.
-
Zima na uanzishe tena programu ya Functions. Utaona kuwa haitashughulikia ujumbe wa awali tena, itashughulikia tu ujumbe mpya.
💁 VS Code pia inasaidia kufuatilia hitilafu kwenye Functions zako. Unaweza kuweka sehemu za kusimamisha kwa kubofya kwenye mpaka karibu na mwanzo wa kila mstari wa msimbo, au kuweka mshale kwenye mstari wa msimbo na kuchagua Run -> Toggle breakpoint, au kubonyeza
F9
. Unaweza kuzindua kifuatiliaji hitilafu kwa kuchagua Run -> Start debugging, kubonyezaF5
, au kuchagua paneli ya Run and debug na kuchagua kitufe cha Start debugging. Kwa kufanya hivi unaweza kuona maelezo ya matukio yanayoshughulikiwa.
Utatuzi wa matatizo
-
Ikiwa unapata hitilafu ifuatayo:
The listener for function 'Functions.iot-hub-trigger' was unable to start. Microsoft.WindowsAzure.Storage: Connection refused. System.Net.Http: Connection refused. System.Private.CoreLib: Connection refused.
Hakikisha Azurite inaendesha na umeweka
AzureWebJobsStorage
katika faili yalocal.settings.json
kuwaUseDevelopmentStorage=true
. -
Ikiwa unapata hitilafu ifuatayo:
System.Private.CoreLib: Exception while executing function: Functions.iot-hub-trigger. System.Private.CoreLib: Result: Failure Exception: AttributeError: 'list' object has no attribute 'get_body'
Hakikisha kuwa umeweka
cardinality
katika faili yafunction.json
kuwaone
. -
Ikiwa unapata hitilafu ifuatayo:
Azure.Messaging.EventHubs: The path to an Event Hub may be specified as part of the connection string or as a separate value, but not both. Please verify that your connection string does not have the `EntityPath` token if you are passing an explicit Event Hub name. (Parameter 'connectionString').
Hakikisha kuwa umeweka
eventHubName
katika faili yafunction.json
kuwa kamba tupu.
Tuma maombi ya njia ya moja kwa moja kutoka kwa msimbo wa serverless
Hadi sasa programu yako ya Functions inasikiliza ujumbe kutoka IoT Hub kwa kutumia endpoint inayolingana na Event Hub. Sasa unahitaji kutuma amri kwa kifaa cha IoT. Hii inafanywa kwa kutumia muunganisho tofauti kwa IoT Hub kupitia Registry Manager. Registry Manager ni zana inayokuwezesha kuona ni vifaa gani vimesajiliwa na IoT Hub, na kuwasiliana na vifaa hivyo kwa kutuma ujumbe kutoka wingu kwenda kifaa, maombi ya njia ya moja kwa moja au kusasisha "device twin". Pia unaweza kuitumia kusajili, kusasisha au kufuta vifaa vya IoT kutoka IoT Hub.
Ili kuunganishwa na Registry Manager, unahitaji kamba ya muunganisho.
Kazi - pata kamba ya muunganisho ya Registry Manager
-
Ili kupata kamba ya muunganisho, endesha amri ifuatayo:
az iot hub connection-string show --policy-name service \ --output table \ --hub-name <hub_name>
Badilisha
<hub_name>
na jina ulilotumia kwa IoT Hub yako.Kamba ya muunganisho inaombwa kwa sera ya ServiceConnect kwa kutumia parameter
--policy-name service
. Unapoomba kamba ya muunganisho, unaweza kubainisha ni ruhusa gani kamba hiyo itaruhusu. Sera ya ServiceConnect inaruhusu msimbo wako kuunganishwa na kutuma ujumbe kwa vifaa vya IoT.✅ Fanya utafiti: Soma kuhusu sera tofauti katika hati za ruhusa za IoT Hub
-
Katika VS Code, fungua faili ya
local.settings.json
. Ongeza thamani ifuatayo ya ziada ndani ya sehemu yaValues
:"REGISTRY_MANAGER_CONNECTION_STRING": "<connection string>"
Badilisha
<connection string>
na thamani kutoka hatua ya awali. Utahitaji kuongeza koma baada ya mstari wa juu ili kufanya hii kuwa JSON halali.
Kazi - tuma ombi la njia ya moja kwa moja kwa kifaa
-
SDK ya Registry Manager inapatikana kupitia kifurushi cha Pip. Ongeza mstari ufuatao kwenye faili ya
requirements.txt
ili kuongeza utegemezi wa kifurushi hiki:azure-iot-hub
-
Hakikisha terminal ya VS Code imeamilisha mazingira ya kawaida, na endesha amri ifuatayo kusakinisha vifurushi vya Pip:
pip install -r requirements.txt
-
Ongeza uingizaji ufuatao kwenye faili ya
__init__.py
:import json import os from azure.iot.hub import IoTHubRegistryManager from azure.iot.hub.models import CloudToDeviceMethod
Hii inaingiza maktaba za mfumo, pamoja na maktaba za kuingiliana na Registry Manager na kutuma maombi ya njia ya moja kwa moja.
-
Ondoa msimbo kutoka ndani ya njia ya
main
, lakini weka njia yenyewe. -
Katika njia ya
main
, ongeza msimbo ufuatao:body = json.loads(event.get_body().decode('utf-8')) device_id = event.iothub_metadata['connection-device-id'] logging.info(f'Received message: {body} from {device_id}')
Msimbo huu unatoa mwili wa tukio ambalo lina ujumbe wa JSON uliotumwa na kifaa cha IoT.
Kisha unapata kitambulisho cha kifaa kutoka kwa maelezo yaliyopitishwa na ujumbe. Mwili wa tukio unajumuisha ujumbe uliotumwa kama telemetry, wakati kamusi ya
iothub_metadata
inajumuisha mali zilizowekwa na IoT Hub kama vile kitambulisho cha kifaa cha mtumaji, na wakati ujumbe ulipotumwa.Taarifa hii kisha inaandikwa kwenye kumbukumbu. Utaona kumbukumbu hii kwenye terminal unapokimbia programu ya Function kwa ndani.
-
Chini ya hii, ongeza msimbo ufuatao:
soil_moisture = body['soil_moisture'] if soil_moisture > 450: direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}') else: direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}')
Msimbo huu unapata unyevu wa udongo kutoka kwa ujumbe. Kisha unakagua unyevu wa udongo, na kulingana na thamani, unaunda darasa la msaidizi kwa ombi la njia ya moja kwa moja kwa njia ya
relay_on
aurelay_off
. Ombi la njia halihitaji mzigo wa data, kwa hivyo hati tupu ya JSON inatumwa. -
Chini ya hii ongeza msimbo ufuatao:
logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}') registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] registry_manager = IoTHubRegistryManager(registry_manager_connection_string)
Maelezo haya yanapakia REGISTRY_MANAGER_CONNECTION_STRING
kutoka kwenye faili ya local.settings.json
. Thamani zilizomo kwenye faili hii zinapatikana kama vigezo vya mazingira, na zinaweza kusomwa kwa kutumia kazi ya os.environ
, kazi inayorejesha kamusi ya vigezo vyote vya mazingira.
💁 Wakati maelezo haya yanapowekwa kwenye wingu, thamani zilizomo kwenye faili ya
local.settings.json
zitawekwa kama Application Settings, na zinaweza kusomwa kutoka kwenye vigezo vya mazingira.
Kisha, maelezo haya yanaunda mfano wa darasa la msaidizi la Registry Manager kwa kutumia connection string.
-
Chini ya haya ongeza msimbo ufuatao:
registry_manager.invoke_device_method(device_id, direct_method) logging.info('Direct method request sent!')
Msimbo huu unamwambia Registry Manager kutuma ombi la njia ya moja kwa moja kwa kifaa kilichotuma telemetry.
💁 Katika matoleo ya programu uliyotengeneza kwenye masomo ya awali kwa kutumia MQTT, amri za kudhibiti relay zilitumwa kwa vifaa vyote. Msimbo ulidhani ungekuwa na kifaa kimoja tu. Toleo hili la msimbo linatuma ombi la njia moja kwa moja kwa kifaa kimoja, hivyo linaweza kufanya kazi ikiwa una seti nyingi za sensa za unyevu wa udongo na relay, likituma ombi sahihi kwa kifaa sahihi.
-
Endesha programu ya Functions, na hakikisha kifaa chako cha IoT kinatuma data. Utaona ujumbe ukichakatwa na maombi ya njia moja kwa moja yakitumwa. Hamisha sensa ya unyevu wa udongo ndani na nje ya udongo ili kuona thamani zikibadilika na relay kuwashwa na kuzimwa.
💁 Unaweza kupata msimbo huu kwenye folda ya code/functions.
Weka msimbo wako wa serverless kwenye wingu
Sasa msimbo wako unafanya kazi kwa ndani, hatua inayofuata ni kuweka programu ya Functions kwenye wingu.
Kazi - unda rasilimali za wingu
Programu yako ya Functions inahitaji kuwekwa kwenye rasilimali ya Functions App ndani ya Azure, ikiishi ndani ya Resource Group uliyounda kwa ajili ya IoT Hub yako. Pia utahitaji akaunti ya hifadhi iliyoundwa ndani ya Azure ili kuchukua nafasi ya emulator unayotumia kwa ndani.
-
Endesha amri ifuatayo kuunda akaunti ya hifadhi:
az storage account create --resource-group soil-moisture-sensor \ --sku Standard_LRS \ --name <storage_name>
Badilisha
<storage_name>
na jina la akaunti yako ya hifadhi. Jina hili linahitaji kuwa la kipekee kimataifa kwani linakuwa sehemu ya URL inayotumika kufikia akaunti ya hifadhi. Unaweza kutumia herufi ndogo na namba tu kwa jina hili, hakuna wahusika wengine, na linapunguzwa hadi herufi 24. Tumia kitu kamasms
na ongeza kitambulisho cha kipekee mwishoni, kama maneno ya nasibu au jina lako.Chaguo la
--sku Standard_LRS
linachagua kiwango cha bei, likichagua akaunti ya gharama ya chini ya matumizi ya jumla. Hakuna kiwango cha bure cha hifadhi, na unalipa kwa kile unachotumia. Gharama ni za chini, na hifadhi ya gharama kubwa zaidi ikiwa chini ya US$0.05 kwa mwezi kwa gigabyte moja iliyohifadhiwa.✅ Soma zaidi kuhusu bei kwenye ukurasa wa bei wa Azure Storage Account
-
Endesha amri ifuatayo kuunda Function App:
az functionapp create --resource-group soil-moisture-sensor \ --runtime python \ --functions-version 3 \ --os-type Linux \ --consumption-plan-location <location> \ --storage-account <storage_name> \ --name <functions_app_name>
Badilisha
<location>
na eneo ulilotumia wakati wa kuunda Resource Group kwenye somo la awali.Badilisha
<storage_name>
na jina la akaunti ya hifadhi uliyounda kwenye hatua ya awali.Badilisha
<functions_app_name>
na jina la kipekee kwa Functions App yako. Jina hili linahitaji kuwa la kipekee kimataifa kwani linakuwa sehemu ya URL inayotumika kufikia Functions App. Tumia kitu kamasoil-moisture-sensor-
na ongeza kitambulisho cha kipekee mwishoni, kama maneno ya nasibu au jina lako.Chaguo la
--functions-version 3
linaweka toleo la Azure Functions la kutumia. Toleo la 3 ni toleo la hivi karibuni.Chaguo la
--os-type Linux
linaambia runtime ya Functions kutumia Linux kama OS ya kuendesha hizi functions. Functions zinaweza kuendeshwa kwenye Linux au Windows, kulingana na lugha ya programu inayotumika. Programu za Python zinasaidiwa tu kwenye Linux.
Kazi - pakia mipangilio ya programu yako
Wakati ulipokuwa unatengeneza Functions App yako, ulihifadhi mipangilio fulani kwenye faili ya local.settings.json
kwa ajili ya connection strings za IoT Hub yako. Hizi zinahitaji kuandikwa kwenye Application Settings ndani ya Function App yako kwenye Azure ili ziweze kutumika na msimbo wako.
🎓 Faili ya
local.settings.json
ni kwa ajili ya mipangilio ya maendeleo ya ndani tu, na haipaswi kuingizwa kwenye udhibiti wa msimbo wa chanzo, kama GitHub. Wakati imewekwa kwenye wingu, Application Settings zinatumika. Application Settings ni jozi za funguo/thamani zinazohifadhiwa kwenye wingu na zinasomwa kutoka kwenye vigezo vya mazingira aidha kwenye msimbo wako au na runtime wakati wa kuunganisha msimbo wako na IoT Hub.
-
Endesha amri ifuatayo kuweka mipangilio ya
IOT_HUB_CONNECTION_STRING
kwenye Application Settings za Functions App:az functionapp config appsettings set --resource-group soil-moisture-sensor \ --name <functions_app_name> \ --settings "IOT_HUB_CONNECTION_STRING=<connection string>"
Badilisha
<functions_app_name>
na jina ulilotumia kwa Functions App yako.Badilisha
<connection string>
na thamani yaIOT_HUB_CONNECTION_STRING
kutoka kwenye faili yako yalocal.settings.json
. -
Rudia hatua ya juu, lakini weka thamani ya
REGISTRY_MANAGER_CONNECTION_STRING
kwa thamani inayolingana kutoka kwenye faili yako yalocal.settings.json
.
Wakati unaendesha amri hizi, zitaonyesha pia orodha ya Application Settings zote za function app. Unaweza kutumia hii kuangalia kama thamani zako zimewekwa kwa usahihi.
💁 Utaona thamani tayari imewekwa kwa
AzureWebJobsStorage
. Kwenye faili yako yalocal.settings.json
, hii ilikuwa imewekwa kwa thamani ya kutumia emulator ya hifadhi ya ndani. Wakati uliunda Functions App, ulipitisha akaunti ya hifadhi kama parameter, na hii imewekwa kiotomatiki kwenye mipangilio hii.
Kazi - weka Functions App yako kwenye wingu
Sasa Functions App iko tayari, msimbo wako unaweza kuwekwa.
-
Endesha amri ifuatayo kutoka kwenye terminal ya VS Code ili kuchapisha Functions App yako:
func azure functionapp publish <functions_app_name>
Badilisha
<functions_app_name>
na jina ulilotumia kwa Functions App yako.
Msimbo utapakizwa na kutumwa kwenye Functions App, ambapo utawekwa na kuanza. Kutakuwa na matokeo mengi ya console, yakimalizika na uthibitisho wa uwekaji na orodha ya functions zilizowekwa. Katika kesi hii orodha itakuwa na trigger pekee.
Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in soil-moisture-sensor:
iot-hub-trigger - [eventHubTrigger]
Hakikisha kifaa chako cha IoT kinafanya kazi. Badilisha viwango vya unyevu kwa kurekebisha unyevu wa udongo, au kuhamisha sensa ndani na nje ya udongo. Utaona relay ikiwashwa na kuzimwa kadri unyevu wa udongo unavyobadilika.
🚀 Changamoto
Katika somo la awali, ulisimamia muda wa relay kwa kujiondoa kutoka kwa ujumbe wa MQTT wakati relay ilikuwa imewashwa, na kwa muda mfupi baada ya kuzimwa. Huwezi kutumia njia hii hapa - huwezi kujiondoa kwenye trigger ya IoT Hub yako.
Fikiria njia tofauti unazoweza kutumia kushughulikia hili kwenye Functions App yako.
Jaribio la baada ya somo
Mapitio na Kujisomea
- Soma kuhusu serverless computing kwenye ukurasa wa Serverless Computing kwenye Wikipedia
- Soma kuhusu kutumia serverless ndani ya Azure ikiwa ni pamoja na mifano zaidi kwenye Go serverless for your IoT needs Azure blog post
- Jifunze zaidi kuhusu Azure Functions kwenye Azure Functions YouTube channel
Kazi
Ongeza udhibiti wa relay wa mwongozo
Kanusho:
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI Co-op Translator. Ingawa tunajitahidi kuhakikisha usahihi, tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.