Program till enhet-kommandon för IoT

Azure IoT Hub

Program använder två primära mekanismer för att skicka kommandon till IoT-enheter, meddelanden från moln till enhet och direktmetoder.

  • Program skickar moln-till-enhet-meddelanden till enhetsspecifika meddelandeköer på IoT-plattformen så att enheter kan läsa när de är anslutna. Enheterna bestämmer när meddelandena ska läsas.

  • Program anropar direktmetoder direkt på anslutna enheter med hjälp av ett mönster för begäran-svar över dedikerade IoT-enhetsslutpunkter.

I den här artikeln beskrivs egenskaperna för meddelanden från moln till enhet och direkta metoder. Artikeln beskriver också hur du använder direktmetoder med protokollgatewayer och anslutna standby-enheter.

Meddelanden från moln till enhet

Program skickar moln-till-enhet-kommandomeddelanden för specifika enheter till Azure IoT Hub, som lagrar meddelandena i enhetsspecifika köer. IoT Hub levererar meddelandena till enhetsspecifika köer oavsett om enheterna är anslutna eller inte.

Ett diagram som visar hur IoT Hub lagrar meddelanden i en intern meddelandekö för varje enhet och enheterna söker efter dessa meddelanden.

Följande överväganden gäller när du använder meddelanden från moln till enhet:

  • Meddelandeköer fungerar effektivt som postlådor för enheter och enheterna ansvarar för att avsöka sina meddelandeköer efter nya meddelanden när de är anslutna.
  • Enheter tar emot meddelanden i första hand, vilket gör moln-till-enhet-meddelanden idealiska för sekventiell läsning och agerar på meddelanden.
  • Meddelanden har en konfigurerbar förfallotid, så olästa meddelanden kan så småningom tas bort från enhetens meddelandekö.
  • För tillståndskänslig kommunikation kan program använda en feedbackmottagare för att övervaka leverans och bekräftelse av meddelanden. Programmet kan använda en enda feedbackmottagare för att övervaka alla meddelandeköer för alla enheter.

Direkta metoder

Program anropar direktmetoder direkt på anslutna IoT-enheter och förväntar sig att enheterna ska köra metoderna och registrera dem med IoT Hub. IoT Hub anropar direktmetoderna på anslutna enheter via direktkanaler, och enheterna ansvarar för att köra funktioner och returnera omedelbara resultat.

Ett diagram som visar hur IoT Hub anropar kod direkt på en enskild enhet med hjälp av direktmetoder.

Följande överväganden gäller när du använder direkta metoder:

  • Direkta metoder misslyckas om anslutningen bryts mellan IoT Hub och enheten innan metoden har slutförts. Program kan fånga upp och hantera fel vid återförsök av kommandon.
  • Eftersom det inte finns någon kö måste program som kräver sekvensering av direkta metoder hantera sekvenseringen av metodanrop, så att nästa metod anropas när den föregående metoden slutförs.
  • Om du anropar direktmetoder kan ett program ange två tidsgränser. En timeout anger hur länge IoT Hub ska vänta på att en enhet ska ansluta innan den ger upp, och den andra tidsgränsen anger hur länge anroparen ska vänta på att metoden ska slutföras och svara innan den ger upp.

Direktmetoder med protokollgatewayer

IoT-program som använder protokollgatewayer kan dra nytta av modellen för anslutningstillämpning och begäran-svar för direktmetoder. Moln- eller protokollgatewayer gör det möjligt att ansluta befintliga och olika enheter för att IoT Hub genom att agera på uppdrag av enheter för att asynkronisera anpassad protokollkommunikation. Protokollgatewayer kan också abstrahera modellen med direktmetoder genom att serialisera metoder till enhetskompatibla protokollmeddelanden.

Ett diagram som illustrerar sekvensen med direkta metoder anropar för att använda en protokollgateway för att asynkrona anpassad protokollkommunikation från en enhet till IoT Hub.

  1. Programmet anropar direktmetoden för enhetens räkning i protokollgatewayen.
  2. För metodimplementeringen översätter gatewayen metoden till ett enhetsspecifikt protokoll och skickar meddelandet till enheten. Enheten känner inte till några ändringar i molnimplementeringen.
  3. När enheten har slutfört meddelandet och svarar översätter gatewayen den enhetsspecifika statusen till metodsvaret.
  4. IoT Hub slutför direktmetoden genom att fylla i ett metodresultat för anroparen.

Azure Protocol Gateway-projektet med öppen källkod översätter direktmetoder till MQTT-protokollmeddelanden internt, är enkelt att utökningsbara och visar den här programmeringsmodellen för andra protokollkort.

Anslutna standby-enheter

IoT-kommandoscenarier kan omfatta anslutna standby-enheter som är i ett inaktivt tillstånd med låg ström när de inte är aktiva. Mekanismer som sms (Mobile Short Message Service) kan skicka aktiveringssignaler för att överföra enheterna till ett fullständigt driftstillstånd.

Ett diagram som illustrerar hur SMS-meddelanden eller kommandon som skickas via Azure IoT-API:erna kan väcka en enhet och ansluta den till IoT Hub för att ta emot kommandon.

  1. Programmet skickar kommandon till enheter med hjälp av ServiceClient-API:et. En instans av ServiceClient kan skicka meddelanden och anropa metoder för flera enheter.
  2. Programmet skickar även SMS-väckningssamtal till standby-enheter via mobilleverantörens SMS-gateway.
  3. Vid aktivering använder standby-enheter DeviceClient-API:et för att ansluta till IoT Hub och ta emot kommandon. En instans av DeviceClient representerar en enda enhet som är ansluten till IoT Hub.

Använda direkta metoder för att fastställa enhetens anslutningsstatus

Det är dyrt att skicka onödiga väckningsmeddelanden via SMS-gatewayer. Innan du skickar faktiska kommandon till en enhet ska du använda timeout-felen för anslutningen och metoden för att avgöra om enheten är ansluten och skicka en aktivering om det behövs.

    TimeSpan connTimeOut = FromSeconds(0); // Period to wait for device to connect.
    TimeSpan funcTimeOut = FromSeconds(30); // Period to wait for method to execute.

    while (true) {
        // Send the command via direct method. Initially use a timeout of zero
        // for the connection, which determines whether the device is connected to
        // IoT Hub or needs an SMS wakeup sent to it.

        var method = new CloudToDeviceMethod("RemoteCommand", funcTimeOut, connTimeOut);
        methodInvocation1.SetPayloadJson(CommandPayload);

        var response = await serviceClient.InvokeDeviceMethodAsync(deviceId, method);

        // [DeviceNotConnected] represents a return value from the CloudToDeviceMethod
        // method. That method is not implemented in this sample.
        if (response == [DeviceNotConnected] && connTimeOut == 0) {
            // The device is not currently connected and needs an SMS wakeup. This
            // device should wake up within a period of < 30 seconds. Send the wakeup
            // and retry the method request with a 30 second timeout on waiting for
            // the device to connect.

            connTimeOut = FromSeconds(30); // Set a 30 second connection timeout.
            SendAsyncSMSWakeUpToDevice(); // Send SMS wakeup through mobile gateway.
            continue; // Retry with new connection timeout.
        } else {
            // The method either succeeded or failed.
            ActOnMethodResult(var);
            break;
        }
    }

Om du bara vill kontrollera anslutningen använder du en tom metod med en tidsgräns för anslutningen på noll för att implementera en enkel ping. Exempel:

var method = new CloudToDeviceMethod("Ping", 0, 0);

Deltagare

Den här artikeln underhålls av Microsoft. Den skrevs ursprungligen av följande deltagare.

Huvudförfattare:

Nästa steg