Cloud-naar-apparaat-berichten verzenden vanuit een IoT-hub

Als u meldingen in één richting naar een apparaat-app wilt verzenden vanuit de back-end van uw oplossing, verzendt u cloud-naar-apparaat-berichten van uw IoT-hub naar uw apparaat. Zie Richtlijnen voor cloud-naar-apparaatcommunicatie voor een bespreking van andere cloud-naar-apparaat-opties die door Azure IoT Hub worden ondersteund.

Notitie

De functies die in dit artikel worden beschreven, zijn alleen beschikbaar in de standaardlaag van de IoT Hub. Zie Choose the right IoT Hub tier for your solution (De juiste IoT Hub laag voor uw oplossing kiezen) voor meer informatie over de basic- en standard/gratis IoT Hub lagen.

U verzendt cloud-naar-apparaat-berichten via een servicegericht eindpunt, /messages/devicebound. Een apparaat ontvangt de berichten vervolgens via een apparaatspecifiek eindpunt, /devices/{deviceId}/messages/devicebound.

Als u elk cloud-naar-apparaat-bericht op één apparaat wilt richten, stelt uw IoT-hub de eigenschap to in op /devices/{deviceId}/messages/devicebound.

Elke apparaatwachtrij bevat maximaal 50 cloud-naar-apparaat-berichten. Er treedt een fout op als u meer berichten naar hetzelfde apparaat probeert te verzenden.

De levenscyclus van cloud-naar-apparaat-berichten

Uw IoT-hub bewaart cloud-naar-apparaat-berichten in wachtrijen per apparaat om de levering van ten minste één bericht te garanderen. Apparaten moeten expliciet bevestigen dat een bericht is voltooid voordat de IoT-hub het bericht uit de wachtrij verwijdert. Deze benadering garandeert tolerantie tegen connectiviteits- en apparaatfouten.

De grafiek met de levenscyclusstatus wordt weergegeven in het volgende diagram:

Diagram met de grafiek van de levenscyclusstatus van cloud-naar-apparaat-berichten.

Wanneer de IoT Hub-service een bericht naar een apparaat verzendt, stelt de service de berichtstatus in op Enqueued. Wanneer een apparaat een bericht wil ontvangen , vergrendelt de IoT-hub het bericht door de status in te stellen op Onzichtbaar. Met deze status kunnen andere threads op het apparaat andere berichten ontvangen. Wanneer een apparaatthread de verwerking van een bericht voltooit, wordt de IoT-hub gewaarschuwd door het bericht te voltooien . De IoT-hub stelt vervolgens de status in op Voltooid.

Een apparaat kan ook:

  • Weiger het bericht, waardoor de IoT-hub het instelt op de status Dead lettered . Apparaten die verbinding maken via het MQTT-protocol (Message Queuing Telemetry Transport), kunnen cloud-naar-apparaat-berichten niet weigeren.

  • Verlaat het bericht, waardoor de IoT-hub het bericht weer in de wachtrij plaatst, met de status ingesteld op Enqueued. Apparaten die verbinding maken via het MQTT-protocol, kunnen cloud-naar-apparaat-berichten niet verlaten.

Een thread kan een bericht niet verwerken zonder de IoT-hub op de hoogte te stellen. In dit geval gaan berichten automatisch over van de status Onzichtbare naar de status Enqueued na een zichtbaarheidstime-out (of vergrendelingstime-out). De waarde van deze time-out is één minuut en kan niet worden gewijzigd.

De eigenschap max delivery count op de IoT-hub bepaalt het maximum aantal keren dat een bericht kan worden overgezet tussen de status Enqueued en Onzichtbare . Na dat aantal overgangen stelt de IoT-hub de status van het bericht in op Onbestelbaar. Op dezelfde manier stelt de IoT-hub de status van een bericht in op Dead lettered na de verlooptijd. Zie Berichtverloop (time to live) voor meer informatie.

In het artikel Cloud-naar-apparaat-berichten verzenden met IoT Hub wordt beschreven hoe u cloud-naar-apparaat-berichten verzendt vanuit de cloud en deze ontvangt op een apparaat.

Een apparaat voltooit normaal gesproken een cloud-naar-apparaat-bericht wanneer het verlies van het bericht geen invloed heeft op de toepassingslogica. Een voorbeeld van deze voltooiing kan zijn wanneer het apparaat de berichtinhoud lokaal heeft behouden of een bewerking heeft uitgevoerd. Het bericht kan ook tijdelijke informatie bevatten, waarvan het verlies geen invloed heeft op de functionaliteit van de toepassing. Soms kunt u voor langlopende taken het volgende doen:

  • Vul het cloud-naar-apparaat-bericht in nadat het apparaat de taakbeschrijving in de lokale opslag heeft behouden.

  • Informeer de back-end van de oplossing met een of meer apparaat-naar-cloud-berichten in verschillende fasen van de voortgang van de taak.

Bericht verloopt (time to live)

Elk cloud-naar-apparaat-bericht heeft een verlooptijd. Deze tijd wordt ingesteld door een van de volgende opties:

  • De eigenschap ExpiryTimeUtc in de service
  • De IoT-hub, met behulp van de standaard time to live die is opgegeven als een IoT-hub-eigenschap

Zie Configuratieopties voor cloud-naar-apparaat voor meer informatie over het verlopen van berichten.

Een veelgebruikte manier om te profiteren van het verlopen van een bericht en om te voorkomen dat berichten worden verzonden naar niet-verbonden apparaten, is door korte time-to-live-waarden in te stellen. Met deze aanpak wordt hetzelfde resultaat bereikt als het handhaven van de verbindingsstatus van het apparaat, maar het is efficiënter. Wanneer u bevestigingen van berichten aanvraagt, meldt de IoT-hub u welke apparaten het volgende zijn:

  • Kan berichten ontvangen.
  • Zijn niet online of zijn mislukt.

Feedback van berichten

Wanneer u een cloud-naar-apparaat-bericht verzendt, kan de service vragen om feedback per bericht over de uiteindelijke status van dat bericht. U kunt feedback van berichten configureren door de toepassingseigenschap iothub-ack in het cloud-naar-apparaat-bericht dat wordt verzonden in te stellen op een van de volgende vier waarden:

Ack-eigenschapswaarde Gedrag
geen Standaard. De IoT-hub genereert geen feedbackbericht.
positief Als het cloud-naar-apparaat-bericht de status Voltooid bereikt, genereert de IoT-hub een feedbackbericht.
negatief Als het cloud-naar-apparaat-bericht de status Onbestelbaar bereikt, genereert de IoT-hub een feedbackbericht.
Volledige De IoT-hub genereert in beide gevallen een feedbackbericht.

Als de waarde van de eigenschap Ack is ingesteld op vol en u geen feedbackbericht ontvangt, betekent dit dat het feedbackbericht is verlopen. De service kan niet weten wat er is gebeurd met het oorspronkelijke bericht. In de praktijk moet een service ervoor zorgen dat deze de feedback kan verwerken voordat deze verloopt. De maximale verlooptijd is twee dagen, wat tijd overlaat om de service weer uit te voeren als er een fout optreedt.

Zoals uitgelegd in Eindpunten, levert de IoT-hub feedback via een servicegericht eindpunt, /messages/servicebound/feedback, als berichten. De semantiek voor het ontvangen van feedback is hetzelfde als voor cloud-naar-apparaat-berichten. Indien mogelijk wordt de feedback van berichten in een batch in één bericht verwerkt, met de volgende indeling:

Eigenschap Beschrijving
EnqueuedTime Een tijdstempel die aangeeft wanneer het feedbackbericht is ontvangen door de hub.
UserId {iot hub name}
Contenttype application/vnd.microsoft.iothub.feedback.json

Het systeem verzendt de feedback wanneer de batch 64 berichten bereikt of binnen 15 seconden na de laatste verzending, afhankelijk van wat zich het eerst voordoet.

De hoofdtekst is een JSON-geserialiseerde matrix van records, elk met de volgende eigenschappen:

Eigenschap Beschrijving
enqueuedTimeUtc Een tijdstempel die aangeeft wanneer het resultaat van het bericht is opgetreden. Bijvoorbeeld een tijdstempel die aangeeft wanneer de hub het feedbackbericht heeft ontvangen of het oorspronkelijke bericht is verlopen.
originalMessageId De MessageId van het cloud-naar-apparaat-bericht waarop deze feedback-informatie betrekking heeft.
statuscode Een vereiste tekenreeks die wordt gebruikt in feedbackberichten die worden gegenereerd door de IoT-hub:
Geslaagd
Verlopen
DeliveryCountExceeded
Afgewezen
Verwijderd
beschrijving Tekenreekswaarden voor StatusCode.
deviceId De DeviceId van het doelapparaat van het cloud-naar-apparaat-bericht waarop dit feedbackbericht betrekking heeft.
deviceGenerationId De DeviceGenerationId van het doelapparaat van het cloud-naar-apparaat-bericht waarop dit feedbackbericht betrekking heeft.

De service moet een MessageId opgeven, zodat het cloud-naar-apparaat-bericht de feedback kan correleren met het oorspronkelijke bericht.

De hoofdtekst van een feedbackbericht wordt weergegeven in het volgende codevoorbeeld:

[
  {
    "originalMessageId": "0987654321",
    "enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
    "statusCode": "Success",
    "description": "Success",
    "deviceId": "123",
    "deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
  },
  {
    ...
  },
  ...
]

Feedback in behandeling voor verwijderde apparaten

Wanneer een apparaat wordt verwijderd, wordt alle in behandeling zijnde feedback ook verwijderd. Feedback over apparaten wordt in batches verzonden. Een smal venster, vaak minder dan één seconde, kan optreden tussen het moment waarop een apparaat de ontvangst van het bericht bevestigt en het moment waarop de volgende feedbackbatch wordt voorbereid. Als een apparaat in dat smalle venster wordt verwijderd, treedt de feedback niet op.

U kunt dit gedrag aanpakken door een bepaalde periode te wachten totdat er feedback in behandeling is voordat u uw apparaat verwijdert. Feedback over gerelateerde berichten moet verloren gaan zodra een apparaat is verwijderd.

Configuratieopties voor cloud-naar-apparaat

Elke IoT-hub biedt de volgende configuratieopties voor cloud-naar-apparaat-berichten:

Eigenschap Beschrijving Bereik en standaard
defaultTtlAsIso8601 Standaard-TTL voor cloud-naar-apparaat-berichten ISO_8601 interval van maximaal twee dagen (minimaal één minuut); standaardinstelling: één uur
maxDeliveryCount Maximum aantal leveringen voor cloud-naar-apparaat wachtrijen per apparaat 1 tot 100; standaardinstelling: 10
feedback.ttlAsIso8601 Retentie voor servicegebonden feedbackberichten ISO_8601 interval van maximaal twee dagen (minimaal één minuut); standaardinstelling: één uur
feedback.maxDeliveryCount Maximum aantal leveringen voor de feedbackwachtrij 1 tot 100; standaardinstelling: 10
feedback.lockDurationAsIso8601 Vergrendelingsduur voor de feedbackwachtrij ISO_8601 interval van 5 tot 300 seconden (minimaal vijf seconden); standaard: 60 seconden.

U kunt de configuratieopties op een van de volgende manieren instellen:

  • Azure Portal: selecteer onder Hub-instellingen op uw IoT-hub de optie Ingebouwde eindpunten en ga naar Cloud-naar-apparaatberichten. (Het instellen van de eigenschappen feedback.maxDeliveryCount en feedback.lockDurationAsIso8601 wordt momenteel niet ondersteund in Azure Portal.)

Configuratieopties instellen voor cloud-naar-apparaat-berichten in de portal

  • Azure CLI: gebruik de opdracht 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
    

Volgende stappen

Zie SDK's Azure IoT Hub voor informatie over de SDK's die u kunt gebruiken om cloud-naar-apparaat-berichten te ontvangen.

Als u het ontvangen van cloud-naar-apparaat-berichten wilt proberen, raadpleegt u de zelfstudie Cloud-naar-apparaat verzenden .