- MQTT คืออะไร?
- การติดตั้ง Mosquitto MQTT Broker บน Raspberry Pi
- การทดสอบนายหน้า Raspberry Pi Mosquitto
- แผนภูมิวงจรรวม
- รหัสและคำอธิบาย
MQTTเป็นโปรโตคอลที่ใช้ในการส่งและรับข้อความทางอินเทอร์เน็ต ก่อนหน้านี้เราใช้โปรโตคอลนี้ใน Iot Electricity meter และ Raspberry Pi Alexa เพื่อเผยแพร่ข้อมูลบนอินเทอร์เน็ต ในบทช่วยสอนนี้เราจะเรียนรู้เพิ่มเติมเกี่ยวกับ MQTT และคำศัพท์ที่เกี่ยวข้อง ที่นี่เราจะใช้Raspberry Pi เป็นนายหน้า MQTT ในพื้นที่และควบคุม LED ที่เชื่อมต่อกับ NodeMCU ESP12E ผ่านแดชบอร์ดแอปพลิเคชัน MQTT เซ็นเซอร์ DHT11 ยังเชื่อมต่อกับ NodeMCU ดังนั้นเราจึงได้รับการอ่านอุณหภูมิและความชื้นบนแดชบอร์ด MQTT โดยใช้ Raspberry Pi เป็นนายหน้า MQTT ในพื้นที่อีกครั้ง
ดังนั้นเริ่มต้นด้วยการพูดถึง MQTT และคำศัพท์ที่เกี่ยวข้อง
MQTT คืออะไร?
MQTT ย่อมาจาก Message Queue Telemetry Transportซึ่งออกแบบโดย IBM โปรโตคอลนี้เรียบง่ายและมีน้ำหนักเบาซึ่งใช้ในการส่งและรับข้อความทางอินเทอร์เน็ตและออกแบบมาสำหรับอุปกรณ์ที่ใช้แบนด์วิดท์ต่ำ ปัจจุบันโปรโตคอลนี้มักใช้ในอุปกรณ์ IoT เพื่อส่งและรับข้อมูลเซ็นเซอร์ นอกจากนี้ในระบบอัตโนมัติภายในบ้านที่ใช้ IoT สามารถใช้โปรโตคอลนี้ได้อย่างง่ายดายโดยไม่ต้องใช้ข้อมูลอินเทอร์เน็ตมากนัก
มีคำศัพท์ไม่กี่คำที่ใช้บ่อยใน MQTT:
- สมัครสมาชิกและเผยแพร่
- ข้อความ
- หัวข้อ
- นายหน้า
1. สมัครและเผยแพร่:สมัครสมาชิกหมายถึงการรับข้อมูลจากอุปกรณ์อื่นและการเผยแพร่หมายถึงการส่งข้อมูลไปยังอุปกรณ์อื่น
เมื่อ device1 ส่งข้อมูลไปยัง device2 จะเรียกว่า Publisher และอีกอันคือ Subscriber และในทางกลับกัน
2. ข้อความ:ข้อความคือข้อมูลที่เรากำลังส่งและรับ อาจเป็นข้อมูลหรือคำสั่งประเภทใดก็ได้ ตัวอย่างเช่นหากเรากำลังเผยแพร่ข้อมูลอุณหภูมิไปยังระบบคลาวด์ข้อมูลอุณหภูมินี้เรียกว่าข้อความ
3. หัวข้อ:นี่คือวิธีลงทะเบียนความสนใจสำหรับข้อความขาเข้าหรือวิธีระบุตำแหน่งที่คุณต้องการเผยแพร่ข้อความ หัวข้อจะแสดงด้วยสตริงที่คั่นด้วยเครื่องหมายทับ มีการเผยแพร่ข้อมูลในหัวข้อโดยใช้ MQTT จากนั้นอุปกรณ์ MQTT จะสมัครสมาชิกหัวข้อเพื่อรับข้อมูล
4. MQTT Broker:สิ่งนี้มีหน้าที่รับข้อความทั้งหมดจากผู้จัดพิมพ์กรองข้อความแล้วเผยแพร่ข้อความไปยังสมาชิกที่สนใจพวกเขา
เมื่อโบรกเกอร์นี้ถูกโฮสต์ในระบบคลาวด์แล้วมันจะเรียกว่า MQTT เมฆ มีบริการ MQTT บนคลาวด์มากมายเช่น Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure เป็นต้นนอกจากนี้ MQTT ยังสามารถใช้กับ Amazon AWS cloud ยอดนิยมซึ่งเราได้อธิบายไว้ในบทช่วยสอนการเริ่มต้นใช้งาน Amazon AWS
เราสามารถทำให้นายหน้า MQTT ของเราเองโดยใช้ราสเบอร์รี่ Pi นี่จะเป็นโบรกเกอร์ MQTT ในพื้นที่นั่นคือคุณสามารถส่งและรับข้อมูลบนเครือข่ายท้องถิ่นของคุณเท่านั้นไม่ใช่จากที่ใดก็ได้ ดังนั้นที่นี่เราจะติดตั้งนายหน้า Mosquitto MQTT ในราสเบอร์รี่ Pi ที่จะทำให้มันนายหน้า MQTT ท้องถิ่นและจะส่งข้อมูลอุณหภูมิจาก NodeMCU ไปยังโปรแกรมประยุกต์แดชบอร์ด นอกจากนี้เราจะควบคุม LED ที่เชื่อมต่อกับ NodeMCU โดยใช้โบรกเกอร์
การติดตั้ง Mosquitto MQTT Broker บน Raspberry Pi
เปิดเทอร์มินัลใน Raspberry pi ของคุณแล้วพิมพ์คำสั่งต่อไปนี้เพื่อติดตั้งโบรกเกอร์
sudo apt update sudo apt install -y mosquitto mosquitto-clients
รอให้การติดตั้งเสร็จสิ้น ตอนนี้ในการเริ่มนายหน้าเมื่อเริ่มต้น raspberry pi ให้พิมพ์คำสั่งต่อไปนี้
sudo systemctl เปิดใช้งาน mosquitto.service
เพียงเท่านี้เราก็พร้อมที่จะเปิดตัวโบรกเกอร์ MQTT ของเราแล้ว ในการตรวจสอบว่าติดตั้งอย่างถูกต้องให้ป้อนคำสั่งต่อไปนี้
มอสควิตโต -v
คำสั่งนี้จะให้รุ่นของโบรกเกอร์ MQTT ของคุณ ควรเป็น 1.4.x ขึ้นไป
การทดสอบนายหน้า Raspberry Pi Mosquitto
1. เรียกใช้โบรกเกอร์ Mosquitto ในพื้นหลังโดยใช้คำสั่งด้านล่าง
มอสควิตโต -d
2. ตอนนี้เราจะสมัครหัวข้อใน exampleTopic โดยใช้คำสั่งต่อไปนี้
mosquitto_sub -d -t ตัวอย่าง
3. ตอนนี้เราจะเผยแพร่ข้อความบางส่วนไปยัง exampleTopic
mosquitto_pub -d -t exampleTopic -m "Hello world!"
คุณจะได้รับ Hello world! ข้อความในเทอร์มินัลสมาชิก
ตอนนี้ถึงเวลาควบคุมและรับข้อมูลจากอุปกรณ์อื่นในกรณีของเราเราใช้แอปพลิเคชันแดชบอร์ด NodeMCU และMQTT
- ครั้งแรกที่เราจะควบคุมไฟ LED โดยการส่งคำสั่งโดยใช้ App ดังนั้นในกรณีนี้NodeMCU ประพฤติตัวเป็นสมาชิกและ App เป็นผู้เผยแพร่
- จากนั้นยังมี ESP12E DHT11 เซ็นเซอร์ที่เชื่อมต่อกับมันและมันจะส่งการอ่านอุณหภูมินี้เพื่อการประยุกต์ใช้โทรศัพท์มือถือ MQTT ดังนั้นในกรณีนี้มือถือจะเป็นสมาชิกและ NodeMCU จะเป็นสำนักพิมพ์ และในการส่งต่อข้อความเหล่านี้ในหัวข้อที่เกี่ยวข้องจะใช้โบรกเกอร์ Mosquitto MQTT
แผนภูมิวงจรรวม
ต่อวงจรดังแสดงในแผนภาพ ที่นี่ DHT11 ใช้สำหรับการอ่านค่าอุณหภูมิ แต่ยังสามารถใช้เซ็นเซอร์วัดอุณหภูมิ LM35 ได้ เราใช้เซ็นเซอร์ DHT11 ในหลายโครงการของเราแล้วรวมถึง NodeMCU เพื่อสร้างสถานีตรวจอากาศ
เริ่มเขียนโค้ดสำหรับ NodeMCU เพื่อสมัครสมาชิกและเผยแพร่ข้อมูล
รหัสและคำอธิบาย
ในที่นี้เราจะใช้เทมเพลตไลบรารี Adafruit MQTT และจะเปลี่ยนสิ่งที่จำเป็นในโค้ด สามารถใช้รหัสเดียวกันเพื่อเผยแพร่และสมัครรับข้อมูลกับ Adafruit IO cloud ได้เพียงแค่เปลี่ยนแปลงบางสิ่งสำหรับสิ่งนี้ให้ดาวน์โหลดไลบรารี Adafruit MQTT จาก Sketch -> Include Library -> Manage Libraries ค้นหา Adafruit MQTT และติดตั้ง หลังจากติดตั้งไลบรารี. ไปที่ ตัวอย่าง -> Adafruit mqtt library -> mqtt_esp8266
จากนั้นแก้ไขรหัสนี้ตามที่อยู่ IP Raspberry Pi และข้อมูลรับรอง Wi-Fi ของเรา
รวมทั้งหมด ห้องสมุด ESP8266WIFI และ Adafruit MQTT
# รวม
จากนั้นกำหนด SSID และรหัสผ่านสำหรับ Wi-Fi ของคุณซึ่งคุณต้องการเชื่อมต่อ ESP-12e ของคุณ ตรวจสอบให้แน่ใจว่า RPi และ NodeMCU ของคุณเชื่อมต่อกับเครือข่ายเดียวกัน
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
ส่วนนี้กำหนดเซิร์ฟเวอร์ Adafruit ในกรณีนี้คือที่อยู่ IP ของ Raspberry Pi และพอร์ตเซิร์ฟเวอร์ของคุณ
#define AIO_SERVER "ที่อยู่ IP ของ Pi ของคุณ" #define AIO_SERVERPORT 1883
ช่องด้านล่างจะยังคงว่างเปล่าเนื่องจากเราไม่ได้ใช้ระบบคลาวด์ Adafruit
#define AIO_USERNAME "" # กำหนด AIO_KEY ""
จากนั้นสร้างคลาส ESP8266 WiFiClient เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ MQTT
ไคลเอนต์ WiFiClient;
ตั้งค่าคลาสไคลเอนต์ MQTT โดยส่งผ่านไคลเอนต์ WiFi และเซิร์ฟเวอร์ MQTT และรายละเอียดการเข้าสู่ระบบ
Adafruit_MQTT_Client mqtt (& ลูกค้า, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
ตั้งค่าฟีดที่เรียกว่า 'อุณหภูมิ' เพื่อเผยแพร่อุณหภูมิ
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
ตั้งค่าฟีดที่เรียกว่า 'led1' เพื่อสมัครรับการเปลี่ยนแปลง
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
ใน ฟังก์ชั่น การตั้งค่า เราจะประกาศ PIN ของ NodeMCU ที่คุณต้องการรับเอาต์พุต จากนั้นเชื่อมต่อ NodeMCU กับจุดเชื่อมต่อ Wi-Fi
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); ล่าช้า (10); PinMode (LED, เอาท์พุท); Serial.println (F ("Adafruit MQTT demo")); // เชื่อมต่อกับจุดเชื่อมต่อ WiFi Serial.println (); Serial.println (); Serial.print ("กำลังเชื่อมต่อกับ"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); ในขณะที่ (WiFi.status ()! = WL_CONNECTED) { …. …. … ตั้งค่าการสมัครสมาชิก MQTT สำหรับฟีดนำ mqtt.subscribe (& led1); }
ใน ฟังก์ชัน ลูป เราจะตรวจสอบให้แน่ใจว่าการเชื่อมต่อกับเซิร์ฟเวอร์ MQTT นั้นยังมีชีวิตอยู่โดยใช้ MQTT_connect (); ฟังก์ชัน
ห่วงเป็นโมฆะ () { MQTT_connect ();
ตอนนี้สมัครฟีด 'led' และรับสตริงจากโบรกเกอร์ MQTT และแปลงสตริงนี้เป็นตัวเลขโดยใช้ atoi (); ฟังก์ชั่นและเขียนหมายเลขนี้ไปยังขา LED โดยใช้ digitalWrite (); ฟังก์ชัน
Adafruit_MQTT_Subscribe * สมัครสมาชิก; ในขณะที่ ((การสมัครสมาชิก = mqtt.readSubscription (20000))) { if (การสมัครสมาชิก == & led1) { Serial.print (F ("Got:")); Serial.println ((ถ่าน *) led1.lastread); int led1_State = atoi ((ถ่าน *) led1.lastread); digitalWrite (LED, led1_State); }
ตอนนี้ได้รับอุณหภูมิในตัวแปรและเผยแพร่ค่านี้ใช้ Temperature.publish (t) ฟังก์ชั่น
ลอย t = dht.readTemperature (); … .. if (! temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("ตกลง!")); }
โค้ดเต็มพร้อมวิดีโอสาธิตจะได้รับในตอนท้ายของบทช่วยสอนนี้ อัปโหลดรหัสไปยังบอร์ด NodeMCU และเปิดแอปแดชบอร์ด MQTT ที่คุณดาวน์โหลดในสมาร์ทโฟน
คุณยังสามารถควบคุม Raspberry Pi GPIO ได้จากทุกที่ในโลกโดยใช้คลาวด์ MQTT เช่น Adafruit IO, MQTT.IO เป็นต้นซึ่งเราจะเรียนรู้ในบทช่วยสอนถัดไป