Dela via


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:

Diagram som visar livscykeltillståndsdiagrammet för meddelanden från moln till enhet.

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.)

    Ange konfigurationsalternativ för meddelanden från moln till enhet i 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.