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.

Anmärkning

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å och storlek 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.

För att rikta varje meddelande från molnet till en enskild enhet, ställer din IoT-hubb in 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 över livscykeltillståndet visas upp 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 tidsgräns för låsning). 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 Dead lettered. 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 skulle kunna vara när enheten bevarar meddelandeinnehållet lokalt eller framgångsrikt utför 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. Något av följande alternativ anger förfallotiden:

  • Egenskapen ExpiryTimeUtc i tjänsten
  • IoT-hubben, genom att använda standardinställningen för livslängd 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 ger 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:

  • 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 Standardinställning. 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 ett moln-till-enhet-meddelande når tillståndet 'Dead letter', genererar IoT-hubben ett feedback-meddelande.
fullständig IoT-hubben genererar ett feedbackmeddelande i båda fallen.

Om Ack-egenskapsvärdet är inställt på 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 IoT Hub-slutpunkter levererar IoT Hub 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 samlas feedback i ett enda meddelande med följande format:

Fastighet beskrivning
EnqueuedTime En tidsstämpel som anger när hubben tog emot feedbackmeddelandet.
AnvändarID {iot hub name}
Innehållstyp 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.

JSON-kroppen är en serialiserad array av poster, var och en av dessa har följande egenskaper:

Fastighet 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.
ursprungligMeddelandeId MessageId för det moln-till-enhet-meddelande som den här feedbackinformationen relaterar till.
statuskod En obligatorisk sträng som används av IoT-hubben när feedbackmeddelanden genereras:
Framgång
Utgånget
LeveransantalÖverskridet
Avvisad
Rensat
beskrivning 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.
enhetsgenerations-ID 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 inom det begränsade tidsfönstret sker inte feedback.

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 meddelandefeedback 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:

Fastighet 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änsterelaterade 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åsningsperiod 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 Portal eller Azure CLI:

  • Azure Portal: Under Hubbinställningar på din IoT-hubb väljer du Inbyggda slutpunkter och går till Moln till enhetsmeddelanden. (Inställningen av egenskapen feedback.maxDeliveryCount eller 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.