Tutorial - Menggunakan MQTT untuk mengembangkan klien perangkat IoT tanpa menggunakan SDK perangkat
Anda harus menggunakan salah satu SDK Perangkat Azure IoT untuk membangun klien perangkat IoT Anda jika memungkinkan. Namun, dalam skenario seperti menggunakan perangkat yang dibatasi memori, Anda mungkin perlu menggunakan pustaka MQTT untuk berkomunikasi dengan IoT hub Anda.
Sampel dalam tutorial ini menggunakan pustaka Eclipse Mosquitto MQTT.
Dalam tutorial ini, Anda akan mempelajari cara:
- Buat aplikasi sampel klien perangkat bahasa C.
- Jalankan sampel yang menggunakan pustaka MQTT untuk mengirim telemetri.
- Jalankan sampel yang menggunakan pustaka MQTT untuk memproses pesan cloud-ke-perangkat yang dikirim dari hub IoT Anda.
- Jalankan sampel yang menggunakan pustaka MQTT untuk mengelola perangkat kembar pada perangkat.
Anda dapat menggunakan mesin pengembangan Windows atau Linux untuk menyelesaikan langkah-langkah dalam tutorial ini.
Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
Prasyarat
Persiapkan lingkungan Anda untuk Azure CLI
Gunakan lingkungan Bash di Azure Cloud Shell. Untuk informasi selengkapnya, lihat Mulai Cepat untuk Bash di Azure Cloud Shell.
Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, instal Azure CLI. Jika Anda menjalankan Windows atau macOS, pertimbangkan untuk menjalankan Azure CLI dalam kontainer Docker. Untuk informasi lebih lanjut, lihat Cara menjalankan Azure CLI di kontainer Docker.
Jika Anda menggunakan instalasi lokal, masuk ke Azure CLI dengan menggunakan perintah login az. Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda. Untuk opsi masuk lainnya, lihat Masuk dengan Azure CLI.
Saat Anda diminta, instal ekstensi Azure CLI pada penggunaan pertama. Untuk informasi selengkapnya tentang ekstensi, lihat Menggunakan ekstensi dengan Azure CLI.
Jalankan versi az untuk menemukan versi dan pustaka dependen yang diinstal. Untuk meningkatkan ke versi terbaru, jalankan peningkatan az.
Prasyarat mesin pengembangan
Jika Anda menggunakan Windows:
Instal Visual Studio (Komunitas, Profesional, atau Perusahaan). Pastikan untuk mengaktifkan pengembangan Desktop dengan beban kerja C++ .
Pasang CMake. Aktifkan opsi Tambahkan CMake ke JALUR sistem untuk semua pengguna .
Instal Mosquitto versi x64.
Jika Anda menggunakan Linux:
Jalankan perintah berikut untuk menginstal alat build:
sudo apt install cmake g++
Jalankan perintah berikut untuk menginstal pustaka klien Mosquitto:
sudo apt install libmosquitto-dev
Menyiapkan lingkungan Anda
Jika Anda belum memiliki hub IoT, jalankan perintah berikut untuk membuat hub IoT tingkat bebas dalam grup sumber daya yang disebut mqtt-sample-rg
. Perintah menggunakan nama my-hub
sebagai contoh untuk nama hub IoT yang akan dibuat. Pilih nama unik untuk hub IoT Anda untuk digunakan sebagai ganti 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
Catat nama hub IoT Anda, Anda membutuhkannya nanti.
Daftarkan perangkat di hub IoT Anda. Perintah berikut mendaftarkan perangkat yang disebut mqtt-dev-01
di hub IoT yang disebut my-hub
. Pastikan untuk menggunakan nama hub IoT Anda:
az iot hub device-identity create --hub-name my-hub --device-id mqtt-dev-01
Gunakan perintah berikut untuk membuat token SAS yang memberikan akses perangkat ke hub IoT Anda. Pastikan untuk menggunakan nama hub IoT Anda:
az iot hub generate-sas-token --device-id mqtt-dev-01 --hub-name my-hub --du 7200
Catat token SAS output perintah saat Anda membutuhkannya nanti. Token SAS terlihat seperti SharedAccessSignature sr=my-hub.azure-devices.net%2Fdevices%2Fmqtt-dev-01&sig=%2FnM...sNwtnnY%3D&se=1677855761
Tip
Secara default, token SAS berlaku selama 60 menit. --du 7200
Opsi dalam perintah sebelumnya memperluas durasi token menjadi dua jam. Jika kedaluwarsa sebelum Anda siap menggunakannya, buat yang baru. Anda juga dapat membuat token dengan durasi yang lebih lama. Untuk mempelajari lebih lanjut, lihat az iot hub generate-sas-token.
Mengkloning repositori sampel
Gunakan perintah berikut untuk mengkloning repositori sampel ke lokasi yang sesuai di komputer lokal Anda:
git clone https://github.com/Azure-Samples/IoTMQTTSample.git
Repositori ini juga mencakup:
- Sampel Python yang menggunakan
paho-mqtt
pustaka. - Instruksi untuk menggunakan
mosquitto_pub
CLI untuk berinteraksi dengan hub IoT Anda.
Membangun sampel C
Sebelum membuat sampel, Anda perlu menambahkan hub IoT dan detail perangkat. Di repositori IoTMQTTSample yang dikloning, buka file mosquitto/src/config.h . Tambahkan nama hub IoT, ID perangkat, dan token SAS Anda sebagai berikut. Pastikan untuk menggunakan nama hub IoT Anda:
// 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"
Catatan
File IoTHubRootCA.crt.pem menyertakan sertifikat akar CA untuk koneksi TLS.
Simpan perubahan ke file mosquitto/src/config.h .
Untuk membuat sampel, jalankan perintah berikut di shell Anda:
cd mosquitto
cmake -Bbuild
cmake --build build
Di Linux, biner berada di folder ./build di bawah folder mosquitto .
Di Windows, biner berada di folder .\build\Debug di bawah folder mosquitto .
Kirim telemetri
Sampel mosquitto_telemetry menunjukkan cara mengirim pesan telemetri perangkat ke cloud ke hub IoT Anda dengan menggunakan pustaka MQTT.
Sebelum Anda menjalankan aplikasi sampel, jalankan perintah berikut untuk memulai pemantau peristiwa untuk hub IoT Anda. Pastikan untuk menggunakan nama hub IoT Anda:
az iot hub monitor-events --hub-name my-hub
Jalankan sampel mosquitto_telemetry . Misalnya, di Linux:
./build/mosquitto_telemetry
az iot hub monitor-events
menghasilkan output berikut yang menunjukkan payload yang dikirim oleh perangkat:
Starting event monitor, use ctrl-c to stop...
{
"event": {
"origin": "mqtt-dev-01",
"module": "",
"interface": "",
"component": "",
"payload": "Bonjour MQTT from Mosquitto"
}
}
Anda sekarang dapat menghentikan pemantau peristiwa.
Mengulas kode
Cuplikan berikut diambil dari file mosquitto/src/mosquitto_telemetry.cpp .
Pernyataan berikut menentukan informasi koneksi dan nama topik MQTT yang Anda gunakan untuk mengirim pesan telemetri:
#define HOST IOTHUBNAME ".azure-devices.net"
#define PORT 8883
#define USERNAME HOST "/" DEVICEID "/?api-version=2020-09-30"
#define TOPIC "devices/" DEVICEID "/messages/events/"
Fungsi ini main
mengatur nama pengguna dan kata sandi untuk mengautentikasi dengan hub IoT Anda. Kata sandi adalah token SAS yang Anda buat untuk perangkat Anda:
mosquitto_username_pw_set(mosq, USERNAME, SAS_TOKEN);
Sampel menggunakan topik MQTT untuk mengirim pesan telemetri ke hub IoT Anda:
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");
Untuk mempelajari selengkapnya, lihat Mengirim pesan perangkat ke cloud.
Menerima pesan cloud-ke-perangkat
Sampel mosquitto_subscribe menunjukkan cara berlangganan topik MQTT dan menerima pesan cloud-ke-perangkat dari hub IoT Anda dengan menggunakan pustaka MQTT.
Jalankan sampel mosquitto_subscribe . Misalnya, di Linux:
./build/mosquitto_subscribe
Jalankan perintah berikut untuk mengirim pesan cloud-ke-perangkat dari hub IoT Anda. Pastikan untuk menggunakan nama hub IoT Anda:
az iot device c2d-message send --hub-name my-hub --device-id mqtt-dev-01 --data "hello world"
Output dari mosquitto_subscribe terlihat seperti contoh berikut:
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
Mengulas kode
Cuplikan berikut diambil dari file mosquitto/src/mosquitto_subscribe.cpp .
Pernyataan berikut menentukan filter topik yang digunakan perangkat untuk menerima pesan cloud ke perangkat. #
adalah kartubebas multi-tingkat:
#define DEVICEMESSAGE "devices/" DEVICEID "/messages/#"
Fungsi ini main
menggunakan mosquitto_message_callback_set
fungsi untuk mengatur panggilan balik untuk menangani pesan yang dikirim dari hub IoT Anda dan menggunakan mosquitto_subscribe
fungsi untuk berlangganan semua pesan. Cuplikan berikut menunjukkan fungsi panggilan balik:
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");
}
}
Untuk mempelajari selengkapnya, lihat Menggunakan MQTT untuk menerima pesan cloud-ke-perangkat.
Memperbarui perangkat kembar
Sampel mosquitto_device_twin menunjukkan cara mengatur properti yang dilaporkan dalam kembar perangkat lalu membaca kembali properti .
Jalankan sampel mosquitto_device_twin . Misalnya, di Linux:
./build/mosquitto_device_twin
Output dari mosquitto_device_twin terlihat seperti contoh berikut:
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.
Mengulas kode
Cuplikan berikut diambil dari file mosquitto/src/mosquitto_device_twin.cpp .
Pernyataan berikut menentukan topik yang digunakan perangkat untuk berlangganan pembaruan kembar perangkat, membaca perangkat kembar, dan memperbarui perangkat kembar:
#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"
Fungsi ini main
menggunakan mosquitto_connect_callback_set
fungsi untuk mengatur panggilan balik untuk menangani pesan yang dikirim dari hub IoT Anda dan menggunakan mosquitto_subscribe
fungsi untuk berlangganan topik.$iothub/twin/res/#
Cuplikan berikut menunjukkan connect_callback
fungsi yang menggunakan mosquitto_publish
untuk mengatur properti yang dilaporkan di perangkat kembar. Perangkat menerbitkan pesan ke topik tersebut $iothub/twin/PATCH/properties/reported/?$rid=%d
. Nilainya %d
bertahap setiap kali perangkat menerbitkan pesan ke topik:
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 ...
}
Perangkat berlangganan $iothub/twin/res/#
topik dan ketika menerima pesan dari hub IoT Anda, fungsi menanganinya message_callback
. Saat Anda menjalankan sampel, fungsi akan dipanggil message_callback
dua kali. Pertama kali, perangkat menerima respons dari hub IoT ke pembaruan properti yang dilaporkan. Perangkat kemudian meminta perangkat kembar. Kedua kalinya, perangkat menerima perangkat kembar yang diminta. Cuplikan message_callback
berikut menunjukkan fungsi :
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
}
}
Untuk mempelajari selengkapnya, lihat Menggunakan MQTT untuk memperbarui properti yang dilaporkan kembar perangkat dan Menggunakan MQTT untuk mengambil properti kembar perangkat.
Membersihkan sumber daya
Jika Anda berencana untuk melanjutkan dengan lebih banyak artikel pengembang perangkat, Anda dapat menyimpan dan menggunakan kembali sumber daya yang Anda gunakan dalam artikel ini. Jika tidak, Anda dapat menghapus sumber daya yang Anda buat di artikel ini untuk menghindari lebih banyak biaya.
Anda dapat menghapus hub dan perangkat terdaftar sekaligus dengan menghapus seluruh grup sumber daya dengan perintah Azure CLI berikut. Jangan gunakan perintah ini jika sumber daya ini berbagi grup sumber daya dengan sumber daya lain yang ingin Anda pertahankan.
az group delete --name <YourResourceGroupName>
Untuk menghapus hanya hub IoT, jalankan perintah berikut menggunakan Azure CLI:
az iot hub delete --name <YourIoTHubName>
Untuk menghapus hanya identitas perangkat yang Anda daftarkan dengan hub IoT Anda, jalankan perintah berikut menggunakan Azure CLI:
az iot hub device-identity delete --hub-name <YourIoTHubName> --device-id <YourDeviceID>
Anda mungkin juga ingin menghapus file sampel kloning dari mesin pengembangan Anda.
Langkah berikutnya
Sekarang setelah Anda mempelajari cara menggunakan pustaka MQTT Mosquitto untuk berkomunikasi dengan IoT Hub, langkah selanjutnya yang disarankan adalah meninjau: