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

Prasyarat mesin pengembangan

Jika Anda menggunakan Windows:

  1. Instal Visual Studio (Komunitas, Profesional, atau Perusahaan). Pastikan untuk mengaktifkan pengembangan Desktop dengan beban kerja C++ .

  2. Pasang CMake. Aktifkan opsi Tambahkan CMake ke JALUR sistem untuk semua pengguna .

  3. Instal Mosquitto versi x64.

Jika Anda menggunakan Linux:

  1. Jalankan perintah berikut untuk menginstal alat build:

    sudo apt install cmake g++
    
  2. 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: