Cloud-naar-apparaat-berichten verzenden met IoT Hub (Node.js)
Azure IoT Hub is een volledig beheerde service die betrouwbare en veilige bidirectionele communicatie tussen miljoenen apparaten en een back-end van een oplossing mogelijk maakt.
In dit artikel leest u informatie over:
Cloud-naar-apparaat-berichten (C2D) verzenden vanaf de back-end van uw oplossing naar één apparaat via IoT Hub
Cloud-naar-apparaat-berichten ontvangen op een apparaat
Ontvangstbevestiging (feedback) aanvragen vanuit de back-end van uw oplossing voor berichten die vanaf IoT Hub naar een apparaat worden verzonden
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 lagen Basic en Standard/free IoT Hub.
Aan het einde van dit artikel voert u twee Node.js console-apps uit:
simple_sample_device: een voorbeeld van een apparaat-app die deel uitmaakt van de Microsoft Azure IoT SDK voor Node.js, die verbinding maakt met uw IoT-hub en cloud-naar-apparaat-berichten ontvangt.
SendCloudToDevice: een service-app die een cloud-naar-apparaat-bericht verzendt naar de apparaat-app via IoT Hub en vervolgens de ontvangstbevestiging ontvangt.
Notitie
IoT Hub biedt SDK-ondersteuning voor veel apparaatplatforms en -talen (C, Java, Python en JavaScript) via de Azure IoT-apparaat-SDK's.
Vereisten
Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.
Een IoT-hub in uw Azure-abonnement. Als u nog geen hub hebt, kunt u de stappen in Een IoT-hub maken volgen.
Een apparaat dat is geregistreerd in uw IoT-hub. Als u nog geen apparaat hebt geregistreerd, registreert u er een in de Azure Portal.
In dit artikel wordt voorbeeldcode van de Azure IoT SDK gebruikt voor Node.js.
- Download of kloon de SDK-opslagplaats van GitHub naar uw ontwikkelcomputer.
- Zorg ervoor dat Node.js versie 10.0.x of hoger is geïnstalleerd op uw ontwikkelcomputer. In Uw ontwikkelomgeving voorbereiden wordt beschreven hoe u Node.js voor dit artikel installeert in Windows of Linux.
Zorg ervoor dat de poort 8883 is geopend in de firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat communiceert via poort 8883. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.
De verbindingsreeks ophalen
In dit artikel voert u een voorbeeld-app uit waarmee een apparaat wordt gesimuleerd, dat cloud-naar-apparaat-berichten ontvangt die via uw IoT Hub worden verzonden. De simple_sample_device voorbeeld-app die is opgenomen in de Microsoft Azure IoT SDK voor Node.js verbinding maakt met uw IoT-hub en fungeert als uw gesimuleerd apparaat. In het voorbeeld wordt de primaire connection string van het geregistreerde apparaat op uw IoT-hub gebruikt.
Voer de volgende stappen uit om de primaire connection string op te halen voor een apparaat dat is geregistreerd bij uw IoT-hub:
Selecteer Resourcegroepenin de Azure Portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.
Selecteer apparaten in het linkerdeelvenster van uw IoT-hub onder Apparaatbeheer.
Selecteer het juiste apparaat in de lijst met apparaten.
Kopieer de Primaire connection string en sla de waarde op.
Berichten ontvangen in de apparaat-app
Voer in deze sectie de simple_sample_device voorbeeldapparaat-app uit om C2D-berichten te ontvangen die zijn verzonden via uw IoT-hub. Open een nieuwe opdrachtprompt en navigeer naar de map azure-iot-sdk-node\device\samples\javascript , onder de map waarin u de Azure IoT Node.js SDK hebt uitgevouwen. Voer de volgende opdrachten uit, waarbij u de waarde van de {Your device connection string}
tijdelijke aanduiding vervangt door het apparaat connection string u hebt gekopieerd van het geregistreerde apparaat in uw IoT-hub.
set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js
De volgende uitvoer is afkomstig van de voorbeeldapparaat-app nadat deze is gestart en verbinding heeft gemaakt met uw IoT-hub:
Client connected
Client connected
Client connected
Sending message: {"deviceId":"myFirstDevice","windSpeed":10.949952400617569,"temperature":26.0096515658525,"humidity":72.59398225838534}
Client connected
Client connected
send status: MessageEnqueued
Sending message: {"deviceId":"myFirstDevice","windSpeed":12.917649160180087,"temperature":27.336831253904613,"humidity":77.37300365434534}
In dit voorbeeld roept het apparaat de volledige functie aan om IoT Hub te melden dat het bericht is verwerkt en dat het veilig uit de apparaatwachtrij kan worden verwijderd. De aanroep die moet worden voltooid , is niet vereist als u MQTT-transport gebruikt en kan worden weggelaten. Dit is vereist voor AMQP en HTTPS.
Met AMQP en HTTPS, maar niet MQTT, kan het apparaat ook het volgende doen:
- Een bericht verlaten, waardoor IoT Hub het bericht in de apparaatwachtrij bewaart voor toekomstig gebruik.
- Een bericht weigeren, waardoor het bericht definitief uit de apparaatwachtrij wordt verwijderd.
Als er iets gebeurt waardoor het apparaat het bericht niet kan voltooien, afbreken of weigeren, zal IoT Hub na een vaste time-outperiode het bericht opnieuw in de wachtrij plaatsen voor bezorging. Daarom moet de logica voor berichtverwerking in de apparaat-app idempotent zijn, zodat hetzelfde bericht meerdere keren wordt ontvangen hetzelfde resultaat oplevert.
Notitie
Als u HTTPS gebruikt in plaats van MQTT of AMQP als transport, controleert het clientexemplaar af en toe op berichten van IoT Hub (minimaal elke 25 minuten). Zie Richtlijnen voor cloud-naar-apparaatcommunicatie en Een communicatieprotocol kiezen voor meer informatie over de verschillen tussen MQTT-, AMQP- en HTTPS-ondersteuning.
De IoT Hub-connection string ophalen
In dit artikel maakt u een back-endservice voor het verzenden van cloud-naar-apparaat-berichten via uw IoT Hub. Als u cloud-naar-apparaat-berichten wilt verzenden, heeft uw service de machtiging serviceverbinding nodig. Standaard wordt elke IoT Hub gemaakt met een gedeeld toegangsbeleid met de naam service die deze machtiging verleent.
Volg deze stappen om de IoT Hub connection string voor het servicebeleid op te halen:
Selecteer Resourcegroepenin de Azure Portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.
Selecteer in het linkerdeelvenster van uw IoT-hub beleid voor gedeelde toegang.
Selecteer het servicebeleid in de lijst met beleidsregels.
Kopieer de Primaire connection string en sla de waarde op.
Zie Toegangsbeheer en machtigingen voor meer informatie over IoT Hub gedeelde toegangsbeleid en -machtigingen.
Een cloud-naar-apparaat-bericht verzenden
In deze sectie maakt u een Node.js console-app waarmee cloud-naar-apparaat-berichten worden verzonden naar de gesimuleerde apparaat-app. U hebt de apparaat-id van uw apparaat en uw IoT Hub connection string nodig.
Maak een lege map met de naam sendcloudtodevicemessage. Open een opdrachtprompt, navigeer naar de map sendcloudtodevicemessage en voer de volgende opdracht uit om een
package.json
bestand in die map te maken. Druk op Enter bij elke prompt die door denpm
opdracht wordt weergegeven om de standaardwaarde voor die prompt te accepteren:npm init
Voer bij de opdrachtprompt in de map sendcloudtodevicemessage de volgende opdracht uit om het pakket azure-iothub te installeren:
npm install azure-iothub --save
Maak met een teksteditor een SendCloudToDeviceMessage.js-bestand in de map sendcloudtodevicemessage .
Voeg de volgende
require
instructies toe aan het begin van het SendCloudToDeviceMessage.js-bestand :'use strict'; var Client = require('azure-iothub').Client; var Message = require('azure-iot-common').Message;
Voeg de volgende code toe aan SendCloudToDeviceMessage.js bestand. Vervang de tijdelijke aanduidingen {iot hub connection string} en {device ID} door de ioT-hub-connection string en apparaat-id die u eerder hebt genoteerd:
var connectionString = '{iot hub connection string}'; var targetDevice = '{device id}'; var serviceClient = Client.fromConnectionString(connectionString);
Voeg de volgende functie toe om bewerkingsresultaten af te drukken op de console:
function printResultFor(op) { return function printResult(err, res) { if (err) console.log(op + ' error: ' + err.toString()); if (res) console.log(op + ' status: ' + res.constructor.name); }; }
Voeg de volgende functie toe om feedbackberichten over bezorging naar de console af te drukken:
function receiveFeedback(err, receiver){ receiver.on('message', function (msg) { console.log('Feedback message:') console.log(msg.getData().toString('utf-8')); }); }
Voeg de volgende code toe om een bericht naar uw apparaat te verzenden en het feedbackbericht te verwerken wanneer het apparaat het cloud-naar-apparaat-bericht bevestigt:
serviceClient.open(function (err) { if (err) { console.error('Could not connect: ' + err.message); } else { console.log('Service client connected'); serviceClient.getFeedbackReceiver(receiveFeedback); var message = new Message('Cloud to device message.'); message.ack = 'full'; message.messageId = "My Message ID"; console.log('Sending message: ' + message.getData()); serviceClient.send(targetDevice, message, printResultFor('send')); } });
SlaSendCloudToDeviceMessage.jsbestand op en sluit het.
De toepassingen uitvoeren
U bent nu klaar om de toepassingen uit te voeren.
Voer bij de opdrachtprompt in de map azure-iot-sdk-node\device\samples\javascript de volgende opdracht uit om telemetrie te verzenden naar IoT Hub en om te luisteren naar cloud-naar-apparaat-berichten:
node simple_sample_device.js
Voer bij een opdrachtprompt in de map sendcloudtodevicemessage de volgende opdracht uit om een cloud-naar-apparaat-bericht te verzenden en te wachten op de bevestigingsfeedback:
node SendCloudToDeviceMessage.js
Notitie
Ter vereenvoudiging wordt in dit artikel geen beleid voor opnieuw proberen geïmplementeerd. In productiecode moet u beleid voor opnieuw proberen implementeren (zoals exponentieel uitstel), zoals wordt voorgesteld in het artikel Tijdelijke foutafhandeling.
Volgende stappen
In dit artikel hebt u geleerd hoe u cloud-naar-apparaat-berichten kunt verzenden en ontvangen.
Zie IoT Hub berichten maken en lezen voor meer informatie over IoT Hub berichtindelingen.