Skicka meddelanden från moln till enhet med IoT Hub (Node.js)

Azure IoT Hub är en fullständigt hanterad tjänst som möjliggör tillförlitlig och säker dubbelriktad kommunikation mellan miljontals enheter och en serverdelslösning.

Den här artikeln visar hur du:

  • Skicka meddelanden från moln till enhet (C2D) från din lösningsserverdel till en enda enhet via IoT Hub

  • Ta emot meddelanden från moln till enhet på en enhet

  • Bekräftelse av leveransbegäran (feedback), från lösningens serverdel, för meddelanden som skickas till en enhet från IoT Hub

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.

I slutet av den här artikeln kör du två Node.js konsolappar:

  • simple_sample_device: en exempelenhetsapp som ingår i Microsoft Azure IoT SDK för Node.js, som ansluter till din IoT-hubb och tar emot meddelanden från molnet till enheten.

  • SendCloudToDevice: en tjänstapp som skickar ett moln-till-enhet-meddelande till enhetsappen via IoT Hub och sedan får sin leveransbekräftelse.

Anteckning

IoT Hub har SDK-stöd för många enhetsplattformar och språk (C, Java, Python och JavaScript) via SDK:er för Azure IoT-enheter.

Mer information om moln-till-enhet-meddelanden finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.

Förutsättningar

  • En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

  • En IoT-hubb i din Azure-prenumeration. Om du inte har någon hubb ännu kan du följa stegen i Skapa en IoT-hubb.

  • En enhet som är registrerad i din IoT-hubb. Om du inte har registrerat en enhet ännu kan du registrera en i Azure Portal.

  • Den här artikeln använder exempelkod från Azure IoT SDK för Node.js.

    • Ladda ned eller klona SDK-lagringsplatsen från GitHub till utvecklingsdatorn.
    • Kontrollera att Node.js version 10.0.x eller senare är installerad på utvecklingsdatorn. Förbered utvecklingsmiljön beskriver hur du installerar Node.js för den här artikeln i Windows eller Linux.
  • Kontrollera att port 8883 är öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar via port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).

Hämta enhetens anslutningssträng

I den här artikeln kör du en exempelapp som simulerar en enhet som tar emot meddelanden från molnet till enheten som skickas via din IoT Hub. Den simple_sample_device exempelappen som ingår i Microsoft Azure IoT SDK för Node.js ansluter till din IoT-hubb och fungerar som din simulerade enhet. Exemplet använder den primära anslutningssträngen för den registrerade enheten på din IoT-hubb.

Så här hämtar du den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.

  2. Välj Enheter under Enhetshantering i fönstret till vänster i IoT Hub.

  3. Välj lämplig enhet i listan över enheter.

  4. Kopiera den primära anslutningssträngen och spara värdet.

    Skärmbild som visar hur du hämtar den primära anslutningssträngen för en enhet som är registrerad på din IoT-hubb i Azure Portal.

Ta emot meddelanden i enhetsappen

I det här avsnittet kör du simple_sample_device exempelenhetsappen för att ta emot C2D-meddelanden som skickas via din IoT-hubb. Öppna en ny kommandotolk och gå till mappen azure-iot-sdk-node\device\samples\javascript under mappen där du expanderade Azure IoT-Node.js SDK. Kör följande kommandon och {Your device connection string} ersätt platshållarvärdet med enhetsanslutningssträngen som du kopierade från den registrerade enheten i IoT-hubben.

set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js

Följande utdata kommer från exempelenhetsappen när den har startats och ansluter till din IoT-hubb:

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}

I det här exemplet anropar enheten den fullständiga funktionen för att meddela IoT Hub att den har bearbetat meddelandet och att det på ett säkert sätt kan tas bort från enhetskön. Anropet som ska slutföras krävs inte om du använder MQTT-transport och kan utelämnas. Det krävs för AMQP och HTTPS.

Med AMQP och HTTPS, men inte MQTT, kan enheten också:

  • Avbryt ett meddelande, vilket resulterar i IoT Hub att meddelandet bevaras i enhetskön för framtida förbrukning.
  • Avvisa ett meddelande som permanent tar bort meddelandet från enhetskön.

Om något händer som hindrar enheten från att slutföra, överge eller avvisa meddelandet, kommer IoT Hub efter en fast tidsgräns att köa meddelandet för leverans igen. Därför måste logiken för meddelandebearbetning i enhetsappen vara idempotent, så att samma meddelande tas emot flera gånger ger samma resultat.

Mer information om meddelandelivscykeln från moln till enhet och hur IoT Hub bearbetar meddelanden från molnet till enheten finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.

Anteckning

Om du använder HTTPS i stället för MQTT eller AMQP som transport söker klientinstansen efter meddelanden från IoT Hub sällan (minst var 25:e minut). Mer information om skillnaderna mellan MQTT-, AMQP- och HTTPS-stöd finns i Vägledning för kommunikation från moln till enhet och Välj ett kommunikationsprotokoll.

Hämta IoT Hub-anslutningssträngen

I den här artikeln skapar du en serverdelstjänst för att skicka meddelanden från moln till enhet via din IoT Hub. Om du vill skicka meddelanden från molnet till enheten behöver din tjänst behörighet att ansluta till tjänsten . Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet service som ger den här behörigheten.

Så här hämtar du IoT Hub anslutningssträngen för tjänstprincipen:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.

  2. I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du tjänstprincipen .

  4. Kopiera den primära anslutningssträngen och spara värdet.

Skärmbild som visar hur du hämtar anslutningssträngen från din IoT Hub i Azure Portal.

Mer information om IoT Hub principer och behörigheter för delad åtkomst finns i Åtkomstkontroll och behörigheter.

Skicka ett meddelande från molnet till enheten

I det här avsnittet skapar du en Node.js-konsolapp som skickar meddelanden från molnet till enheten till den simulerade enhetsappen. Du behöver enhets-ID:t från enheten och IoT Hub-anslutningssträngen.

  1. Skapa en tom mapp med namnet sendcloudtodevicemessage. Öppna en kommandotolk, navigera till mappen sendcloudtodevicemessage och kör sedan följande kommando för att skapa en package.json fil i mappen. Tryck på Retur vid varje prompt som visas av npm kommandot för att acceptera standardinställningen för den prompten:

    npm init
    
  2. Kör följande kommando i kommandotolken i mappen sendcloudtodevicemessage för att installera paketet azure-iothub :

    npm install azure-iothub --save
    
  3. Skapa en SendCloudToDeviceMessage.js fil i mappen sendcloudtodevicemessage med hjälp av en textredigerare.

  4. Lägg till följande require -instruktioner i början av SendCloudToDeviceMessage.js-filen :

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Lägg till följande kod iSendCloudToDeviceMessage.js filen. Ersätt platshållarvärdena "{iot hub connection string}" och "{device ID}" med IoT Hub-anslutningssträngen och enhets-ID:t som du antecknade tidigare:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Lägg till följande funktion för att skriva ut åtgärdsresultat till konsolen:

    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);
      };
    }
    
  7. Lägg till följande funktion för att skriva ut feedbackmeddelanden för leverans till konsolen:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Lägg till följande kod för att skicka ett meddelande till enheten och hantera feedbackmeddelandet när enheten bekräftar meddelandet från molnet till enheten:

    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'));
      }
    });
    
  9. Spara och stäng SendCloudToDeviceMessage.js fil.

Köra programmen

Nu är du redo att köra programmen.

  1. I kommandotolken i mappen azure-iot-sdk-node\device\samples\javascript kör du följande kommando för att skicka telemetri till IoT Hub och lyssna efter meddelanden från molnet till enheten:

    node simple_sample_device.js
    

    Köra den simulerade enhetsappen

  2. I en kommandotolk i mappen sendcloudtodevicemessage kör du följande kommando för att skicka ett meddelande från molnet till enheten och vänta på bekräftelsefeedback:

    node SendCloudToDeviceMessage.js
    

    Kör appen för att skicka kommandot cloud-to-device

    Anteckning

    För enkelhetens skull implementerar den här artikeln inte någon återförsöksprincip. I produktionskoden bör du implementera återförsöksprinciper (till exempel exponentiell backoff), som föreslås i artikeln Hantering av tillfälliga fel.

Nästa steg

I den här artikeln har du lärt dig hur du skickar och tar emot meddelanden från molnet till enheten.