Förstå meddelanden från moln till enhet från en IoT-hubb
Meddelanden från moln till enhet är enkelriktade meddelanden från lösningens serverdel till ett enhetsprogram. En diskussion om andra alternativ för moln-till-enhet som stöds av Azure IoT Hub finns i Vägledning för kommunikation från moln till enhet.
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.
Du skickar meddelanden från moln till enhet via en tjänstinriktad slutpunkt, /messages/devicebound. En enhet tar sedan emot meddelandena via en enhetsspecifik slutpunkt, /devices/{deviceId}/messages/devicebound.
Om du vill rikta varje moln-till-enhet-meddelande på en enda enhet anger din IoT-hubb egenskapen till /devices/{deviceId}/messages/devicebound.
Varje enhetskö innehåller högst 50 meddelanden från molnet till enheten. Ett fel uppstår om du försöker skicka fler meddelanden till samma enhet.
I den här artikeln beskrivs begrepp och processer kring meddelanden från moln till enhet. Vägledning om hur du utvecklar program som hanterar meddelanden från moln till enhet finns i Skicka och ta emot meddelanden från molnet till enheten.
Meddelandelivscykeln från moln till enhet
För att garantera meddelandeleverans minst en gång bevarar din IoT-hubb meddelanden från moln till enhet i köer per enhet. Enheter måste uttryckligen bekräfta att ett meddelande har slutförts innan IoT-hubben tar bort meddelandet från kön. Den här metoden garanterar återhämtning mot anslutnings- och enhetsfel.
Diagrammet livscykeltillstånd visas i följande diagram:
När IoT Hub-tjänsten skickar ett meddelande till en enhet anger tjänsten meddelandetillståndet till Enqueued. När en enhetstråd är redo att ta emot ett meddelande låser IoT-hubben meddelandet genom att ange statusen Osynlig. Med det här tillståndet kan andra trådar på enheten börja ta emot andra meddelanden. När en enhetstråd slutför bearbetningen av ett meddelande meddelar den IoT-hubben genom att slutföra meddelandet. IoT-hubben anger sedan tillståndet till Slutfört.
En enhet kan också:
Avvisa meddelandet, vilket gör att IoT-hubben ställer in det på tillståndet Död bokstav . Det finns ingen kö med obeställbara meddelanden för att återställa dessa meddelanden. Enheter som ansluter via MQTT-protokollet (Message Queuing Telemetry Transport) kan inte avvisa meddelanden från moln till enhet.
Överge meddelandet, vilket gör att IoT-hubben placerar tillbaka meddelandet i kön, med tillståndet inställt på Enqueued. Enheter som ansluter via MQTT-protokollet kan inte överge meddelanden från moln till enhet.
En tråd kan misslyckas med att bearbeta ett meddelande utan att meddela IoT-hubben. I det här fallet övergår meddelanden automatiskt från det osynliga tillståndet tillbaka till tillståndet Enqueued efter en tidsgräns för synlighet (eller lås timeout). Tidsgränsens längd är en minut och kan inte ändras.
Den maximala leveransantalegenskapen på IoT-hubben avgör det maximala antalet gånger ett meddelande kan överföras mellan tillstånden Enqueued och Invisible . Efter det antalet övergångar anger IoT-hubben meddelandets tillstånd till Obeställbar bokstav. På samma sätt anger IoT-hubben tillståndet för ett meddelande till Död bokstav efter dess förfallotid.
En enhet slutför vanligtvis ett meddelande från moln till enhet när förlusten av meddelandet inte påverkar programlogik. Ett exempel på detta kan vara när enheten har sparat meddelandeinnehållet lokalt eller har kört en åtgärd. Meddelandet kan också innehålla tillfällig information, vars förlust inte skulle påverka programmets funktioner. För långvariga uppgifter kan du ibland:
Slutför meddelandet från moln till enhet när enheten har sparat uppgiftsbeskrivningen i lokal lagring.
Meddela lösningens serverdel med ett eller flera enhet-till-moln-meddelanden i olika faser av aktivitetens förlopp.
Förfallodatum för meddelanden (time to live)
Varje meddelande från moln till enhet har en förfallotid. Den här tiden anges av något av följande alternativ:
- Egenskapen ExpiryTimeUtc i tjänsten
- IoT-hubben använder standardtiden för att leva som anges som en IoT Hub-egenskap
Mer information om förfallodatum för meddelanden finns i Konfigurationsalternativ för moln till enhet.
Ett vanligt sätt att dra nytta av ett meddelandes förfallodatum och undvika att skicka meddelanden till frånkopplade enheter är att ange kort tid till live-värden . Den här metoden uppnår samma resultat som att upprätthålla enhetens anslutningstillstånd, men det är mer effektivt. När du begär meddelandebekräftelser meddelar IoT-hubben dig vilka enheter som är:
- Kan ta emot meddelanden.
- Är inte online eller har misslyckats.
Feedback om meddelanden
När du skickar ett meddelande från molnet till enheten kan tjänsten begära leverans av feedback per meddelande om meddelandets slutliga tillstånd. Du kan konfigurera feedback om meddelanden genom att ange programegenskapen iothub-ack i meddelandet från moln till enhet som skickas till något av följande fyra värden:
Ack-egenskapsvärde | Funktionssätt |
---|---|
inget | Standard. IoT-hubben genererar inget feedbackmeddelande. |
positivt | Om meddelandet från moln till enhet når tillståndet Slutfört genererar IoT-hubben ett feedbackmeddelande. |
negativt | Om meddelandet från moln till enhet når tillståndet Död bokstav genererar IoT-hubben ett feedbackmeddelande. |
fullständig | IoT-hubben genererar ett feedbackmeddelande i båda fallen. |
Om värdet för Ack-egenskapen är fullt och du inte får något feedbackmeddelande innebär det att feedbackmeddelandet har upphört att gälla. Tjänsten kan inte veta vad som hände med det ursprungliga meddelandet. I praktiken bör en tjänst se till att den kan bearbeta feedbacken innan den upphör att gälla. Den maximala förfallotiden är två dagar, vilket ger tid att få igång tjänsten igen om ett fel inträffar.
Som beskrivs i Slutpunkter levererar IoT-hubben feedback via en tjänstinriktad slutpunkt, /messages/servicebound/feedback, som meddelanden. Semantiken för att ta emot feedback är samma som för meddelanden från moln till enhet. När det är möjligt batchas feedback i ett enda meddelande med följande format:
Property | beskrivning |
---|---|
EnqueuedTime | En tidsstämpel som anger när feedbackmeddelandet togs emot av hubben. |
AnvändarID | {iot hub name} |
ContentType | application/vnd.microsoft.iothub.feedback.json |
Systemet skickar feedback antingen när batchen når 64 meddelanden eller om 15 sekunder från senast skickade, beroende på vilket som kommer först.
Brödtexten är en JSON-serialiserad matris med poster, var och en med följande egenskaper:
Property | beskrivning |
---|---|
enqueuedTimeUtc | En tidsstämpel som anger när resultatet av meddelandet inträffade. Till exempel en tidsstämpel som anger när hubben tog emot feedbackmeddelandet eller det ursprungliga meddelandet upphörde att gälla. |
originalMessageId | MessageId för det moln-till-enhet-meddelande som den här feedbackinformationen relaterar till. |
statusCode | En obligatorisk sträng som används i feedbackmeddelanden som genereras av IoT-hubben: Framgång Upphört DeliveryCountExceeded Avvisad Renade |
description | Strängvärden för StatusCode. |
deviceId | DeviceId för målenheten för det moln-till-enhet-meddelande som den här feedbacken relaterar till. |
deviceGenerationId | DeviceGenerationId för målenheten för meddelandet från moln till enhet som den här feedbacken relaterar till. |
Tjänsten måste ange ett MessageId så att meddelandet från molnet till enheten kan korrelera feedbacken med det ursprungliga meddelandet.
Brödtexten i ett feedbackmeddelande visas i följande kodexempel:
[
{
"originalMessageId": "0987654321",
"enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
"statusCode": "Success",
"description": "Success",
"deviceId": "123",
"deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
},
{
...
},
...
]
Väntande feedback för borttagna enheter
När en enhet tas bort tas även eventuell väntande feedback bort. Enhetsfeedback skickas i batchar. Ett smalt fönster, ofta mindre än en sekund, kan inträffa mellan när en enhet bekräftar mottagandet av meddelandet och när nästa feedbackbatch förbereds. Om en enhet tas bort i det smala fönstret sker inte feedbacken.
Du kan åtgärda det här beteendet genom att vänta en viss tid på att väntande feedback ska komma innan du tar bort enheten. Relaterad feedback om meddelanden bör antas gå förlorad när en enhet har tagits bort.
Konfigurationsalternativ för moln till enhet
Varje IoT-hubb exponerar följande konfigurationsalternativ för meddelanden från moln till enhet:
Property | beskrivning | Intervall och standard |
---|---|---|
defaultTtlAsIso8601 | Standard-TTL för meddelanden från moln till enhet | ISO_8601 intervall upp till två dagar (minst en minut); standard: en timme |
maxDeliveryCount | Maximalt antal leveranser för köer från moln till enhet per enhet | 1 till 100; standard: 10 |
feedback.ttlAsIso8601 | Kvarhållning för tjänstbundna feedbackmeddelanden | ISO_8601 intervall upp till två dagar (minst en minut); standard: en timme |
feedback.maxDeliveryCount | Maximalt antal leveranser för feedbackkön | 1 till 100; standard: 10 |
feedback.lockDurationAsIso8601 | Lås varaktighet för feedbackkön | ISO_8601 intervall från 5 till 300 sekunder (minst fem sekunder); standard: 60 sekunder. |
Du kan ange konfigurationsalternativen i Azure-portalen eller Azure CLI:
Azure-portalen: Under Hubbinställningar på din IoT-hubb väljer du Inbyggda slutpunkter och går till Moln till enhetsmeddelanden. (Inställningen av egenskaperna feedback.maxDeliveryCount och feedback.lockDurationAsIso8601 stöds för närvarande inte i Azure-portalen.)
Azure CLI: Använd kommandot az iot hub update :
az iot hub update --name {your IoT hub name} \ --set properties.cloudToDevice.defaultTtlAsIso8601=PT1H0M0S az iot hub update --name {your IoT hub name} \ --set properties.cloudToDevice.maxDeliveryCount=10 az iot hub update --name {your IoT hub name} \ --set properties.cloudToDevice.feedback.ttlAsIso8601=PT1H0M0S az iot hub update --name {your IoT hub name} \ --set properties.cloudToDevice.feedback.maxDeliveryCount=10 az iot hub update --name {your IoT hub name} \ --set properties.cloudToDevice.feedback.lockDurationAsIso8601=PT0H1M0S
Nästa steg
Information om de SDK:er som du kan använda för att hantera meddelanden från moln till enhet finns i Azure IoT Hub SDK:er.
Vägledning om hur du utvecklar program som hanterar meddelanden från moln till enhet finns i Skicka och ta emot meddelanden från molnet till enheten.