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 ukázku, která ke správě dvojčete zařízení na zařízení používá knihovnu MQTT.

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

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

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

Pokud používáte Windows:

  1. Nainstalujte sadu 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 x64 Mosquitto.

Pokud používáte Linux:

  1. Spuštěním následujícího příkazu nainstalujte nástroje sestavení:

    sudo apt install cmake g++
    
  2. Spuštěním následujícího příkazu nainstalujte klientskou knihovnu Mosquitto:

    sudo apt install libmosquitto-dev
    

Nastavení prostředí

Pokud ještě nemáte Centrum IoT, spusťte následující příkazy, které vytvoří centrum IoT úrovně Free 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, jak 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

Tip

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 tématu az iot hub generate-sas-token.

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 interakci s centrem IoT pomocí rozhraní příkazového mosquitto_pub řádku

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 prostředí:

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 .

Odeslání telemetrie

Ukázka mosquitto_telemetry ukazuje, jak pomocí knihovny MQTT odeslat do centra IoT zprávu telemetrie typu zařízení-cloud.

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

Vygeneruje az iot hub monitor-events následující výstup, který zobrazuje datovou část odeslanou 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 tématu Odesílání zpráv typu zařízení-cloud.

Přijetí zprávy typu cloud-zařízení

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

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

./build/mosquitto_subscribe

Spuštěním následujícího příkazu odešlete ze služby IoT Hub zprávu typu cloud-zařízení. 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í. Jedná se # o zástupný znak s více úrovněmi:

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

Funkce main používá funkci k nastavení zpětného mosquitto_message_callback_set volání pro zpracování zpráv odesílaných z centra IoT a používá funkci k přihlášení k odběru mosquitto_subscribe 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 Použití MQTT k příjmu zpráv typu cloud-zařízení.

Aktualizace dvojčete zařízení

Ukázka mosquitto_device_twin ukazuje, jak nastavit ohlášenou vlastnost ve dvojčeti zařízení a pak ji 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 k nastavení zpětného mosquitto_connect_callback_set volání pro zpracování zpráv odesílaných z centra IoT a používá mosquitto_subscribe funkci k přihlášení k odběru $iothub/twin/res/# tématu.

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 do $iothub/twin/PATCH/properties/reported/?$rid=%d tématu. 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 message_callback funkce zavolá dvakrát. Zařízení poprvé obdrží odpověď z centra IoT na aktualizaci ohlášené vlastnosti. Zařízení pak požádá o dvojče zařízení. Druhé, zařízení obdrží požadované dvojče zařízení. 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í.

Vyčištění prostředků

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: