ข้อควรระวังการใช้งาน MQTT NETPIE การใช้งาน Subscribe

NEXPIE Co., Ltd.
NEXPIE Co., Ltd.
Published in
2 min readApr 23, 2021

--

บทความนี้ อธิบายถึงข้อควรระวังการทำงานการ Subscribe Topicไปที่ NETPIE Platform(NETPIE2020)โดยเกิดจากการกระทำต่างๆ

การ Subscribe Topic ไม่สำเร็จหรือผิดพลาด หลังจากเชื่อมต่อแพลตฟอร์มสำเร็จ หากเกิดการทำงานข้างต้นเกิน 4 ครั้ง ภายในระยะเวลา 5 วินาที จะถูกบล็อก ไม่สามารถเชื่อมต่อได้ระยะเวลาหนึ่ง และหากกระทำข้างต้นถี่และเป็นระยะเวลานาน จะถูกบล็อกไม่สามารถเชื่อมต่อได้เป็นเวลานานขึ้น

สาเหตุที่อาจทำให้เกิดการ Subscribe Topic ไม่สำเร็จ มีดังนี้ :

  1. ผู้ใช้งาน Publish และ Subscribe Topic เกิน 10 ครั้งในช่วงเวลา 1 วินาที ซึ่งเกินโควต้าการทำงานของอุปกรณ์ แพลตฟอร์มจะตัดการเชื่อมต่อ ทำให้การเชื่อมต่อของอุปกรณ์หลุดจากการเชื่อมต่อ และไม่ได้รับข้อมูล

ตัวอย่างเช่น ผู้ใช้งานกำหนดการ Subscribe Topic :

home/bedroom/temperature, 
home/bedroom/humidity,
home/bedroom/light,
home/livingroom/temperature,
home/livingroom/humidity,
home/livingroom/light,
home/kitchen/temperature,
home/kitchen/humidity,
home/kitchen/light

จากการที่ผู้ใช้ Subscribe Topic ข้างต้นในช่วงเวลา 1 วินาที ทาง Platform จะมองการรับส่งข้อมูลที่รวดเร็วเกินไป ถ้าปล่อยให้เกิดเหตุการณ์นี้ขึ้นเป็นเวลานานอาจส่งผลกระทบต่อการใช้งานอื่นๆ ทำให้ Platform จึงจำเป็นต้องตัดการเชื่อมต่อของ อุปกรณ์ ซึ่งผู้ใช้สามารถรับข้อมูลหลาย Topic โดยการใช้งาน Wildcard

การ Subscribe Topic แบบ Wildcard

Wildcard เป็นสัญลักษณ์เพื่อแทนการ Subscribe หลาย Topic พร้อมกันในเวลาเดียวกัน

Wildcard แบ่งเป็น 2 รูปแบบ คือ Single-level และ Multi-level

Single-level สัญลักษณ์ + แทนที่หนึ่งระดับหัวข้อ หัวข้อใดๆ ที่ตรงกับสัญลักษณ์ + จะได้รับ message จากตัวอย่างผู้ใช้ Subscribe ข้างต้น ตัวอย่างเช่น หากผู้ใช้ต้องการรับข้อมูล Temperature ภายในบ้านทั้งหมดสามารถใช้ home/+/temperature

Multi-level สัญลักษณ์ # แทนหลายระดับครอบคลุมหลาย Topic สัญลักษณ์ # จะถูกวางเป็นอักขระตัวสุดท้าย และนำหน้าด้วยเครื่องหมาย / เมื่อ Client Subscribe รับ Topic โดยใช้สัญลักษณ์ # จะได้รับ message ทั้งหมดของ Topic ที่ขึ้นต้นด้วยรูปแบบก่อนอักขระ # ไม่ว่าหัวข้อจะยาวหรือลึกแค่ไหน ตัวอย่างเช่น หากผู้ใช้ต้องการรับข้อมูลภายในหัวข้อ Bedroom ทั้งหมดสามารถใช้ home/bedroom/# และในการตรวจสอบ Topic หรือ เงื่อนไขที่ต้องการ สามารถใช้ if-else condition

if (String(topic) == "@msg/home/bedroom/temperature") {
// Do something.
}
else{
// Do something.
}
การ Subscribe ที่แนะนำให้ทำ
การ Subscribe ที่แนะนำไม่ให้ทำ

สุดท้าย ตัวอย่างโค้ดเพื่อการป้องกันการถูกบล็อกจากการ Subscribe เกิน 10 ครั้ง ภายในระยะเวลา 1 วินาที


#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqtt_server = "broker.netpie.io";
const int mqtt_port = 1883;
const char* mqtt_Client = "YOUR_CLIENTID";
const char* mqtt_username = "YOUR_USERNAME";
const char* mqtt_password = "YOUR_PASSWORD";
WiFiClient espClient;
PubSubClient client(espClient);
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection…");
if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
Serial.println("connected");
client.subscribe("@msg/home/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i];
}
Serial.println(message);
if (String(topic) == "@msg/home/bedroom/temperature") {
// Do something.
}
else if(String(topic) == "@msg/home/livingroom/temperature") {
// Do something.
}
else if(String(topic) == "@msg/home/kitchen/temperature") {
// Do something.
}
else{
// Do something.
}
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}

โค้ดตัวอย่างข้างต้น อ้างอิงการใช้เครื่องมือพัฒนา ArduinoIDE และใช้ไลบรารี่ PubSubClient หากใช้เครื่องมือพัฒนาอื่นๆ สามารถปรับแก้ชุดคำสั่งให้เหมาะสมกับเครื่องมือนั้นๆ

พูดคุย แลกเปลี่ยน สอบถามข้อมูลเกี่ยวกับ NETPIE ได้ที่
Facebook Group: https://www.facebook.com/groups/netpie

ติดตามข่าวสาร ติดต่อธุรกิจกับ NEXPIE ได้ที่
Facebook Fanpage: https://www.facebook.com/nexpie

--

--

NEXPIE Co., Ltd.
NEXPIE Co., Ltd.

Internet of Things Experts in Thailand เราคือผู้เชี่ยวชาญและผู้ให้บริการ Platform IoT โดยคนไทยเพื่อคนไทย