全部产品
Search
文档中心

IoT Platform:Menggunakan Paho MQTT untuk pustaka C tertanam untuk menghubungkan perangkat ke IoT Platform

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan proyek Paho MQTT sumber terbuka untuk pustaka C tertanam guna menghubungkan perangkat ke IoT Platform dan mengaktifkan pengiriman pesan.

Catatan Penggunaan

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

Prasyarat

Sebuah produk dan perangkat telah dibuat di instans pada Konsol IoT Platform. Sertifikat perangkat dan titik akhir MQTT telah diperoleh. Informasi sertifikat mencakup ProductKey, DeviceName, dan DeviceSecret. Untuk informasi lebih lanjut, lihat topik-topik berikut:

Siapkan lingkungan pengembangan

Contoh ini menggunakan Ubuntu 16.04-LTS untuk membangun lingkungan pengembangan. Jalankan perintah berikut untuk menyiapkan lingkungan:

sudo apt-get update
sudo apt-get install build-essential git sed cmake

Unduh pustaka Paho MQTT untuk C

Jalankan perintah berikut untuk mengkloning pustaka Paho MQTT untuk C:

git clone https://github.com/eclipse/paho.mqtt.embedded-c.git
Catatan

Dalam topik ini, cabang master digunakan untuk pengembangan kode sampel. ID commit adalah 29ab2aa29c5e47794284376d7f8386cfd54c3eed.

Proyek Paho MQTT untuk C tertanam mencakup sub-proyek berikut:

  • MQTTPacket: menyediakan serialisasi dan deserialisasi paket data MQTT serta beberapa fungsi pembantu.

  • MQTTClient: mengenkapsulasi program klien C++ tingkat tinggi yang dihasilkan oleh MQTTPacket.

  • MQTTClient-C: mengenkapsulasi program klien C tingkat tinggi yang dihasilkan oleh MQTTPacket.

    Proyek MQTTClient-C mencakup direktori dan file berikut:

    ├── CMakeLists.txt
    ├── samples
    │   ├── CMakeLists.txt
    │   ├── FreeRTOS
    │   └── linux
    ├── src
    │   ├── CMakeLists.txt
    │   ├── FreeRTOS
    │   ├── MQTTClient.c
    │   ├── MQTTClient.h
    │   ├── cc3200
    │   └── linux
    └── test
        ├── CMakeLists.txt
        └── test1.c
    • Direktori samples menyediakan kode sampel untuk sistem FreeRTOS dan Linux.

    • Direktori src menyediakan kode sampel untuk mengimplementasikan MQTTClient dan driver jaringan untuk porting ke FreeRTOS, CC3200, dan Linux.

    Untuk informasi lebih lanjut tentang API Paho MQTT, lihat MQTTClient.h.

Menghubungkan klien ke IoT Platform

  1. Klik aiot_mqtt_sign.c dan salin kode sumber yang disediakan oleh Alibaba Cloud untuk mendapatkan parameter koneksi MQTT. Lalu, buat file bernama aiot_mqtt_sign.c secara lokal dan tempelkan kode tersebut ke dalamnya.

    File aiot_mqtt_signal.c mendefinisikan fungsi aiotMqttSign().

    • Definisi:

      int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret,
                       char clientId[150], char username[65], char password[65]);
    • Deskripsi

      Anda dapat menggunakan fungsi ini untuk mendapatkan parameter koneksi MQTT berikut: username, password, dan clientid.

    • Parameter Input:

      Parameter

      Tipe

      Deskripsi

      productKey

      const char *

      ProductKey dari produk tempat perangkat tersebut termasuk. ProductKey ini digunakan untuk mengidentifikasi perangkat di Konsol IoT Platform.

      deviceName

      const char *

      DeviceName dari perangkat. DeviceName ini digunakan untuk mengidentifikasi perangkat di Konsol IoT Platform.

      deviceSecret

      const char *

      DeviceSecret dari perangkat. DeviceSecret ini digunakan untuk mengidentifikasi perangkat di Konsol IoT Platform.

    • Keluaran:

      Parameter

      Tipe

      Deskripsi

      username

      char *

      Nama pengguna yang digunakan untuk menetapkan koneksi MQTT.

      password

      char *

      Kata sandi yang digunakan untuk menetapkan koneksi MQTT.

      clientId

      char *

      ID klien MQTT.

    • Kode Respons

      Kode respons

      Deskripsi

      0

      Panggilan berhasil.

      -1

      Panggilan gagal.

  2. Tambahkan file program yang dapat menghubungkan perangkat ke IoT Platform.

    Anda harus menulis program untuk memanggil fungsi aiotMqttSign() di file aiot_mqtt_sign.c guna mendapatkan parameter yang diperlukan untuk menetapkan koneksi MQTT ke IoT Platform.

    Bagian ini memberikan instruksi pengembangan dan kode sampel.

    • Panggil fungsi aiotMqttSign() untuk menginisialisasi parameter clientId, username, dan password.

      #define EXAMPLE_PRODUCT_KEY            "a11xsrW****"
      #define EXAMPLE_DEVICE_NAME            "paho_****"
      #define EXAMPLE_DEVICE_SECRET       "Y877Bgo8X5owd3lcB5wWDjryNPoB****"
      
      extern int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret,
                              char clientId[150], char username[65], char password[65]);
      
      /* invoke aiotMqttSign to generate mqtt connect parameters */
      char clientId[150] = {0};
      char username[65] = {0};
      char password[65] = {0};
      
      if ((rc = aiotMqttSign(EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, EXAMPLE_DEVICE_SECRET, clientId, username, password) < 0)) {
          printf("aiotMqttSign -%0x4x\n", -rc);
          return -1;
      }
      printf("clientid: %s\n", clientId);
      printf("username: %s\n", username);
      printf("password: %s\n", password);
    • Menghubungkan klien ke IoT Platform.

      Lakukan operasi berikut:

      • Panggil fungsi NetworkInit() dan NetworkConnect() untuk menetapkan koneksi TCP.

      • Panggil fungsi MQTTClientInit() untuk menginisialisasi klien MQTT.

      • Konfigurasikan struktur MQTTPacket_connectData yang berisi parameter koneksi MQTT.

      Kode sampel:

      /* network init and establish network to aliyun IoT platform */
      NetworkInit(&n);
      rc = NetworkConnect(&n, host, port);
      printf("NetworkConnect %d\n", rc);
      
      /* init mqtt client */
      MQTTClientInit(&c, &n, 1000, buf, sizeof(buf), readbuf, sizeof(readbuf));
      
      /* set the default message handler */
      c.defaultMessageHandler = messageArrived;
      
      /* set mqtt connect parameter */
      MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
      data.willFlag = 0;
      data.MQTTVersion = 3;
      data.clientID.cstring = clientId;
      data.username.cstring = username;
      data.password.cstring = password;
      data.keepAliveInterval = 60;
      data.cleansession = 1;
      printf("Connecting to %s %d\n", host, port);
      
      rc = MQTTConnect(&c, &data);
      printf("MQTTConnect %d, Connect aliyun IoT Cloud Success!\n", rc);
    • Publikasikan pesan.

      Panggil fungsi MQTTPublish() untuk menerbitkan pesan dalam format kustom ke topik kustom yang ditentukan.

      Untuk informasi lebih lanjut tentang topik, lihat Topik.

      char *pubTopic = "/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/user/update";
      int cnt = 0;
      unsigned int msgid = 0;
      while (!toStop)
      {
          MQTTYield(&c, 1000);    
      
          if (++cnt % 5 == 0) {
              MQTTMessage msg = {
                  QOS1,
                  0,
                  0,
                  0,
                  "Hello world",
                  strlen("Hello world"),
              };
              msg.id = ++msgid;
              rc = MQTTPublish(&c, pubTopic, &msg);
              printf("MQTTPublish %d, msgid %d\n", rc, msgid);
          }
      }
    • Berlangganan ke topik untuk menerima pesan dari IoT Platform.

      void messageArrived(MessageData* md)
      {
          MQTTMessage* message = md->message;
      
          printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
          printf("%.*s\n", (int)message->payloadlen, (char*)message->payload);
      }
      
      char *subTopic = "/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/user/get";
      
      printf("Subscribing to %s\n", subTopic);
      rc = MQTTSubscribe(&c, subTopic, 1, messageArrived);
      printf("MQTTSubscribe %d\n", rc);

    Untuk informasi tentang metode komunikasi antara perangkat, server, dan IoT Platform, lihat Ikhtisar Komunikasi antara Perangkat, IoT Platform, dan Server.

  3. Salin file aiot_mqtt_signal.c dan file yang dimodifikasi pada Langkah 2 ke ../paho.mqtt.embedded-c/MQTTClient-C/samples/linux. Kemudian, kompilasi proyek.

Kode sampel

Anda dapat menjalankan kode sampel untuk terhubung ke IoT Platform.

  1. Unduh paket demo dan ekstrak.

    File berikut diperoleh:

    File sertifikat

    Deskripsi

    aiot_mqtt_sign.c

    File ini berisi kode yang digunakan untuk mendapatkan parameter koneksi MQTT. Saat Anda menjalankan file aiot_c_demo.c, fungsi aiotMqttSign() dipanggil untuk mendapatkan nilai parameter username, password, dan clientId.

    aiot_c_demo.c

    File ini berisi kode logika yang digunakan untuk terhubung dan berkomunikasi dengan IoT Platform.

  2. Di file aiot_c_demo.c, ganti informasi perangkat dengan informasi perangkat Anda.

    • Ganti nilai parameter EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, dan EXAMPLE_DEVICE_SECRET dengan informasi sertifikat perangkat Anda.

      #define EXAMPLE_PRODUCT_KEY            "The ProductKey of the product" 
      #define EXAMPLE_DEVICE_NAME            "The DeviceName of the device" 
      #define EXAMPLE_DEVICE_SECRET          "The DeviceSecret of the device"
    • Ubah titik akhir di char *host = EXAMPLE_PRODUCT_KEY".iot-as-mqtt.cn-shanghai.aliyuncs.com".

      Untuk informasi lebih lanjut tentang titik akhir instans publik dan instans Edisi Perusahaan serta format titik akhir, lihat Lihat Titik Akhir Suatu Instans.

  3. Pindahkan file aiot_mqtt_signal.c dan aiot_c_demo.c ke direktori ../paho.mqtt.embedded-c/MQTTClient-C/samples/linux proyek Paho.

  4. Kompilasi proyek dan jalankan program.

    Anda dapat mengkompilasi proyek menggunakan salah satu metode berikut:

    • Gunakan alat CMake.

      1. Tambahkan aiot_c_demo.c dan aiot_mqtt_signal.c ke file CMakeLists.txt di direktori /paho.mqtt.embedded-c/MQTTClient-C/samples/linux.

        Kode berikut menunjukkan cara memodifikasi file CMakeLists.txt.

        add_executable(
          stdoutsubc
          stdoutsub.c
        )
        
        add_executable(
          aiot_c_demo
          aiot_c_demo.c
          aiot_mqtt_sign.c
        )
        
        target_link_libraries(stdoutsubc paho-embed-mqtt3cc paho-embed-mqtt3c)
        target_include_directories(stdoutsubc PRIVATE "../../src" "../../src/linux")
        target_compile_definitions(stdoutsubc PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)
        
        target_link_libraries(aiot_c_demo paho-embed-mqtt3cc paho-embed-mqtt3c)
        target_include_directories(aiot_c_demo PRIVATE "../../src" "../../src/linux")
        target_compile_definitions(aiot_c_demo PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)
      2. Kembali ke direktori /paho.mqtt.embedded-c dan jalankan perintah berikut untuk mengkompilasi proyek.

        mkdir build.paho
        cd build.paho
        cmake ..
        make
      3. Pergi ke direktori /paho.mqtt.embedded-c/build.paho dan jalankan perintah berikut untuk menjalankan program:

        ./MQTTClient-C/samples/linux/aiot_c_demo
    • Gunakan file build.sh.

      1. Buka file build.sh di direktori /paho.mqtt.embedded-c/MQTTClient-C/samples/linux.

      2. Di file build.sh, ganti stdoutsub.c dengan aiot_mqtt_sign.c aiot_c_demo.c, dan -o stdoutsub dengan -o aiot_c_demo. Lalu, simpan file build.sh.

      3. Pergi ke direktori /paho.mqtt.embedded-c/MQTTClient-C/samples/linux dan jalankan perintah ./build.sh.

        Setelah kompilasi, file aiot_c_demo yang dapat dieksekusi dihasilkan.

      4. Jalankan perintah ./aiot_c_demo untuk menjalankan file.

    Setelah Anda menjalankan file, log lokal berikut dihasilkan:

    clientid: paho_mqtt&a11xsrW****|timestamp=2524608000000,_v=sdk-c-1.0.0,securemode=3,signmethod=hmacsha256,lan=C|
    username: paho_mqtt&a11xsrW****  
    password: 36E955DC3D9D012EF62C80657A29328B1CFAE6186C611A17DC7939FAB637****  
    NetworkConnect 0  
    Connecting to a11xsrW****.iot-as-mqtt.cn-shanghai.aliyuncs.com 443  
    MQTTConnect 0, Connect aliyun IoT Cloud Success!  
    Subscribing to /a11xsrW****/paho_mqtt/user/get  
    MQTTSubscribe 0  
    MQTTPublish 0, msgid 1  
    MQTTPublish 0, msgid 2  
    MQTTPublish 0, msgid 3  
    MQTTPublish 0, msgid 4  
    MQTTPublish 0, msgid 5  
    ...

    Di Konsol IoT Platform, Anda dapat melihat status perangkat dan log.

    • Pilih Devices > Devices. Halaman Perangkat menunjukkan bahwa perangkat berada dalam keadaan Online.

    • Pilih Maintenance > Device Log. Lalu, klik tab Cloud run log atau Device local log untuk melihat log. Untuk informasi lebih lanjut, lihat Log IoT Platform dan Log Lokal Perangkat.

Kode kesalahan

Jika perangkat gagal menetapkan koneksi MQTT ke IoT Platform, Anda dapat mendiagnosis masalah berdasarkan kode kesalahan. Untuk informasi lebih lanjut, lihat Pemecahan Masalah.