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 cmakeUnduh 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.gitDalam 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.cDirektori 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
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.
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.
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.
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.
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.
Pindahkan file aiot_mqtt_signal.c dan aiot_c_demo.c ke direktori ../paho.mqtt.embedded-c/MQTTClient-C/samples/linux proyek Paho.
Kompilasi proyek dan jalankan program.
Anda dapat mengkompilasi proyek menggunakan salah satu metode berikut:
Gunakan alat CMake.
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)Kembali ke direktori /paho.mqtt.embedded-c dan jalankan perintah berikut untuk mengkompilasi proyek.
mkdir build.paho cd build.paho cmake .. makePergi 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.
Buka file build.sh di direktori /paho.mqtt.embedded-c/MQTTClient-C/samples/linux.
Di file build.sh, ganti
stdoutsub.cdenganaiot_mqtt_sign.c aiot_c_demo.c, dan-o stdoutsubdengan-o aiot_c_demo. Lalu, simpan file build.sh.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.
Jalankan perintah
./aiot_c_demountuk 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 . Halaman Perangkat menunjukkan bahwa perangkat berada dalam keadaan Online.
Pilih . 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.