Message Queuing Telemetry Transport (MQTT) adalah protokol perpesanan asinkron yang dibangun di atas stack protokol TCP/IP. Sebagai protokol publish-subscribe yang ringan, MQTT dirancang untuk lingkungan jaringan yang tidak andal dan cocok untuk skenario di mana perangkat memiliki keterbatasan pada penyimpanan perangkat keras atau lebar pita jaringan. Protokol ini memisahkan pengirim dan penerima pesan dalam dimensi waktu dan ruang. Platform IoT mendukung koneksi perangkat melalui MQTT.
Versi yang didukung
Platform IoT mendukung koneksi MQTT standar yang kompatibel dengan versi 5.0, 3.1.1, dan 3.1. Spesifikasi resmi: MQTT 5.0, MQTT 3.1.1, MQTT 3.1.
Penting
Untuk menggunakan protokol MQTT 5.0, Anda harus terlebih dahulu membeli Instans Perusahaan.
Perbedaan dari MQTT standar
-
Mendukung pesan MQTT seperti PUB, SUB, PING, PONG, CONNECT, DISCONNECT, dan UNSUB.
-
Mendukung clean session.
-
Tidak mendukung will message atau retained message.
-
Mendukung level Quality of Service (QoS) 0 dan 1. Tidak mendukung QoS 2.
-
Tidak mendukung subscription QoS. QoS pesan ditentukan oleh pengirim (PUB).
-
Mendukung revert-RPC (RRPC) berdasarkan topik MQTT native, memungkinkan pemanggilan sinkron dari server ke perangkat.
Fitur MQTT 5.0 yang didukung
MQTT 5.0 memperkenalkan fitur-fitur yang meningkatkan kinerja dan kemudahan penggunaan. Lihat Lampiran C. Ringkasan fitur baru dalam MQTT v5.0 dan Ikhtisar MQTT 5.0.
Platform IoT mendukung fitur MQTT 5.0 berikut ini.
|
Fitur yang didukung
|
Cara penggunaan
|
|
Session expiry
|
-
Atur Clean Start dan Session Expiry Interval saat koneksi: MqttConnectionOptions options = new MqttConnectionOptions();
options.setCleanStart(true);
options.setSessionExpiryInterval(60L);// Satuan: detik.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
-
Atur Session Expiry Interval saat disconnect: MqttProperties mqttProperties = new MqttProperties();
mqttProperties.setSessionExpiryInterval(60L);// Satuan: detik.
MqttAsyncClient mqttAsyncClient = new MqttAsyncClient(host, clientId, new MemoryPersistence());
mqttAsyncClient.disconnect(30000, null, null, MqttReturnCode.RETURN_CODE_SUCCESS, mqttProperties);
|
|
Message expiry
|
Atur Message Expiry Interval saat memublikasikan: IntervalString content = "Hello World";
byte[] payload = content.getBytes();
// Buat pesan.
MqttMessage message = new MqttMessage(payload);
// Atur QoS untuk pesan.
message.setQos(1);
MqttProperties mqttProperties = new MqttProperties();
// Atur waktu hidup (TTL) pesan.
mqttProperties.setMessageExpiryInterval(600L);
message.setProperties(mqttProperties);
// Publikasikan pesan.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);
|
|
Subscription options
|
Opsi langganan yang tersedia:
-
QoS: Level QoS pesan MQTT. Anda dapat mengaturnya ke 0 (pesan QoS 0) atau 1 (pesan QoS 1).
-
No Local: Menentukan apakah klien menerima pesan yang dipublikasikannya sendiri.
Pada MQTT 3.1.1, klien menerima pesan yang dipublikasikannya sendiri pada topik yang dilanggani. Pada MQTT 5.0, atur opsi ini ke true untuk mencegah pengiriman ke diri sendiri.
Nilai:
-
true: Tidak menerima.
-
false: Menerima.
-
Retain As Publish: Menentukan apakah server mempertahankan flag RETAIN saat meneruskan pesan ke klien.
Nilai:
-
true: Jika pesan memiliki flag RETAIN, flag tersebut dipertahankan. Jika pesan tidak memiliki flag RETAIN, opsi ini tidak berpengaruh.
-
false: Flag RETAIN tidak dipertahankan, terlepas dari apakah pesan asli memiliki flag tersebut atau tidak.
Penting
Pengaturan Retain As Publish tidak memengaruhi flag RETAIN pada retained message.
-
Retain Handling: Menentukan apakah server mengirim retained message ke klien saat langganan dibuat.
Nilai:
-
0: Server mengirim retained message selama langganan klien berhasil.
-
1: Server mengirim retained message hanya jika langganan klien berhasil dan langganan tersebut sebelumnya belum ada.
-
2: Server tidak mengirim retained message meskipun langganan klien berhasil.
MqttSubscription mqttSubscription = new MqttSubscription("aaa/bbb");
// Atur opsi langganan QoS.
mqttSubscription.setQos(1);
// Atur opsi langganan No Local.
mqttSubscription.setNoLocal(true);
// Atur opsi langganan Retain As Published.
mqttSubscription.setRetainAsPublished(true);
// Atur opsi langganan Retain Handling.
mqttSubscription.setRetainHandling(1);
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.subscribe(new MqttSubscription[]{mqttSubscription});
|
|
Retained message
|
// Buat retained message.
String content = "Hello World";
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);
// Tandai pesan sebagai retained message.
message.setRetained(true);
// Publikasikan pesan.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);
|
|
Will message
|
// Buat will message.
String content = "Will Message";
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);
MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(USERNAME);
options.setPassword(PASSWORD.getBytes());
// Atur will message.
options.setWill(topic, message);
// Atur penundaan will.
MqttProperties willMessageProperties = new MqttProperties();
willMessageProperties.setWillDelayInterval(60L);
options.setWillMessageProperties(willMessageProperties);
// Lakukan koneksi.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
|
|
Connection negotiation
|
MqttConnectionOptions connOpts = new MqttConnectionOptions();
connOpts.setMaximumPacketSize(1024L);
|
|
User property
|
MqttProperties properties = new MqttProperties();
List<UserProperty> userPropertys = new ArrayList<>();
userPropertys.add(new UserProperty("key1","value1"));
properties.setUserProperties(userPropertys);
Setelah perangkat terhubung melalui MQTT 5.0, data UserProperty yang dilaporkan akan terlihat di log Platform IoT.
Penting
Maksimal 20 properti. Kunci tidak boleh diawali garis bawah (_). Panjang gabungan kunci-nilai tidak boleh melebihi 128 karakter.
|
|
Request-response pattern
|
Jika peminta adalah perangkat dan penerima adalah server bisnis Anda, uraikan ResponseTopic dan CorrelationData dari properti pesan setelah langganan AMQP atau penerusan aturan. Kemudian panggil operasi API Pub untuk merespons perangkat. MqttProperties properties = new MqttProperties();
properties.setCorrelationData("requestId12345".getBytes());
properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get");
|
|
Enhanced error codes
|
Pemecahan masalah error.
|
|
Topic alias
|
Tidak berlaku.
|
|
Shared subscriptions
|
Format topik shared subscription: $share/${ShareName}/${filter}.
-
$share: Bidang statis. Topik untuk shared subscription harus diawali dengan $share.
-
${ShareName}: String yang hanya berisi huruf, angka, dan garis bawah (_).
Sesi dengan ${ShareName} yang sama berbagi satu langganan. Setiap pesan yang sesuai dikirimkan hanya ke satu sesi.
-
${filter}: Filter topik dalam langganan non-shared. Mendukung huruf, angka, dan garis bawah (_).
Contoh: MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(username);
options.setPassword(password);
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
mqttClient.subscribe("$share/testGroup/user/post", 1);
|
Spesifikasi topik
Untuk definisi dan klasifikasi topik, lihat Apa itu topik?.
Anda dapat melihat topik komunikasi default pada halaman produk perangkat di Konsol. Topik khusus fitur dijelaskan dalam dokumentasi masing-masing fitur.
Batasan
Setiap identitas perangkat yang terdaftar hanya mendukung satu protokol komunikasi dalam satu waktu.