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

NEXPIE Co., Ltd.
NEXPIE Co., Ltd.
Published in
3 min readMar 31, 2021

--

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

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

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

  1. ระบุ Syntax Publish/Subscribe ไม่ถูกต้อง
  2. Publish หรือ Subscribe ข้อความเกิน 10 ข้อความ ภายในระยะเวลา 1 วินาที
  3. Publish ข้อความขนาดเกิน 1600 byte

.

1.ผู้ใช้งานระบุ Syntax Publish/Subscribe ไม่ถูกต้อง เช่น “@msg/test” ระบุผิดเป็น “@msq/test” หรือ “@shadow/update” เป็น “@shadow/updated” แพลตฟอร์มจะตัดการเชื่อมต่อกับอุปกรณ์ ทำให้การเชื่อมต่อของอุปกรณ์หลุดการเชื่อมต่อ และหากอุปกรณ์ทำการเชื่อมต่ออีกครั้ง และผู้ใช้งานระบุ Syntax Publish/Subscribe ไม่ถูกต้อง แพลตฟอร์มจะตัดการเชื่อมต่อกับอุปกรณ์อีกครั้ง ซึ่งทำให้เกิดการบล็อกการเชื่อมต่อ

ผู้ใช้งานสามารถแก้ปัญหาข้างต้นด้วยการตรวจสอบ Topic ในการ Publish หรือ Subscribe ยกตัวอย่าง เช่น
- @msg/{any} : Topic ในการ Pub หรือ Sub เมื่อต้องการใช้งาน Message
- @shadow/data/update : Topic ในการ Pub เมื่อต้องการเขียน Shadow
โดยสามารถศึกษาการใช้งานเพิ่มเติมได้ที่ คู่มือการใช้งาน MQTT

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

ผู้ใช้งานสามารถแก้ปัญหาข้างต้นด้วยการออกแบบการ Publish ตามภาพแนะนำด้านล่างนี้

การ Publish ที่ไม่แนะนำให้ทำ
การ Publish ที่แนะนำให้ทำ

3. ผู้ใช้งาน Publish ข้อความขนาดเกิน 1600 byte หากเกิดการกระทำข้างต้นข้อมูลที่ส่งอาจตกหล่น

ผู้ใช้งานสามารถแก้ปัญหาข้างต้นด้วยการออกแบบโดยแบ่งข้อความ หรือ แบ่งขอบเขตข้อความก่อนจึงส่ง

สุดท้าย ตัวอย่างโค้ดเพื่อการป้องกันการถูกบล็อกจากการ Publish ข้อความเกิน 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/led"); //Subscribe "@msg/led"
} 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);
//สามารถตรวจสอบ Topic และเมสเสจจากการ publish จากตัวอย่าง
//"@msg/led", "led1 on,led2 on,led3 off,led4 on,led5 on"
if (String(topic) == "@msg/led") {
char *p = (char*)message.c_str();
char *str;
//แบ่งสตริงด้วยตัวคั่น ','
while ((str = strtok_r(p, ",", &p)) != NULL) {
Serial.println(str);
if (strcmp(str, "led1 on") == 0) {
Serial.println("LED1 ON");
}
else if (strcmp(str, "led1 off") == 0) {
Serial.println("LED1 OFF");
}
if (strcmp(str, "led2 on") == 0) {
Serial.println("LED2 ON");
}
else if (strcmp(str, "led2 off") == 0) {
Serial.println("LED2 OFF");
}
if (strcmp(str, "led3 on") == 0) {
Serial.println("LED3 ON");
}
else if (strcmp(str, "led3 off") == 0) {
Serial.println("LED3 OFF");
}
//.....
}
}
}
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()) {
delay(5000); //ป้องกันการถูกบล็อกจากข้อผิดพลาด
reconnect();
}
client.loop();
delay(10);
// การ publish ที่ควรระวัง
// client.publish("@msg/led1","on");
// client.publish("@msg/led2","on");
// client.publish("@msg/led3","on");
// client.publish("@msg/led4","on");
// client.publish("@msg/led5","on");
//
client.publish("@msg/led", "led1 on,led2 on,led3 off,led4 on,led5 on");
delay(5000);
}

โค้ดตัวอย่างข้างต้น อ้างอิงการใช้เครื่องมือพัฒนา 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 โดยคนไทยเพื่อคนไทย