packetId QoS MQTT

QoS (Quality of Service) ในการส่งข้อมูลผ่าน MQTT มี packetId เฉพาะใน QoS 1 และ 2

MQTT มี QoS 3 ระดับ:

  1. QoS 0 (At most once):
mqttClient.publish("test/lol", 0, true, "test 1");
  • ไม่มี packetId เพราะไม่มีการยืนยันการส่ง
  • ส่งข้อมูลแค่ครั้งเดียวโดยไม่สนใจว่าถึงหรือไม่
  • เร็วที่สุดแต่ไม่รับประกันการส่ง
  • เหมาะกับข้อมูลที่ไม่สำคัญมาก เช่น ค่าเซนเซอร์ที่ส่งบ่อยๆ
  1. QoS 1 (At least once):
uint16_t packetIdPub1 = mqttClient.publish("test/lol", 1, true, "test 2");
  • มี packetId เพื่อติดตามการส่ง
  • รับประกันว่าข้อมูลจะถึงอย่างน้อย 1 ครั้ง
  • อาจมีการส่งซ้ำได้
  • ใช้ PUBACK เพื่อยืนยันการรับ
  1. 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 เพื่อ:
    • ติดตามสถานะการส่ง
    • ยืนยันการรับข้อมูล
    • จัดการการส่งซ้ำ
    • ตรวจสอบลำดับการส่ง

คำแนะนำการเลือกใช้:

  1. QoS 0: ข้อมูลที่ส่งบ่อยๆ ไม่สำคัญมาก
  2. QoS 1: ข้อมูลที่ต้องการความแน่ใจว่าถึง
  3. QoS 2: ข้อมูลสำคัญที่ห้ามซ้ำเด็ดขาด

Leave a Comment