全部产品
Search
文档中心

IoT Platform:Menghubungkan perangkat gateway MQTT ke IoT Platform menggunakan MQTT.fx (verifikasi perangkat menggunakan Alibaba Cloud Function Compute)

更新时间:Jul 02, 2025

Saat menghubungkan perangkat ke IoT Platform menggunakan gateway Message Queuing Telemetry Transport (MQTT), Anda dapat memanfaatkan sertifikat kustom untuk memverifikasi identitas perangkat. Selanjutnya, Anda dapat mendaftarkan perangkat menggunakan nama umum (CN) dari sertifikat. Topik ini menjelaskan cara menghubungkan perangkat ke IoT Platform melalui gateway MQTT, dengan contoh penggunaan Alibaba Cloud Function Compute untuk verifikasi identitas perangkat.

Catatan penggunaan

Dalam topik ini, izin pengguna biasa digunakan untuk semua operasi. Jika diperlukan izin administrator untuk operasi tertentu, jalankan perintah sudo.

Prasyarat

Sebuah instance Exclusive Enterprise Edition telah dibeli. Dalam contoh ini, instance tersebut dibeli di wilayah China (Shanghai). Untuk informasi lebih lanjut, lihat Membeli Instance Enterprise Edition.

Informasi latar belakang

Gateway MQTT dari IoT Platform mendukung verifikasi pihak ketiga melalui Function Compute, sertifikat kustom, OCSP, dan topik kustom untuk memverifikasi serta menghubungkan perangkat ke IoT Platform, sehingga memungkinkan komunikasi yang efisien. Hal ini membantu Anda mengimplementasikan berbagai skenario bisnis IoT.

Untuk detail lebih lanjut tentang verifikasi dan komunikasi antara gateway MQTT dan perangkat, lihat Gateway MQTT.

Buat persiapan

Contoh ini menggunakan Ubuntu 22.04 sebagai lingkungan pengembangan.

Langkah 1: Hasilkan sertifikat kustom

  1. Masuk ke Ubuntu.

  2. Jalankan perintah berikut untuk menghasilkan file sertifikat root bernama root-ca.crt untuk perangkat dan server:

    openssl req \
        -new \
        -newkey rsa:2048 \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=CN/O=Aliyun IOT/CN=IoT CA" \
        -keyout root-ca.key \
        -out root-ca.crt
  3. Buat sertifikat sisi server kustom berdasarkan file sertifikat root root-ca.crt.

    1. Jalankan perintah berikut untuk menghasilkan file kunci sisi server bernama server.key:

      openssl genrsa -out server.key 2048
    2. Jalankan perintah touch openssl.cnf untuk membuat file bernama openssl.cnf.

    3. Jalankan perintah vi openssl.cnf untuk membuka file openssl.cnf, salin kode berikut ke dalam file, tekan tombol Esc, masukkan :wq, lalu tekan tombol Enter untuk menyimpan file.

      [policy_match]
      countryName             = cn
      stateOrProvinceName     = optional
      organizationName        = optional
      organizationalUnitName  = optional
      commonName              = supplied
      emailAddress            = optional
      
      [req]
      default_bits       = 2048
      distinguished_name = req_distinguished_name
      req_extensions     = req_ext
      x509_extensions    = v3_req
      prompt             = no
      
      [req_distinguished_name]
      commonName          = Server
      
      [req_ext]
      subjectAltName = @alt_names
      
      [v3_req]
      subjectAltName = @alt_names
      
      [alt_names]
      DNS.1 = *.mqtt.iothub.aliyuncs.com
      DNS.2 = *.igw.iothub.aliyuncs.com
    4. Jalankan perintah berikut untuk menghasilkan file permintaan sisi server bernama server.csr:

      openssl req -new -key server.key -config openssl.cnf -out server.csr
    5. Jalankan perintah berikut untuk menghasilkan file sertifikat sisi server bernama server.crt:

      openssl x509 -req -days 365 -sha256 -in server.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile openssl.cnf
    6. Jalankan perintah berikut untuk memverifikasi sertifikat sisi server:

      openssl verify -CAfile root-ca.crt server.crt
  4. Buat sertifikat sisi perangkat berdasarkan file sertifikat root root-ca.crt.

    1. Jalankan perintah berikut untuk menghasilkan file kunci sisi perangkat bernama client.key:

      openssl genrsa -out client.key 2048
    2. Jalankan perintah berikut untuk menghasilkan file permintaan sisi perangkat bernama client.csr dan atur parameter CN menjadi Client_123:

      openssl req -new -key client.key -out client.csr -subj "/CN=Client_123"
    3. Jalankan perintah berikut untuk menghasilkan file sertifikat sisi perangkat bernama client.crt:

      openssl x509 -req -days 365 -sha256 -in client.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out client.crt
    4. Jalankan perintah berikut untuk memverifikasi sertifikat sisi perangkat:

      openssl verify -CAfile root-ca.crt client.crt

Gambar berikut menunjukkan file sertifikat kustom yang dihasilkan.

image

Langkah 2: Buat fungsi Function Compute untuk memverifikasi perangkat

  1. Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Services & Functions.

  2. Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik Create Service.

  3. Di panel Create Service, masukkan service name. Contoh: IoT_Service. Lalu, klik OK.

  4. Pada halaman Functions, klik Create Function.

  5. Pada halaman Create Function, konfigurasikan parameter dan klik Create, seperti yang ditunjukkan pada gambar berikut.

    image

  6. Pada halaman Function Details, ganti kode sampel yang ada dengan kode berikut dan klik Deploy.

    Fungsi verifikasi mengembalikan CN dari sertifikat sisi perangkat sebagai nilai parameter deviceName.

    # -*- coding: utf-8 -*-
    import logging
    import json
    import time
    import enum
    import random
    import string
    
    class Request:
        def __init__(self, json_str):
            self.clientId = None
            self.username = None
            self.password = None
            self.certificateCommonName = None
    
            for key, value in json.loads(json_str).items():
                setattr(self, key, value)
    
    class Response:
        def __init__(self):
            self.deviceName = None
            self.result = 'true'
            self.message = 'success'
    
        def handler(self, request):
            # Mengembalikan CN dari sertifikat sisi perangkat sebagai nilai parameter deviceName.
            self.deviceName = request.certificateCommonName
            
            return json.dumps(self.__dict__)
    
    def handler(event, context):
        request = Request(event)
        return Response().handler(request)

Langkah 3: Buat gateway

  1. Masuk ke Konsol IoT Platform. Di bilah navigasi atas, pilih China (Shanghai).

  2. Pada halaman Overview, klik kartu instance Exclusive Enterprise Edition.

  3. Di panel navigasi sebelah kiri, pilih Devices > Gateway. Pada halaman Gateway, klik Add Gateway.

  4. Di kotak dialog Tambah Gateway, konfigurasikan parameter berikut dan klik OK.

    Atur parameter Server Certificate ke konten file server.crt, parameter Private Key of Server Certificate ke konten file server.key, dan parameter Device Root Certificate ke konten file root-ca.crt. Untuk informasi lebih lanjut tentang parameter, lihat Buat Gateway.

    image

  5. Pada halaman Gateway, salin URL di kolom Gateway URL dari gateway.

    image

Langkah 4: Kembangkan program sisi perangkat

  1. Pergi ke Ubuntu.

  2. Jalankan perintah berikut untuk menginstal dependensi:

    sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui
    sudo apt-get install libssl-dev
  3. Jalankan perintah berikut untuk menginstal library Paho MQTT open source:

    git clone https://github.com/eclipse/paho.mqtt.c.git
    mkdir build && cd build
    cmake ../paho.mqtt.c -DPAHO_WITH_SSL=TRUE -DCMAKE_INSTALL_PREFIX="/usr/lib"
    make -j
    sudo make install && cd ..
  4. Jalankan perintah touch aiot_mqtt_demo.c untuk membuat file simulator perangkat bernama aiot_mqtt_demo.c.

  5. Jalankan perintah vi aiot_mqtt_demo.c untuk membuka file. Salin kode berikut ke dalam file:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "MQTTClient.h"
    
    int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
    {
        printf("message recv < topic [%s], payload [%s]\n", topicName, (char *)message->payload);
        MQTTClient_freeMessage(&message);
        MQTTClient_free(topicName);
        return 1;
    }
    
    int main(int argc, char* argv[])
    {
        MQTTClient client;
        MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
        MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
        int rc;
    
        /* Buat klien MQTT. Ganti informasi dengan informasi aktual. */
        const char *host = "ssl://iot-0****.igw.iothub.aliyuncs.com:1883";
        const char *client_id = "12345";
        MQTTClient_create(&client, host, client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL);
    
        MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL);
        /* Konfigurasikan parameter koneksi, seperti sertifikat, nama pengguna, dan kata sandi. Ganti informasi dengan informasi aktual. */
        ssl_opts.trustStore = "root-ca.crt";
        ssl_opts.privateKey = "client.key";
        ssl_opts.keyStore = "client.crt";
    
        conn_opts.ssl = &ssl_opts;
        conn_opts.username = "sdk_test01";
        conn_opts.password = "hello123";
    
        /* Koneksi MQTT terbentuk. */
        if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
            printf("Gagal terhubung, kode balik %d\n", rc);
            exit(EXIT_FAILURE);
        }
        printf("koneksi berhasil username %s, password %s\n", conn_opts.username, conn_opts.password);
    
        /* Berlangganan pesan. */
        MQTTClient_subscribe(client, "/user/aiot_mqtt_demo_downraw", 1);
    
        /* Hasilkan pesan dan kirim pesan secara berkala. */
        MQTTClient_message pubmsg = MQTTClient_message_initializer;
        const char *topic = "/user/aiot_mqtt_demo_upraw";
        pubmsg.payload = "Hello Service!";
        pubmsg.payloadlen = (int)strlen(pubmsg.payload);
        pubmsg.qos = 1;
        for(int i = 0; i < 100; i++) {
            MQTTClient_publishMessage(client, topic, &pubmsg, NULL);
            printf("pesan terkirim > topik [%s], payload [%s]\n", topic, (char *)pubmsg.payload);
            sleep(10);
        }
    
        /* Tutup koneksi dan hapus klien MQTT. */
        MQTTClient_disconnect(client, 10000);
        MQTTClient_destroy(&client);
        return rc;
    }
  6. Ganti informasi dalam kode sebelumnya dengan informasi aktual, tekan tombol Esc, masukkan :wq, lalu tekan tombol Enter untuk menyimpan file aiot_mqtt_demo.c.

    Parameter

    Deskripsi

    host

    Titik akhir gateway MQTT yang ingin Anda hubungkan perangkatnya. Format: ssl://${Endpoint Gateway}:${Nomor Port}.

    Gunakan titik akhir dan port yang diperoleh dari Langkah 3.

    client_id

    Opsional. ID klien. ID klien harus memiliki panjang 1 hingga 64 karakter. Kami merekomendasikan Anda menggunakan alamat MAC atau nomor seri (SN) perangkat sebagai ID klien.

    ssl_opts.trustStore

    Lokasi penyimpanan file sertifikat root sisi perangkat root-ca.crt.

    ssl_opts.privateKey

    Lokasi penyimpanan file sisi perangkat client.key.

    ssl_opts.keyStore

    Lokasi penyimpanan file sertifikat sisi perangkat client.crt.

    conn_opts.username

    Nama pengguna yang digunakan untuk membangun koneksi MQTT.

    Nama pengguna harus memiliki panjang 4 hingga 32 karakter, dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), at (@), titik (.), dan titik dua (:). Nama pengguna harus unik dalam produk.

    conn_opts.password

    Kata sandi yang digunakan untuk membangun koneksi MQTT.

    Kata sandi harus memiliki panjang 1 hingga 32 karakter, dan dapat berisi huruf, angka, tanda hubung (-), garis bawah (_), at (@), titik (.), dan titik dua (:).

Gambar berikut menunjukkan library, file sertifikat, dan file kode yang dihasilkan dan digunakan dalam contoh ini.image

Langkah 5: Kompilasi dan jalankan program

  1. Jalankan perintah berikut untuk menjalankan file kode aiot_mqtt_demo.c:

    gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs
    ./aiot_mqtt_demo

    Setelah menjalankan file kode, nilai Client_123 dari parameter deviceName yang dikembalikan oleh fungsi Function Compute digunakan sebagai DeviceName dari perangkat IoT Platform. Pergi ke halaman Detail Instance dari instance yang ingin Anda kelola di Konsol IoT Platform. Di panel navigasi sebelah kiri, pilih Devices > Devices, perangkat bernama Client_123 secara otomatis dibuat dan perangkat tersebut dalam keadaan Online, seperti yang ditunjukkan pada gambar berikut.image

  2. Opsional. Pergi ke halaman Detail Instance dari instance yang ingin Anda kelola di Konsol IoT Platform. Di panel navigasi sebelah kiri, pilih Maintenance > Device Log. Pada halaman Log Perangkat, lihat data yang dikirimkan oleh perangkat.image