ข้อควรระวังการใช้งาน MQTT NETPIE การใช้งาน Subscribe
บทความนี้ อธิบายถึงข้อควรระวังการทำงานการ Subscribe Topicไปที่ NETPIE Platform(NETPIE2020)โดยเกิดจากการกระทำต่างๆ
การ Subscribe Topic ไม่สำเร็จหรือผิดพลาด หลังจากเชื่อมต่อแพลตฟอร์มสำเร็จ หากเกิดการทำงานข้างต้นเกิน 4 ครั้ง ภายในระยะเวลา 5 วินาที จะถูกบล็อก ไม่สามารถเชื่อมต่อได้ระยะเวลาหนึ่ง และหากกระทำข้างต้นถี่และเป็นระยะเวลานาน จะถูกบล็อกไม่สามารถเชื่อมต่อได้เป็นเวลานานขึ้น
สาเหตุที่อาจทำให้เกิดการ Subscribe Topic ไม่สำเร็จ มีดังนี้ :
- ผู้ใช้งาน 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 เกิน 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