QoS (Quality of Service) ในการส่งข้อมูลผ่าน MQTT มี packetId เฉพาะใน QoS 1 และ 2
MQTT มี QoS 3 ระดับ:
- QoS 0 (At most once):
mqttClient.publish("test/lol", 0, true, "test 1");
- ไม่มี packetId เพราะไม่มีการยืนยันการส่ง
- ส่งข้อมูลแค่ครั้งเดียวโดยไม่สนใจว่าถึงหรือไม่
- เร็วที่สุดแต่ไม่รับประกันการส่ง
- เหมาะกับข้อมูลที่ไม่สำคัญมาก เช่น ค่าเซนเซอร์ที่ส่งบ่อยๆ
- QoS 1 (At least once):
uint16_t packetIdPub1 = mqttClient.publish("test/lol", 1, true, "test 2");
- มี packetId เพื่อติดตามการส่ง
- รับประกันว่าข้อมูลจะถึงอย่างน้อย 1 ครั้ง
- อาจมีการส่งซ้ำได้
- ใช้ PUBACK เพื่อยืนยันการรับ
- QoS 2 (Exactly once):
uint16_t packetIdPub2 = mqttClient.publish("test/lol", 2, true, "test 3");
- มี packetId เพื่อติดตามการส่ง
- รับประกันว่าข้อมูลจะถึงแค่ครั้งเดียวเท่านั้น
- ใช้กลไก 4-way handshake
- ช้าที่สุดแต่ปลอดภัยที่สุด
การทำงานของแต่ละ QoS:
QoS 0:
Client --> Broker (ส่งครั้งเดียว, ไม่มีการยืนยัน)
QoS 1:
Client --> Broker (PUBLISH)
Client <-- Broker (PUBACK with packetId)
QoS 2:
Client --> Broker (PUBLISH)
Client <-- Broker (PUBREC with packetId)
Client --> Broker (PUBREL with packetId)
Client <-- Broker (PUBCOMP with packetId)
ตัวอย่างการใช้งานที่เหมาะสม :
// QoS 0 - ข้อมูลเซนเซอร์ทั่วไป
mqttClient.publish("sensors/temperature", 0, false, "25.5");
// QoS 1 - ข้อมูลที่สำคัญ แต่ยอมรับการส่งซ้ำได้
uint16_t packetId = mqttClient.publish("device/status", 1, true, "online");
// QoS 2 - ข้อมูลสำคัญมาก ต้องไม่ซ้ำ
uint16_t packetId = mqttClient.publish("transactions/payment", 2, true, "SUCCESS");
การติดตามสถานะการส่ง :
void onMqttPublish(uint16_t packetId) {
Serial.println("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
สรุป:
- QoS 0 ไม่มี packetId เพราะไม่ต้องติดตามการส่ง
- QoS 1 และ 2 มี packetId เพื่อ:
- ติดตามสถานะการส่ง
- ยืนยันการรับข้อมูล
- จัดการการส่งซ้ำ
- ตรวจสอบลำดับการส่ง
คำแนะนำการเลือกใช้:
- QoS 0: ข้อมูลที่ส่งบ่อยๆ ไม่สำคัญมาก
- QoS 1: ข้อมูลที่ต้องการความแน่ใจว่าถึง
- QoS 2: ข้อมูลสำคัญที่ห้ามซ้ำเด็ดขาด