ตอนแทรก 3.5-1: การติดตั้ง Mosquitto MQTT และการใช้งานกับ Nodemcu

ขนาดแม่การะเกดยังมีตอนแทรกหมูกะทะได้ วันนี้ผมก็เลยขอนำเสนอตอนแทรกของ Painlessmess บ้าง จากตอนที่ 3 เราน่าจะเห็นภาพในส่วนของการใช้งาน ESP8266/ESP32 ด้วย Painlessmess กับ การนำ Nodemcu มาใช้ Bridge เพื่อส่งข้อมูลออก Network ภายนอกไปยัง MQTT Server ด้วย Software Serial กันไปแล้ว

ในความจริงแล้วการ Bridge ระหว่าง Mesh Network กับ Network อีกวงเพื่อส่งข้อมูลนั้นสามารถทำได้มากกว่าการใช้งาน Software Serial โดยที่ทางผู้พัฒนา Painlessmesh ก็ได้นำเสนอวิธีเพื่อใช้ในการส่งข้อมูลออกภายนอกไว้อีกหลายวิธีด้วยกัน ลองเข้าไปศึกษาต่อกันได้ที่ลิงค์นี้เลยครับ (Bridge between mesh and another network)

เนื้อหาตอนแทรกของวันนี้จะเป็นเรื่องของการใช้งาน Mosquitto MQTT กับ  Nodemcu โดยเฉพาะเลย เรียกได้ว่าเป็นตอนต่อขยาย หรือทบทวนเนื้อหาจากตอนที่แล้วก็คงไม่ผิดนัก ฉะนั้นวันนี้เราจะมาใช้งาน MQTT และใช้ในการสื่อสารแบบ Two Way กันครับ เพราะในตอนแทรกตอนหน้า (3.5-2) เราจะ Bridge และ Control Node ต่างๆใน Mesh Network ของเราผ่านทาง MQTT กัน  แบบ Two way communication ส่วนวันนี้เราจะแบ่งเนื้อหาออกเป็นส่วนย่อยๆกันดังนี้

  • Setup/Config MQTT Server บน Google Cloud
  • Using MQTT with Nodemcu
  • Two Way Communication with  MQTT Dash & Nodemcu

 

Setup/Config MQTT Server บน Google Cloud

มาเริ่มกันที่เตรียมความพร้อมในส่วนของ MQTT Server กันก่อน เพราะทำเสร็จในตอนนี้ เราจะได้ใช้กันยาวๆถึงตอนที่ 5 กันเลยครับ สำหรับใครที่ยังไม่เคยใช้ Google Cloud ก็ทดลองสมัครเลยครับได้ฟรีเครดิต 300USD ตอนแรกด้วย

ซึ่งเอาจริงๆก็ใช้ไม่ถึงหรอกครับ เมื่อสมัครใช้งานเรียบร้อยแล้วเราจะมาเริ่มใช้งานกันละ ส่วนใครที่ใช้บริการฟรีของ CloudMQTT ก็สามารถข้ามขั้นตอนนี้ไปด้านล่างได้เลยครับ ส่วนใครสนใจสมัคร Google Cloud ก็เข้าที่ลิงค์นี้ได้เลยครับแค่มี Gmail กับบัตรเครดิตเท่านั้น (Google Cloud)

 

หลังจากสมัครใช้บริการแล้วเราก็เริ่มต้นสร้าง Project ขึ้นมาก่อน จะได้แยกให้เป็นระเบียบหน่อย

 

ใส่ชื่อ Project name แล้ว Create ได้เลยครับ รอซักพัก Project ของเราก็จะเข้าไปอยู่ใน Project List ละ

 

เลือกชื่อ Project ที่เราสร้างจาก Project List

 

ซึ่งบริการของ Google Cloud นั้นมีให้เลือกมากมายเลยครับ ไว้มีเวลาเราจะมาเล่ารายละเอียดกันทั้งส่วนที่เป็น Container, BigData หรือ AI กัน แต่วันนี้เราจะมาสร้าง Virtual Machine ของเราเพื่อใช้ในการทำ MQTT Server กันโดยเข้าไปที่ส่วนของ VM Instances ตามรูปเลยครับ

 

จากนั้นก็กด Create เพื่อสร้าง VM Instance แรกของเราใน Project นี้กัน

ใส่ชื่อ VM Instance ของเราพร้อมทั้งเลือก Zone ซึ่งเราจะใช้งาน ในประเทศไทยก็เลือกเป็น Asia-southeast เวลาเข้าใช้งานจะได้ไม่ต้องวิ่งอ้อมไกล แล้วก็เลือก Machine Type เป็น micro เพราะเราใช้แค่ Service MQTT ซึ่งกิน resource น้อยอยู่แล้ว และเลือก Image ของ OS เป็น Ubuntu ตามรูปด้านล่างนี้เลย จากนั้นก็เลื่อนลงมากด Create เพื่อสร้าง Instance นี้กัน

 

เมื่อสร้าง VM Instance แรกเสร็จแล้วก็จะแสดงผลอย่างด้านล่างนี้ครับ มีส่วนของ IP จริงให้ด้วย ซึ่งถ้าใคร enable http access ไว้ก็สามารถที่จะเข้าผ่านทาง port 80 ได้เลย แต่ MQTT Server ของเราไม่จำเป็นก็ไม่ต้อง enable ครับ

ซึ่ง IP จริงที่เราได้ตรงนี้มีโอกาสเปลี่ยนได้ ฉะนั้นเราต้องมาล้อค IP จริงของ VM Instance นี้ของเรากันก่อน เผื่อว่าวันนึง Restart/Shutdown/Maintenance ขึ้นมาจะได้ยังคง IP เดิมไว้ โดยคลิกที่ชื่อ VM Instance ของเราเพื่อเข้าสู่เมนูรายละเอียดของ VM Instance ครับ

 

จากนั้นคลิกที่ Edit เพื่อที่เราจะมาตั้งค่าของ VM Instance ของเรากัน

 

เลื่อนลงมาในส่วนของ Network แล้วคลิกที่ icon รูปดินสอเพื่อทำการ Edit

 

โดยเราจะมาแก้กันในส่วนของ External IP เพื่อที่จะทำการจอง IP นี้ไว้ ให้คลิกจาก Dropdown List ตามด้านล่างนี้แล้วเลือก Create IP Address ครับ

 

ใส่ชื่อเพื่อไว้เป็น Reference ของ IP ที่เราต้องการจองเอาไว้ครับแล้วคลิก reserve

 

จากนั้นก็กดปุ่ม Done แล้วเลื่อนลงไปด้านล่างสุดแล้วกด Save การตั้งค่าของ VM Instance ของเราก็เป็นอันเสร็จเรียบร้อยครับ

 

แค่นี้ VM Instance ที่เป็น Ubuntu Server ของเราก็พร้อมใช้งานแล้ว คราวนี้เราจะมาเริ่มต้นการ Setup MQTT Server ของเรากันละครับ ที่หน้าหลักของ VM Instance เราคลิกที่ SSH เพื่อที่จะใช้งาน ssh terminal ผ่าน web browser กัน ซึ่งสะดวกสบายมาก

 

งานแรกเลยก็ทำการ Update และ  Upgrade Package บนเครื่อง Ubuntu Server ของเราก่อนด้วยคำสั่ง

sudo apt-get update

แล้วก็ตามด้วยคำสั่ง

sudo apt-get upgrade

 

ซึ่ง MQTT Server ที่เราจะใช้ก็คือ Mosquito MQTT โดยรายละเอียดก็สามารถดูได้จาก Official Site ได้เลยครับ (Eclipse Mosquito MQTT) เราจะเริ่มติดตั้ง Package ของ Mosquito กันด้วยคำสั่ง

sudo apt-get install mosquitto mosquitto-clients

 

 

เมื่อติดตั้งเสร็จเรียบร้อยแล้ว เรามาทดสอบการทำงานของ Mosquito MQTT Server ที่เราเพิ่งติดตั้งกันไปดูครับ โดยเปิด ssh terminal ขึ้นมาอีกหน้าต่างนึงจากหน้า VM Instance ของ Google Cloud

ที่หน้าต่างแรกเราจะ Subscribe Topic “test” บน MQTT Server ของเราโดยใช้คำสั่งดังนี้

mosquitto_sub -h localhost -t test

 

จากนั้นที่อีกหน้าต่างนึงเราจะ Public Message ออกไปที่หัวข้อเดียวกันโดยใช้คำสั่งดังนี้

mosquitto_pub -h localhost -t test -m "hello world"

 

ถ้า Mosquito MQTT Service ของเราทำงานอย่างถูกต้องก็จะได้ผลอย่างรูปด้านล่าง ข้อความของเราจะไปปรากฎที่อีก terminal นึงตาม Topic “test” ที่ Subscribe เอาไว้

 

ซึ่งเมื่อติดตั้งครั้งแรก MQTT Server ของเราจะยังไม่มีการใช้งานในส่วนของ User/Password ฉะนั้นเราต้องมีการตั้งค่าเพิ่มในส่วนนี้กัน โดยทำตามขั้นตอนดังนี้ครับ

สร้าง User พร้อมกำหนด Password

sudo mosquitto_passwd -c /etc/mosquitto/passwd joejoe

หมายเหตุ:
โดยที่ joejoe เป็น user ที่เราต้องการสร้างขึ้นมา จากนั้นระบบจะ prompt ให้ใส่ password ของ user นี้

 

สร้าง Mosquitto Config File

sudo nano /etc/mosquitto/conf.d/default.conf

จากนั้นเพิ่มสองบรรทัดนี้ลงไปแล้ว Save

allow_anonymous false
password_file /etc/mosquitto/passwd

allow_anonymous false บรรทัดนี้จะใช้ในการ Disable การเข้าใช้งานแบบ anonymous และบอก Mosquitto MQTT ให้รู้ว่าจะใช้ password file ที่ไหน

 

จากนั้นก็ Restart Service ของ Mosquitto MQTT

sudo systemctl restart mosquitto

 

คราวนี้เราของมาดูว่าถ้าเรา Publish ข้อความออกไปโดยไม่ใส่ username password จะเป็นไงบ้าง

mosquitto_pub -h localhost -t "test" -m "hello world"

 

เราก็จะเจอกับ Warning Message ขึ้นมาทันทีเลยว่า not authorized

 

คราวนี้เราลองมา Publish และ Subscribe แบบที่มี User/Password กันโดยเปิดขึ้นมา 2 Terminal ซึ่ง Terminal แรกก็ Subscribe อีก Terminal นึงก็ Publish โดยใช้คำสั่งต่อไปนี้

Terminal ฝั่ง Subscribe ใช้คำสั่งนี้
mosquitto_sub -h localhost -t test -u "user" -P "password"


Terminal ฝั่ง Publish ใช้คำสั่งนี้
mosquitto_pub -h localhost -t "test" -m "hello world" -u "user" -P "password"

มาถึงขั้นตอนนี้ก็ดูเหมือนการ Setup Mosquitto MQTT Server บน Google Cloud ของเราจะเสร็จเรียบร้อยแล้ว แต่ถ้าเป็นการใช้งานบน Google Cloud จริงๆเราต้อง allow firewall port เพื่อให้เราสามารถเชื่อมต่อจากภายนอกมาที่ MQTT Server ของเราได้ โดยสามารถทำตามขั้นตอนต่อไปนี้ครับ

 

เริ่มต้นการตั้งค่า Firewall บน Google Cloud โดยเข้าไปที่ VPC Network –> Firewall rules

 

Create Firewall Rule

กำหนดชื่อเพื่อใช้อ้างอิงกับ Firewall Rule ที่เราจะสร้างขึ้นมา และเลือกว่าจะให้มีผลกับทุก VM Instance ใน Project นี้หรือจะกำหนดให้เฉพาะกับ VM Instance ไหนก็ได้ รวมถึง Source IP อาจจะกำหนดให้ access ได้เฉพาะ IP ที่มาจากบริษัทหรือประเทศใดๆก็ได้ และกำหนด Port ที่ต้องการ Allow ซึ่ง Mosquitto MQTT ใช้ port 1883 แล้วก็กด Create

 

เมื่อกด Create เราก็จะได้ firewall rule ของเราที่ allow port 1883 สำหรับ mqtt ขึ้นมาเรียบร้อย ซึ่งเป็นการยอมให้เข้าถึงจาก Source IP ทุก IP ดังรูปด้านล่างนี้เลย

คราวนี้เรามาลองทดสอบส่งข้อความ (Publish) จาก ssh terminal แล้ว Subscribe Topic เดียวกันด้วยโปรแกรม MQTT.fx แล้วดูว่าสามารถ Connect และทำงานเป็นไปอย่างที่ควรจะเป็นมั้ย ซึ่งถ้าทำงานได้ถูกต้องก็จะได้ผลอย่างรูปด้านล่างนี้ครับ

เสร็จเรียบร้อยแล้วกับการติดตั้ง Mosquitto MQTT Server บน Google Cloud ซึ่งการติดตั้งหลักๆนั้นก็ไม่ยากเลย เพียงแต่การใช้งานบน Google Cloud จะมีรายละเอียดปลีกย่อยนิดหน่อย แต่ถ้าใครติดตั้งเป็น VM บนเครื่องตัวเอง หรือใช้งานบน Cloud Service Provider รายอื่นๆก็จะใช้หลักการเดียวกันครับ

 

WHY MQTT

เกริ่นมาซะยาวม รวมถึงการติดตั้ง Mosquitto MQTT Server ก็ย้าวยาวววว ว่าแต่ทำไมต้อง MQTT ผมว่าคงมีหลายคนสงสัยเหมือนผมแหละ เพราะตอนแรกผมก็สงสัยเหมือนกันครับ ทั้งๆที่ protocol ในการสื่อสารบน IP ก็มีตั้งเยอะแยะ สั้นๆง่ายๆเลยก็คือ ข้อความที่ส่งและรับนั้นเรียกได้ว่าเป็นแบบ Real Time เลยทีเดียวและที่สำคัญ ใช้งานง่ายและไม่โหลดในการใช้งาน ถ้าเปรียบเทียบระหว่าง Rest และ MQTT ก็จะเห็นเป็นแบบรูปนี้แหละครับ

รูปภาพจาก adafruit
รูปภาพจาก adafruit

รวมถึงการเชื่อมต่อกับฐานข้อมูลต่างๆ ผมเคยถามทางทีม R&D ของที่ออฟฟิสว่า ต้องการเก็บข้อมูลจากเซนเซอร์ต่างๆของงาน iot ลงฐานข้อมูลผมควรเขียนลงตรงๆกับฐานข้อมูลมั้ย ซึ่งจริงๆก็ทำได้ไม่ยาก โดยคำตอบที่ได้รับมาก็ทำให้น่าคิดอยู่เหมือนกัน ซึ่งเหตุผลที่สมควรมาใช้ MQTT ก็มี 2 ข้อหลักๆเลย

  • ถ้ากรณีที่มีอุปกรณ์หลายตัวแล้วส่งข้อมูลเข้ามามากๆ load ในส่วนของ Database Server จะสูงไปด้วย การจัดการกับเรื่องของ load บน MQTT Server ทำง่ายกว่า Database Server
  • เวลามีการแก้ไข ปรับเปลี่ยนฐานข้อมูล ไม่ต้องไปแก้ Code ในส่วนของ Node ปลายทาง แก้ส่วนที่ Bridge ระหว่าง MQTT กับ Database Server ทำให้ง่ายในการรองรับการเปลี่ยนแปลงในอนาคตโดยแบ่ง Service ออกเป็นส่วนๆ

 

Using MQTT with Nodemcu

คราวนี้เราลองมาใช้งาน MQTT ในการส่งข้อมูลมาที่มือถือและสั่งงานจากมือถือกลับมาที่ Nodemcu กันบ้าง ซึ่ง Library ที่เราจะใช้ใน Arduino IDE นี้จะชื่อว่า PubSubClient โดย Nick O’Leary เริ่มที่การติดตั้ง Library ตามรูปด้างล่างนี้เลยครับ

 

หลังจากติดตั้ง PubSubClient Library เสร็จเรียบร้อยแล้วมาดูกันที่ Code แรกเลยกับการอ่านค่าอุณหภูมิและความชื้นจากเซนเซอร์ DHT22 แล้วส่งข้อความ (Publish) ไปที่ MQTT Server ที่เราสร้างกันมาก่อนหน้านี้ จากนั้นก็จะส่งค่ากลับจากมือถือกลับมาเพื่อควบคุมไฟ LED Builtin และ LED ที่ต่อที่ขา D3 กันครับ

Code สำหรับ ตัวอย่างนี้

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"


const char* ssid = "xxxx";
const char* password = "xxxx";
const char* mqtt_server = "xxxx"; //<-- IP หรือ Domain ของ Server MQTT

long lastMsg = 0;
char msg[100];
int value = 0;
String DataString;

#define LED_PIN D3  //ขาที่ต่อ LED
#define DHTPIN D4   //ขาที่ต่อเซนเซอร์ DHT22
#define DHTTYPE DHT22

WiFiClient espClient;
DHT dht(DHTPIN, DHTTYPE);


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);
    digitalWrite(LED_PIN, HIGH);

  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
    digitalWrite(LED_PIN, LOW);
  }

}


PubSubClient client(mqtt_server, 1883, callback, espClient);


void setup() {


  pinMode(LED_PIN, OUTPUT);
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output

  dht.begin();

  Serial.begin(115200);

  setup_wifi();

  client.connect("Node1", "joe1", "joe1");
  client.setCallback(callback);
  client.subscribe("command");

}

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  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());
}


// Procedure reconnect ใช้กรณีที่บางทีเราหลุดออกจาก Network แล้วมีการต่อเข้าไปใหม่อีกครั้ง

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("command");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 


  long now = millis();
  if (now - lastMsg > 5000) //เช็คระยะเวลาล่าสุดที่ส่งข้อความ Publish ออกไป ถ้าเกิน 5 วิก็ส่งออกไปใหม่
  {
    lastMsg = now;
    value++;
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    DataString = "Temp: "+String(t)+" Humidity: "+String(h);

    DataString.toCharArray(msg, 100);

    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("env", msg);  //ส่งข้อความ Temp + Humidity ออกไปที่ Topic "env"
  }
}

 

เมื่อ Upload Code เสร็จและ Nodemcu เริ่มทำงาน ให้ลองเปิด Serial Monitor ดูครับ จากนั้นให้ลองใช้โปรแกรม MQTT.fx ในการ Publish ค่า 0 หรือ 1 มาที่ Topic “command” ก็จะเห็นผลอย่างข้างล่างนี้

 

แต่ที่เราเกริ่นไปนั้น เราจะส่งคำสั่งผ่านทางมือถือกัน ซึ่งก็ทำได้หลายวิธี ถ้าใครจะเขียน App แบบง่ายๆก็สามารถใช้โปรแกรมพวก MIT App Inventor ก็ได้หรือจะใช้โปรแกรม MQTT Client ที่ใช้สำหรับรับ-ส่ง ข้อความผ่าน MQTT Server โดยเฉพาะก็ง่ายดีเหมือนกัน ซึ่งบน Android นั้นมีโปรแกรมอยู่ตัวหนึ่งชื่อ MQTT Dash ใช้ง่ายและฟรีอีกด้วย

เมื่อโหลดโปรแกรมเสร็จแล้วก็ตั้งค่าด้วยการกดเครื่องหมายบวกที่มุมขวาบนในการเพิ่ม MQTT Server จากนั้นก็ตั้งค่าตาม Server ที่เราสร้างขึ้นมาเลยครับ ในส่วนของ Client ID นั้นก็เพื่อใช้เป็น Reference เวลาที่เราดู Log บน Server จะได้รู้ว่าเป็นการเชื่อมต่อมาจากที่ไหน

   

 

เมื่อตั้งค่า MQTT Server เสร็จเรียบร้อยแล้วเราก็จะเพิ่ม Widget เข้าไปเพื่อใช้ในการ Subscribe/Publish ตาม Topic ต่างๆ

สำหรับการ Subscribe (Text Wddget) เราก็ใช้ Topic env ที่ Nodemcu ของเรา Publish ค่า Temp+Humidity ออกมา และในส่วนของการ Publish (Switch Widget) เราก็ใช้ Topic command ที่ Nodemcu ของเรา Subscribe เอาไว้เพื่อใช้เช็คว่าคำสั่งที่ส่งมาเป็นอะไร

   

  

เมื่อเพิ่ม Widget ในส่วนของ Text และ Switch เรียบร้อยแล้วก็จะเห็นหน้าตาเป็นแบบนี้เลยครับ ในส่วนของ Text ก็จะได้รับข้อความที่ส่งมาจาก Nodemcu ส่วน Switch นั้นก็ใช้สำหรับควบคุม LED ที่ต่อกับ Nodemcu และ Builtin LED

 

มาลองดูผลลัพท์ที่เราทำกันดูครับ (LED ไม่ควรต่อตรงกับ Nodemcu นะครับมีโอกาสพังเหมือนกัน แต่นี่ใช้ต่อแว้บๆ พอดีบทความนี้มาเขียนที่คอนโด อุปกรณ์เลยไม่พร้อมซักเท่าไหร่)

 

สรุป

จากที่ทำมาทั้งหมดในตอนนี้เราก็จะได้รู้วิธีการ Setup Mosquitto MQTT Server ไว้ใช้งานกันบน Google Cloud หรือใครจะใช้กับ Cloud Service Provider รายอื่นวิธีการก็จะไม่ต่างกันมากนัก หรือใครจะเริ่มจากการลง Ubuntu Server เองตั้งแต่ต้นแล้วค่อยลง Mosquitto MQTT ก็ได้

ในส่วนของการใช้งาน MQTT กับมือถือเพื่อสั่งงาน Nodemcu ของเรานั้น ในความเป็นจริงแล้วยังมีวิธีอื่นที่ง่ายมาก ไม่ว่าจะเป็น Blynk หรือ cayenne iot แต่ MQTT นั้นเป็น lightweight protocol ที่ค่อนข้างเหมาะสมสำหรับใช้ในการรับส่งข้อมูลอย่างที่กล่าวไปข้างต้น ซึ่งบาง framework ที่ใช้ในการพัฒนาการรับส่งข้อมูลและควบคุมอุปกรณ์ iot ก็ใช้ MQTT เป็นเบื้องหลังนี่แหละครับ ซึ่งในตอนหน้า (3.5-2) เราจะมาใช้งานแบบ Two Way Communication กันกับ Mesh Network ด้วย Painlessmesh และ MQTT กันครับ

 

เรื่องเล่าท้ายตอน

ช่วงนี้แต่ละตอนก็จะทิ้งห่างกันหน่อยนะครับ เนื่องจากคนเขียนติดภาระกิจเพียบเลย เพราะใกล้วันประชุมผู้ถือหุ้นละ แถมยังใกล้สอบปลายภาคเข้าไปทุกที ใช่ครับสอบปลายภาค เนื่องจากปริญญาโทใบนึงที่มียังไม่พอ(มั้ง) เลยไปลงเรียน ป.โท วิศวะฯสาขาสถาปัตยกรรมองค์กร ที่ฟังชื่อสาขาแล้วก็อาจจะงงๆ ไว้มีโอกาสจะมาเล่าให้ฟังกัน ซึ่งนี่ก็เป็นเทอมสุดท้ายละเหลือแค่ 2 วิชาเท่านั้น กับสารนิพนธ์อีกหนึ่งเล่ม T_T แต่รับรองว่าจะมาต่อให้จบครบ 5 ตอนแน่นอน ใครที่ติดตามอยู่ก็อดใจรอกันหน่อยนะคร้าบบบ

Author: Joe D.S.
Just a man on earth

1 thought on “ตอนแทรก 3.5-1: การติดตั้ง Mosquitto MQTT และการใช้งานกับ Nodemcu

  1. ยินดีที่ไม่รู้จักครับ
    และขอขอบคุณการแบ่งปันความรู้ดีๆ ให้กับสังคม ขอบคุณครับ

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.