Bagikan melalui


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 hub IoT Anda.

Sampel dalam tutorial ini menggunakan pustaka Eclipse Mosquitto MQTT.

Dalam tutorial ini, Anda mempelajari cara:

  • Buat aplikasi sampel klien perangkat bahasa C.
  • Jalankan sampel yang menggunakan pustaka MQTT untuk mengirim telemetri.
  • Jalankan contoh yang menggunakan perpustakaan MQTT untuk memproses pesan dari 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

Prasyarat mesin pengembangan

  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 PATH sistem untuk semua pengguna.

  3. Instal Mosquittoversi x64.

Persiapkan lingkungan Anda untuk Azure CLI

Siapkan 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 yang dihasilkan oleh perintah karena Anda akan membutuhkannya nanti. Token SAS terlihat seperti SharedAccessSignature sr=my-hub.azure-devices.net%2Fdevices%2Fmqtt-dev-01&sig=%2FnM...sNwtnnY%3D&se=1677855761

Petunjuk / Saran

Secara default, token SAS berlaku selama 60 menit. Opsi --du 7200 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.

Penting

Artikel ini menyertakan langkah-langkah untuk menyambungkan perangkat menggunakan tanda tangan akses berbagi, juga disebut autentikasi kunci simetris. Metode autentikasi ini mudah untuk pengujian dan evaluasi, tetapi mengautentikasi perangkat menggunakan sertifikat X.509 adalah pendekatan yang lebih aman. Untuk mempelajari selengkapnya, lihat Praktik terbaik keamanan untuk solusi > IoT Keamanan koneksi.

Salin repositori contoh

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 pustaka paho-mqtt.
  • Instruksi untuk menggunakan CLI mosquitto_pub 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"

Nota

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, file 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 monitor acara.

Meninjau 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 main mengatur nama pengguna dan kata sandi untuk diautentikasi 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 dari 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"

Hasil dari mosquitto_subscribe akan 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

Meninjau 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 wildcard multi-tingkat

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

Fungsi main menggunakan fungsi mosquitto_message_callback_set untuk mengatur panggilan balik untuk menangani pesan yang dikirim dari hub IoT Anda dan menggunakan fungsi mosquitto_subscribe 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 Cara menggunakan MQTT untuk menerima pesan dari cloud ke perangkat.

Memperbarui perangkat kembar

Sampel mosquitto_device_twin menunjukkan cara mengatur properti yang dilaporkan pada kembar perangkat dan kemudian membaca kembali properti tersebut.

Jalankan contoh 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.

Meninjau 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 main menggunakan fungsi mosquitto_connect_callback_set untuk mengatur panggilan balik untuk menangani pesan yang dikirim dari hub IoT Anda dan menggunakan fungsi mosquitto_subscribe untuk berlangganan topik $iothub/twin/res/#.

Cuplikan berikut menunjukkan fungsi connect_callback yang menggunakan mosquitto_publish untuk mengatur properti yang dilaporkan di kembar perangkat. Perangkat menerbitkan pesan ke $iothub/twin/PATCH/properties/reported/?$rid=%d topik tersebut. Nilai %d ditambahkan 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 topik $iothub/twin/res/# dan ketika menerima pesan dari hub IoT Anda, fungsi message_callback menanganinya. Saat Anda menjalankan sampel, fungsi message_callback akan dipanggil 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 berikut menunjukkan fungsi message_callback:

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 sampel Aplikasi MQTT di GitHub.