Skicka meddelanden från molnet till enheten från en IoT-hubb

Om du vill skicka enkelriktade meddelanden till en enhetsapp från serverdelen för lösningen skickar du meddelanden från molnet till enheten från din IoT-hubb till din enhet. 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.

Anteckning

Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna basic och standard/kostnadsfri IoT Hub finns i Välja rätt IoT Hub nivå för din lösning.

Du skickar meddelanden från molnet till enheten 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 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.

Meddelandelivscykeln från moln till enhet

För att garantera meddelandeleverans minst en gång bevarar IoT-hubben moln-till-enhet-meddelanden i köer per enhet. Enheter måste uttryckligen bekräfta slutförandet av ett meddelande innan IoT-hubben tar bort meddelandet från kön. Den här metoden garanterar återhämtning mot anslutnings- och enhetsfel.

Diagrammet för livscykeltillstånd visas i följande diagram:

Diagram som visar diagrammet för livscykeltillstånd 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 enhet vill 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 Obeställbar bokstav . Enheter som ansluter via MQTT-protokollet (Message Queuing Telemetry Transport) kan inte avvisa meddelanden från molnet till enheten.

  • Ö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 molnet till enheten.

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 ). Värdet för den här tidsgränsen är en minut och kan inte ändras.

Egenskapen maximalt antal leveranser 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 Obeställbar bokstav efter förfallotiden. Mer information finns i Meddelandets förfallotid (time to live).

Artikeln Skicka moln-till-enhet-meddelanden med IoT Hub visar hur du skickar meddelanden från molnet till enheten och tar emot dem på en enhet.

En enhet slutför vanligtvis ett moln-till-enhet-meddelande 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 funktionalitet. 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 meddelanden från enheten till molnet i olika faser av aktivitetens förlopp.

Förfallotid för meddelande (time to live)

Varje moln-till-enhet-meddelande har en förfallotid. Den här tiden anges med något av följande alternativ:

  • Egenskapen ExpiryTimeUtc i tjänsten
  • IoT-hubben använder du standardvärdet time to live 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 upphörande och undvika att skicka meddelanden till frånkopplade enheter är att ange värden för kort tid till live . 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:

  • Det går att ta emot meddelanden.
  • Är inte online eller har misslyckats.

Feedback om meddelanden

När du skickar ett moln-till-enhet-meddelande 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 molnet till enheten som skickas till något av följande fyra värden:

Ack-egenskapsvärde Beteende
inget Standard. IoT-hubben genererar inget feedbackmeddelande.
positivt Om meddelandet från molnet till enheten når tillståndet Slutfört genererar IoT-hubben ett feedbackmeddelande.
negativt Om meddelandet från molnet till enheten når tillståndet Obeställbara meddelanden genererar IoT-hubben ett feedbackmeddelande.
fullständig IoT-hubben genererar ett feedbackmeddelande i båda fallen.

Om egenskapsvärdet Ack ä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 förklaras 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 om meddelanden i ett enda meddelande, med följande format:

Egenskap Beskrivning
EnqueuedTime En tidsstämpel som anger när feedbackmeddelandet togs emot av hubben.
UserId {iot hub name}
Contenttype application/vnd.microsoft.iothub.feedback.json

Systemet skickar feedback antingen när batchen når 64 meddelanden eller inom 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:

Egenskap 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:
Klart
Upphört
DeliveryCountExceeded
Avslagen
Renade
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.
deviceGenerationId DeviceGenerationId för målenheten för det moln-till-enhet-meddelande som den här feedbacken relaterar till.

Tjänsten måste ange ett MessageId så att moln-till-enhet-meddelandet kan korrelera sin feedback 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. Feedback om enheter 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 kommer innan du tar bort enheten. Relaterad feedback om meddelanden bör antas ha förlorats 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:

Egenskap 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 leveransantal 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 mellan 5 och 300 sekunder (minst fem sekunder). standard: 60 sekunder.

Du kan ange konfigurationsalternativen på något av följande sätt:

  • Azure Portal: Under Hubbinställningar på din IoT-hubb väljer du Inbyggda slutpunkter och går till Meddelanden från molnet till enheten. (Inställningen av egenskaperna feedback.maxDeliveryCount och feedback.lockDurationAsIso8601 stöds för närvarande inte i Azure Portal.)

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 ta emot meddelanden från molnet till enheten finns i Azure IoT Hub SDK:er.

Om du vill prova att ta emot meddelanden från molnet till enheten kan du läsa självstudien Skicka moln till enhet .