Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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č
Nainstalujte Visual Studio (Community, Professional nebo Enterprise). Nezapomeňte povolit vývoj desktopových aplikací pomocí úlohy C++ .
Nainstalujte CMake. Povolte možnost Přidat CMake do systémové cesty pro všechny uživatele .
Nainstalujte verzi x64Mosquitto.
Příprava prostředí pro rozhraní příkazového řádku Azure
Použijte prostředí Bash v Azure Cloud Shellu. Další informace najdete v tématu Začínáme s Azure Cloud Shellem.
Pokud dáváte přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, nainstalujte Azure CLI. Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Dockeru. Další informace najdete v tématu Jak spustit Azure CLI v kontejneru Dockeru.
Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí příkazu az login. Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených v terminálu. Další možnosti přihlášení najdete v tématu Ověřování v Azure pomocí Azure CLI.
Po zobrazení výzvy nainstalujte rozšíření Azure CLI při prvním použití. Další informace o rozšířeních najdete v tématu Použití a správa rozšíření pomocí Azure CLI.
Spusťte az version a zjistěte verzi a nainstalované závislé knihovny. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.
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_pubke 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.