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
Použijte prostředí Bash v Azure Cloud Shellu. Další informace najdete v tématu Rychlý start pro Bash v Azure Cloud Shellu.
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 Docker. 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 na terminálu. Další možnosti přihlášení najdete v tématu Přihlášení 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 Využití rozšíření v Azure CLI.
Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.
Požadavky na vývojový počítač
Pokud používáte Windows:
Nainstalujte sadu 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.
Pokud používáte Linux:
Spuštěním následujícího příkazu nainstalujte nástroje sestavení:
sudo apt install cmake g++
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: