Förstå och anropa direktmetoder från IoT Hub
Med IoT Hub-direktmetoder kan du fjärranropa anrop på enheter från molnet. Direkta metoder följer ett mönster för begäran-svar och är avsedda för kommunikation som kräver omedelbar bekräftelse av resultatet. Till exempel interaktiv kontroll av en enhet, till exempel att aktivera en fläkt. Den här funktionen är användbar för scenarier där åtgärdens gång skiljer sig åt beroende på om enheten kunde svara.
Kommentar
De funktioner som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om de grundläggande och standard-/kostnadsfria IoT Hub-nivåerna finns i Välj rätt IoT Hub-nivå för din lösning.
Varje enhetsmetod riktar sig till en enda enhet. Om du vill anropa direktmetoder på flera enheter eller schemalägga metoder för frånkopplade enheter läser du Schemalägg jobb på flera enheter.
Alla med behörigheter för tjänstanslutning på IoT Hub kan anropa en metod på en enhet.
Se vägledningen för kommunikation från moln till enhet om du är osäker på om du vill använda önskade egenskaper, direkta metoder eller meddelanden från molnet till enheten.
Metodlivscykel
Direkta metoder implementeras på enheten och kan kräva noll eller fler indata i metodens nyttolast för att instansiera korrekt. Du anropar en direktmetod via en tjänstinriktad URI ({iot hub}/twins/{device id}/methods/
). En enhet tar emot direkta metoder via ett enhetsspecifikt MQTT-ämne ($iothub/methods/POST/{method name}/
) eller via AMQP-länkar ( IoThub-methodname
egenskaperna och IoThub-status
programmet).
Kommentar
När du anropar en direktmetod på en enhet kan egenskapsnamn och värden endast innehålla alfanumeriskt tal som kan skrivas ut med US-ASCII, förutom något i följande uppsättning: $ ( ) < > @ , ; : \ " / [ ] ? = { } SP HT
Direkta metoder är synkrona och lyckas eller misslyckas efter tidsgränsen (standard 30 sekunder, kan anges mellan 5 och 300 sekunder). Direktmetoder är användbara i interaktiva scenarier där du vill att en enhet ska agera om och bara om enheten är online och tar emot kommandon. Du kan till exempel slå på en lampa från en telefon. I dessa scenarier vill du se en omedelbar framgång eller ett fel så att molntjänsten kan agera på resultatet så snart som möjligt. Enheten kan returnera en del meddelandetext som ett resultat av metoden, men det krävs inte. Det finns ingen garanti för beställning eller samtidighetssemantik vid metodanrop.
Direktmetoder är ENDAST HTTPS från molnsidan och MQTT, AMQP, MQTT över WebSockets eller AMQP via WebSockets från enhetssidan.
Nyttolasten för metodbegäranden och svar är ett JSON-dokument på upp till 128 kB.
Anropa en direktmetod från en serverdelsapp
Om du vill anropa en direktmetod från en serverdelsapp använder du REST API:et Invoke device method eller dess motsvarighet i någon av IoT Hub-tjänstens SDK:er.
Metodanrop
Direktmetodanrop på en enhet är HTTPS-anrop som består av följande objekt:
Begärande-URI:n som är specifik för enheten tillsammans med API-versionen:
https://fully-qualified-iothubname.azure-devices.net/twins/{deviceId}/methods?api-version=2021-04-12
POST-metoden
Rubriker som innehåller auktorisering, innehållstyp och innehållskodning.
En transparent JSON-brödtext i följande format:
{ "connectTimeoutInSeconds": 200, "methodName": "reboot", "responseTimeoutInSeconds": 200, "payload": { "input1": "someInput", "input2": "anotherInput" } }
Värdet som anges i responseTimeoutInSeconds
begäran är den tid som IoT Hub-tjänsten måste vänta på att en direkt metodkörning på en enhet ska slutföras. Ange att tidsgränsen ska vara minst så länge som den förväntade körningstiden för en direktmetod av en enhet. Om tidsgränsen inte anges används standardvärdet 30 sekunder. Minimi- och maxvärdena för responseTimeoutInSeconds
är 5 respektive 300 sekunder.
Värdet som anges i connectTimeoutInSeconds
begäran är den tid vid anrop av en direktmetod som IoT Hub-tjänsten måste vänta på för att en frånkopplad enhet ska kunna anslutas. Standardvärdet är 0, vilket innebär att enheterna redan måste vara online vid anrop av en direktmetod. Det maximala värdet för connectTimeoutInSeconds
är 300 sekunder.
Exempel
I det här exemplet initieras en begäran om att anropa en direktmetod på en IoT-enhet som är registrerad på en Azure IoT-hubb.
Börja med att använda Microsoft Azure IoT-tillägget för Azure CLI för att skapa en SharedAccessSignature.
az iot hub generate-sas-token -n <iothubName> --du <duration>
Ersätt sedan auktoriseringshuvudet med din nyligen genererade SharedAccessSignature och ändra sedan parametrarna iothubName
, deviceId
methodName
och payload
så att de matchar implementeringen i exempelkommandot curl
nedan.
curl -X POST \
https://<iothubName>.azure-devices.net/twins/<deviceId>/methods?api-version=2021-04-12\
-H 'Authorization: SharedAccessSignature sr=iothubname.azure-devices.net&sig=x&se=x&skn=iothubowner' \
-H 'Content-Type: application/json' \
-d '{
"methodName": "reboot",
"responseTimeoutInSeconds": 200,
"payload": {
"input1": "someInput",
"input2": "anotherInput"
}
}'
Kör det ändrade kommandot för att anropa den angivna direktmetoden. Lyckade begäranden returnerar en HTTP 200-statuskod.
Kommentar
Exemplet ovan visar hur du anropar en direktmetod på en enhet. Om du vill anropa en direktmetod i en IoT Edge-modul ändrar du URL-begäran så att den inkluderas /modules/<moduleName>
enligt nedan:
https://<iothubName>.azure-devices.net/twins/<deviceId>/modules/<moduleName>/methods?api-version=2021-04-12
Response
Serverdelsappen får ett svar som består av följande objekt:
HTTP-statuskod:
- 200 anger ett lyckat genomförande av direktmetoden.
- 404 anger att antingen enhets-ID är ogiltigt eller att enheten inte var online vid anrop av en direktmetod och därefter (använd åtföljt felmeddelande för
connectTimeoutInSeconds
att förstå rotorsaken); - 504 anger gateway-timeout som orsakas av att enheten inte svarar på ett direkt metodanrop inom
responseTimeoutInSeconds
.
Rubriker som innehåller begärande-ID, innehållstyp och innehållskodning.
En JSON-brödtext i följande format:
{ "status" : 201, "payload" : {...} }
Både
status
ochpayload
tillhandahålls av enheten och används för att svara med enhetens egen statuskod och metodsvaret.
Metodanrop för IoT Edge-moduler
Att anropa direktmetoder i en modul stöds av rest-API:et invoke module method eller dess motsvarighet i någon av IoT Hub-tjänst-SDK:erna.
moduleId
Skickas tillsammans med deviceId
i begärande-URI:n när du använder REST-API:et eller som en parameter när du använder en tjänst-SDK. Exempel: https://<iothubName>.azure-devices.net/twins/<deviceId>/modules/<moduleName>/methods?api-version=2021-04-12
Begärandetexten och svaret liknar de direkta metoder som anropas på enheten.
Hantera en direktmetod på en enhet
På en IoT-enhet kan direkta metoder tas emot via MQTT, AMQP eller något av dessa protokoll via WebSockets. IoT Hub-enhetens SDK:er hjälper dig att ta emot och svara på direkta metoder på enheter utan att behöva oroa dig för den underliggande protokollinformationen.
MQTT
Följande avsnitt gäller för MQTT-protokollet. Mer information om hur du använder MQTT-protokollet direkt med IoT Hub finns i MQTT-protokollstöd.
Metodanrop
Enheter tar emot begäranden om direktmetoder i MQTT-ämnet: $iothub/methods/POST/{method name}/?$rid={request id}
. request id
Men genereras av IoT Hub och kan inte vara känd i förväg, så prenumerera på $iothub/methods/POST/#
och filtrera sedan de levererade meddelandena baserat på metodnamn som stöds av enheten. (Du använder request id
för att svara.)
Brödtexten som enheten tar emot är i följande format:
{
"input1": "someInput",
"input2": "anotherInput"
}
Metodbegäranden är QoS 0.
Response
Enheten skickar svar till $iothub/methods/res/{status}/?$rid={request id}
, där:
Egenskapen
status
är statusen som tillhandahålls av enheten för metodkörning.Egenskapen
$rid
är begärande-ID:t från metodanropet som tagits emot från IoT Hub. Begärande-ID:t är ett hexadecimalt formaterat värde.
Brödtexten anges av enheten och kan vara valfri status.
AMQP
Följande avsnitt är för AMQP-protokollet. Mer information om hur du använder AMQP-protokollet direkt med IoT Hub finns i AMQP-protokollstöd.
Metodanrop
Enheten tar emot begäranden om direktmetoder genom att skapa en mottagningslänk på adressen amqps://{hostname}:5671/devices/{deviceId}/methods/deviceBound
.
AMQP-meddelandet tas emot på mottagarlänken som representerar metodbegäran. Den innehåller följande avsnitt:
Korrelations-ID-egenskapen, som innehåller ett begärande-ID som ska skickas tillbaka med motsvarande metodsvar.
En programegenskap med namnet
IoThub-methodname
, som innehåller namnet på den metod som anropas.AMQP-meddelandetexten som innehåller metodens nyttolast som JSON.
Response
Enheten skapar en skickande länk för att returnera metodsvaret på adressen amqps://{hostname}:5671/devices/{deviceId}/methods/deviceBound
.
Metodens svar returneras på den sändande länken och är strukturerad på följande sätt:
Korrelations-ID-egenskapen, som innehåller det begärande-ID som skickades i metodens begärandemeddelande.
En programegenskap med namnet
IoThub-status
, som innehåller den angivna metodens status.AMQP-meddelandetexten som innehåller metodsvaret som JSON.
Nästa steg
Nu när du har lärt dig hur du använder direkta metoder kan du vara intresserad av följande artikel i utvecklarguiden för IoT Hub:
- Schemalägga jobb på flera enheter
- Azure IoT-enhets- och tjänst-SDK:er visar de olika språk-SDK:er som du kan använda när du utvecklar både enhets- och tjänstappar som interagerar med IoT Hub.
- IoT Hub-frågespråket för enhetstvillingar, jobb och meddelanderoutning beskriver det IoT Hub-frågespråk som du kan använda för att hämta information från IoT Hub om dina enhetstvillingar och jobb.