Sdílet prostřednictvím


Kurz – Použití MQTT k vývoji klienta zařízení IoT bez použití sady SDK pro zařízení

Pokud je to možné, měli byste použít některou ze sad SDK zařízení Azure IoT k sestavení klientů zařízení IoT. Ve scénářích, jako je použití zařízení s omezenými paměťmi, ale možná budete muset ke komunikaci s centrem IoT použít knihovnu MQTT.

Ukázky v tomto kurzu používají knihovnu Eclipse Mosquitto MQTT.

V tomto kurzu se naučíte:

  • Sestavte ukázkové aplikace klientského zařízení jazyka C.
  • Spusťte ukázku, která k odesílání telemetrie používá knihovnu MQTT.
  • Spusťte ukázku, která používá knihovnu MQTT ke zpracování zprávy z cloudu do zařízení odesílané z centra IoT.
  • Spusťte na zařízení ukázku, která používá knihovnu MQTT ke správě digitálního dvojčete zařízení.

K dokončení kroků v tomto kurzu můžete použít vývojový počítač s Windows nebo Linuxem.

Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.

Požadavky

Požadavky na vývojový počítač

  1. Nainstalujte Visual Studio (Community, Professional nebo Enterprise). Nezapomeňte povolit vývoj desktopových aplikací pomocí úlohy C++ .

  2. Nainstalujte CMake. Povolte možnost Přidat CMake do systémové cesty pro všechny uživatele .

  3. Nainstalujte verzi x64Mosquitto.

Příprava prostředí pro rozhraní příkazového řádku Azure

Nastavení prostředí

Pokud nemáte Centrum IoT, spusťte následující příkazy pro vytvoření bezplatného centra IoT ve skupině prostředků s názvem mqtt-sample-rg. Tento příkaz použije název my-hub jako příklad pro název IoT Hubu k vytvoření. Zvolte jedinečný název vašeho centra IoT, který se má použít místo my-hub:

az group create --name mqtt-sample-rg --location eastus
az iot hub create --name my-hub --resource-group mqtt-sample-rg --sku F1 

Poznamenejte si název centra IoT a budete ho potřebovat později.

Zaregistrujte zařízení ve službě IoT Hub. Následující příkaz zaregistruje zařízení volané mqtt-dev-01 ve službě IoT Hub s názvem my-hub. Nezapomeňte použít název centra IoT:

az iot hub device-identity create --hub-name my-hub --device-id mqtt-dev-01

Pomocí následujícího příkazu vytvořte token SAS, který udělí zařízení přístup k vašemu ioT Hubu. Nezapomeňte použít název centra IoT:

az iot hub generate-sas-token --device-id mqtt-dev-01 --hub-name my-hub --du 7200

Poznamenejte si token SAS, který příkaz vypíše, protože ho budete později potřebovat. Token SAS vypadá takto: SharedAccessSignature sr=my-hub.azure-devices.net%2Fdevices%2Fmqtt-dev-01&sig=%2FnM...sNwtnnY%3D&se=1677855761

Návod

Ve výchozím nastavení je token SAS platný po dobu 60 minut. Možnost --du 7200 v předchozím příkazu prodlužuje dobu trvání tokenu na dvě hodiny. Pokud vyprší, než budete připraveni ho použít, vygenerujte nový. Token můžete také vytvořit s delší dobou trvání. Další informace najdete v az iot hub generate-sas-token.

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.

Klonování ukázkového úložiště

Pomocí následujícího příkazu naklonujte ukázkové úložiště do vhodného umístění na místním počítači:

git clone https://github.com/Azure-Samples/IoTMQTTSample.git

Úložiště také zahrnuje:

  • Ukázka Pythonu, která používá knihovnu paho-mqtt
  • Pokyny k používání rozhraní příkazového řádku mosquitto_pub ke správě vašeho IoT centra.

Sestavení ukázek jazyka C

Před vytvořením ukázky je potřeba přidat podrobnosti o centru IoT a zařízení. V naklonovaném úložišti IoTMQTTSample otevřete soubor mosquitto/src/config.h . Následujícím způsobem přidejte název centra IoT, ID zařízení a token SAS. Nezapomeňte použít název centra IoT:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#define IOTHUBNAME "my-hub"
#define DEVICEID   "mqtt-dev-01"
#define SAS_TOKEN  "SharedAccessSignature sr=my-hub.azure-devices.net%2Fdevices%2Fmqtt-dev-01&sig=%2FnM...sNwtnnY%3D&se=1677855761"

#define CERTIFICATEFILE CERT_PATH "IoTHubRootCA.crt.pem"

Poznámka:

Soubor IoTHubRootCA.crt.pem obsahuje kořenové certifikáty certifikační autority pro připojení TLS.

Uložte změny do souboru mosquitto/src/config.h .

Ukázky sestavíte spuštěním následujících příkazů v příkazovém řádku:

cd mosquitto
cmake -Bbuild
cmake --build build

V Linuxu jsou binární soubory ve složce ./build pod složkou mosquitto .

Ve Windows jsou binární soubory ve složce .\build\Debug pod složkou mosquitto .

Odesílání telemetrie

Ukázka mosquitto_telemetry ukazuje, jak pomocí knihovny MQTT odesílat telemetrickou zprávu z zařízení do cloudu do vašeho centra IoT.

Před spuštěním ukázkové aplikace spusťte následující příkaz, který spustí monitorování událostí pro centrum IoT. Nezapomeňte použít název centra IoT:

az iot hub monitor-events --hub-name my-hub

Spusťte ukázku mosquitto_telemetry . Například v Linuxu:

./build/mosquitto_telemetry

Generuje následující výstup az iot hub monitor-events, který zobrazuje datový soubor odeslaný zařízením:

Starting event monitor, use ctrl-c to stop...
{
    "event": {
        "origin": "mqtt-dev-01",
        "module": "",
        "interface": "",
        "component": "",
        "payload": "Bonjour MQTT from Mosquitto"
    }
}

Monitorování událostí teď můžete zastavit.

Kontrola kódu

Následující fragmenty kódu pocházejí ze souboru mosquitto/src/mosquitto_telemetry.cpp .

Následující příkazy definují informace o připojení a název tématu MQTT, které používáte k odeslání zprávy telemetrie:

#define HOST IOTHUBNAME ".azure-devices.net"
#define PORT 8883
#define USERNAME HOST "/" DEVICEID "/?api-version=2020-09-30"

#define TOPIC "devices/" DEVICEID "/messages/events/"

Funkce main nastaví uživatelské jméno a heslo pro ověření ve službě IoT Hub. Heslo je token SAS, který jste vytvořili pro vaše zařízení:

mosquitto_username_pw_set(mosq, USERNAME, SAS_TOKEN);

Ukázka používá téma MQTT k odeslání telemetrické zprávy do centra IoT:

int msgId  = 42;
char msg[] = "Bonjour MQTT from Mosquitto";

// once connected, we can publish a Telemetry message
printf("Publishing....\r\n");
rc = mosquitto_publish(mosq, &msgId, TOPIC, sizeof(msg) - 1, msg, 1, true);
if (rc != MOSQ_ERR_SUCCESS)
{
    return mosquitto_error(rc);
}
printf("Publish returned OK\r\n");

Další informace najdete v části Odesílání zpráv z zařízení do cloudu.

Přijměte zprávu z cloudu na zařízení

Ukázka mosquitto_subscribe ukazuje, jak se přihlásit k odběru témat MQTT a přijímat zprávy z centra IoT prostřednictvím knihovny MQTT.

Spusťte ukázku mosquitto_subscribe. Například v Linuxu:

./build/mosquitto_subscribe

Spusťte následující příkaz pro odeslání zprávy z IoT hubu do zařízení v cloudu. Nezapomeňte použít název centra IoT:

az iot device c2d-message send --hub-name my-hub --device-id mqtt-dev-01 --data "hello world"

Výstup z mosquitto_subscribe vypadá jako v následujícím příkladu:

Waiting for C2D messages...
C2D message 'hello world' for topic 'devices/mqtt-dev-01/messages/devicebound/%24.mid=d411e727-...f98f&%24.to=%2Fdevices%2Fmqtt-dev-01%2Fmessages%2Fdevicebound&%24.ce=utf-8&iothub-ack=none'
Got message for devices/mqtt-dev-01/messages/# topic

Kontrola kódu

Následující fragmenty kódu pocházejí ze souboru mosquitto/src/mosquitto_subscribe.cpp .

Následující příkaz definuje filtr tématu, který zařízení používá k příjmu zpráv ze cloudu do zpráv zařízení. # je víceúrovňový zástupný znak.

#define DEVICEMESSAGE "devices/" DEVICEID "/messages/#"

Funkce main používá funkci mosquitto_message_callback_set k nastavení zpětného volání pro zpracování zpráv odesílaných z vašeho centra IoT a používá funkci mosquitto_subscribe k přihlášení k odběru všech zpráv. Následující fragment kódu ukazuje funkci zpětného volání:

void message_callback(struct mosquitto* mosq, void* obj, const struct mosquitto_message* message)
{
    printf("C2D message '%.*s' for topic '%s'\r\n", message->payloadlen, (char*)message->payload, message->topic);

    bool match = 0;
    mosquitto_topic_matches_sub(DEVICEMESSAGE, message->topic, &match);

    if (match)
    {
        printf("Got message for " DEVICEMESSAGE " topic\r\n");
    }
}

Další informace najdete v tématu Příjem zpráv z cloudu do zařízení pomocí MQTT.

Aktualizovat dvojče zařízení

Ukázka mosquitto_device_twin ukazuje, jak nastavit ohlášenou vlastnost ve dvojčeti zařízení a pak vlastnost znovu přečíst.

Spusťte ukázku mosquitto_device_twin. Například v Linuxu:

./build/mosquitto_device_twin

Výstup z mosquitto_device_twin vypadá jako v následujícím příkladu:

Setting device twin reported properties....
Device twin message '' for topic '$iothub/twin/res/204/?$rid=0&$version=2'
Setting device twin properties SUCCEEDED.

Getting device twin properties....
Device twin message '{"desired":{"$version":1},"reported":{"temperature":32,"$version":2}}' for topic '$iothub/twin/res/200/?$rid=1'
Getting device twin properties SUCCEEDED.

Kontrola kódu

Následující fragmenty kódu pocházejí ze souboru mosquitto/src/mosquitto_device_twin.cpp .

Následující příkazy definují témata, která zařízení používá k přihlášení k odběru aktualizací dvojčete zařízení, čtení dvojčete zařízení a aktualizace dvojčete zařízení:

#define DEVICETWIN_SUBSCRIPTION  "$iothub/twin/res/#"
#define DEVICETWIN_MESSAGE_GET   "$iothub/twin/GET/?$rid=%d"
#define DEVICETWIN_MESSAGE_PATCH "$iothub/twin/PATCH/properties/reported/?$rid=%d"

Funkce main používá funkci mosquitto_connect_callback_set k nastavení zpětného volání pro zpracování zpráv odesílaných z vašeho centra IoT a funkci mosquitto_subscribe k přihlášení k odběru tématu $iothub/twin/res/#.

Následující fragment kódu ukazuje connect_callback funkci, která používá mosquitto_publish k nastavení ohlášené vlastnosti ve dvojčeti zařízení. Zařízení publikuje zprávu na téma $iothub/twin/PATCH/properties/reported/?$rid=%d. Hodnota %d se zvýší pokaždé, když zařízení publikuje zprávu do tématu:

void connect_callback(struct mosquitto* mosq, void* obj, int result)
{
    // ... other code ...  

    printf("\r\nSetting device twin reported properties....\r\n");

    char msg[] = "{\"temperature\": 32}";
    char mqtt_publish_topic[64];
    snprintf(mqtt_publish_topic, sizeof(mqtt_publish_topic), DEVICETWIN_MESSAGE_PATCH, device_twin_request_id++);

    int rc = mosquitto_publish(mosq, NULL, mqtt_publish_topic, sizeof(msg) - 1, msg, 1, true);
    if (rc != MOSQ_ERR_SUCCESS)

    // ... other code ...  
}

Zařízení se přihlásí k odběru $iothub/twin/res/# tématu a když obdrží zprávu z centra IoT, message_callback funkce ji zpracuje. Při spuštění ukázky se funkce message_callback zavolá dvakrát. Zařízení poprvé obdrží odpověď z centra IoT na aktualizaci ohlášené vlastnosti. Zařízení pak požádá o digitální dvojče zařízení. Podruhé zařízení obdrží požadované zařízení dvojče. Následující fragment kódu ukazuje message_callback funkci:

void message_callback(struct mosquitto* mosq, void* obj, const struct mosquitto_message* message)
{
    printf("Device twin message '%.*s' for topic '%s'\r\n", message->payloadlen, (char*)message->payload, message->topic);

    const char patchTwinTopic[] = "$iothub/twin/res/204/?$rid=0";
    const char getTwinTopic[]   = "$iothub/twin/res/200/?$rid=1";

    if (strncmp(message->topic, patchTwinTopic, sizeof(patchTwinTopic) - 1) == 0)
    {
        // Process the reported property response and request the device twin
        printf("Setting device twin properties SUCCEEDED.\r\n\r\n");

        printf("Getting device twin properties....\r\n");

        char msg[] = "{}";
        char mqtt_publish_topic[64];
        snprintf(mqtt_publish_topic, sizeof(mqtt_publish_topic), DEVICETWIN_MESSAGE_GET, device_twin_request_id++);

        int rc = mosquitto_publish(mosq, NULL, mqtt_publish_topic, sizeof(msg) - 1, msg, 1, true);
        if (rc != MOSQ_ERR_SUCCESS)
        {
            printf("Error: %s\r\n", mosquitto_strerror(rc));
        }
    }
    else if (strncmp(message->topic, getTwinTopic, sizeof(getTwinTopic) - 1) == 0)
    {
        // Process the device twin response and stop the client
        printf("Getting device twin properties SUCCEEDED.\r\n\r\n");

        mosquitto_loop_stop(mosq, false);
        mosquitto_disconnect(mosq); // finished, exit program
    }
}

Další informace najdete v tématu Použití MQTT k aktualizaci ohlášené vlastnosti dvojčete zařízení a použití MQTT k načtení vlastnosti dvojčete zařízení.

Čištění zdrojů

Pokud máte v plánu pokračovat v dalších článcích pro vývojáře zařízení, můžete zachovat a znovu použít prostředky, které jste použili v tomto článku. Jinak můžete odstranit prostředky, které jste vytvořili v tomto článku, abyste se vyhnuli dalším poplatkům.

Centrum i zaregistrované zařízení můžete odstranit najednou odstraněním celé skupiny prostředků pomocí následujícího příkazu Azure CLI. Tento příkaz nepoužívejte, pokud tyto prostředky sdílejí skupinu prostředků s dalšími prostředky, které chcete zachovat.

az group delete --name <YourResourceGroupName>

Pokud chcete odstranit jenom IoT Hub, spusťte pomocí Azure CLI následující příkaz:

az iot hub delete --name <YourIoTHubName>

Pokud chcete odstranit jenom identitu zařízení, kterou jste zaregistrovali ve službě IoT Hub, spusťte pomocí Azure CLI následující příkaz:

az iot hub device-identity delete --hub-name <YourIoTHubName> --device-id <YourDeviceID>

Můžete také z vývojového počítače odebrat klonované ukázkové soubory.

Další kroky

Teď, když jste se naučili používat knihovnu Mosquitto MQTT ke komunikaci se službou IoT Hub, je navrhovaným dalším krokem kontrola ukázek aplikací MQTT na GitHubu.