- MQTT là gì?
- Cài đặt Mosquitto MQTT Broker trên Raspberry Pi
- Thử nghiệm Nhà môi giới Raspberry Pi Mosquitto
- Sơ đồ mạch
- Mã và giải thích
MQTT là một giao thức được sử dụng để gửi và nhận tin nhắn qua internet. Trước đây chúng tôi đã sử dụng giao thức này trong Iot Điện kế và Raspberry Pi Alexa để xuất bản dữ liệu trên internet. Trong hướng dẫn này, chúng ta sẽ biết thêm về MQTT và các điều khoản liên quan đến nó. Ở đây chúng tôi sẽ sử dụng Raspberry Pi làm nhà môi giới MQTT cục bộ và điều khiển đèn LED được kết nối với NodeMCU ESP12E thông qua bảng điều khiển ứng dụng MQTT. Một cảm biến DHT11 cũng được kết nối với NodeMCU để chúng tôi có thể đọc nhiệt độ và độ ẩm trên bảng điều khiển MQTT, bằng cách sử dụng lại Raspberry Pi làm nhà môi giới MQTT cục bộ.
Vì vậy, hãy bắt đầu bằng cách hiểu rõ MQTT và các điều khoản liên quan đến nó.
MQTT là gì?
MQTT là viết tắt của Message Queue Telemetry Transport được thiết kế bởi IBM. Giao thức này đơn giản và nhẹ được sử dụng để gửi và nhận tin nhắn qua internet và nó được thiết kế cho các thiết bị sử dụng băng thông thấp. Ngày nay, giao thức này thường được sử dụng trong các thiết bị IoT để gửi và nhận dữ liệu cảm biến. Ngoài ra, trong các hệ thống tự động hóa gia đình dựa trên IoT, giao thức này có thể dễ dàng được sử dụng mà không cần sử dụng nhiều dữ liệu internet.
Có một số thuật ngữ được sử dụng thường xuyên trong MQTT:
- Đăng ký và xuất bản
- Thông điệp
- Đề tài
- Người môi giới
1. Đăng ký và xuất bản: Đăng ký có nghĩa là để lấy dữ liệu từ thiết bị khác và xuất bản là phương tiện để gửi dữ liệu đến thiết bị khác.
Khi thiết bị1 gửi dữ liệu đến thiết bị2 thì thiết bị đó được gọi là Nhà xuất bản và thiết bị khác là Người đăng ký và ngược lại.
2. Tin nhắn: Tin nhắn là thông tin mà chúng ta đang gửi và nhận. Nó có thể là một dữ liệu hoặc bất kỳ loại lệnh nào. Ví dụ: nếu chúng tôi đang xuất bản dữ liệu nhiệt độ lên đám mây thì dữ liệu nhiệt độ này được gọi là Thông báo.
3. Chủ đề: Đây là cách bạn đăng ký sự quan tâm cho các tin nhắn đến hoặc cách bạn chỉ định nơi bạn muốn xuất bản tin nhắn. Các chủ đề được trình bày bằng các chuỗi được phân tách bằng dấu gạch chéo. Dữ liệu được công bố trên các chủ đề bằng MQTT và sau đó thiết bị MQTT đăng ký vào chủ đề để lấy dữ liệu.
4. MQTT Broker: Cái này có nhiệm vụ nhận tất cả tin nhắn từ người đăng tin, lọc tin nhắn rồi xuất bản tin nhắn đến những người đăng ký quan tâm.
Khi nhà môi giới này được lưu trữ trên đám mây thì nó được gọi là đám mây MQTT. Có nhiều dịch vụ MQTT dựa trên đám mây như Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure, v.v. MQTT cũng có thể được sử dụng với đám mây Amazon AWS phổ biến, mà chúng tôi đã giải thích trong hướng dẫn Bắt đầu với Amazon AWS.
Chúng tôi có thể tạo nhà môi giới MQTT của riêng mình bằng Raspberry Pi. Đây sẽ là nhà môi giới MQTT địa phương, tức là bạn có thể gửi và nhận dữ liệu trên mạng cục bộ của mình mà không phải từ bất kỳ đâu. Vì vậy, ở đây chúng tôi sẽ cài đặt nhà môi giới Mosquitto MQTT trong Raspberry Pi để biến nó thành nhà môi giới MQTT cục bộ và sẽ gửi dữ liệu nhiệt độ từ NodeMCU đến ứng dụng bảng điều khiển MQTT. Ngoài ra, chúng tôi sẽ điều khiển một đèn LED được kết nối với NodeMCU bằng cách sử dụng nhà môi giới.
Cài đặt Mosquitto MQTT Broker trên Raspberry Pi
Mở thiết bị đầu cuối trong Raspberry pi của bạn và nhập các lệnh sau để cài đặt nhà môi giới
sudo apt update sudo apt install -y mosquitto mosquitto-client
Chờ cho quá trình cài đặt kết thúc. Bây giờ, để khởi động trình môi giới khi khởi động raspberry pi, hãy nhập lệnh sau
sudo systemctl cho phép mosquitto.service
Vậy là xong, chúng tôi đã sẵn sàng khởi chạy nhà môi giới MQTT của mình. Để kiểm tra xem nó đã được cài đặt đúng chưa, hãy nhập lệnh sau
mosquitto -v
Lệnh này sẽ cung cấp cho bạn phiên bản của nhà môi giới MQTT của bạn. Nó phải là 1.4.x hoặc cao hơn.
Thử nghiệm Nhà môi giới Raspberry Pi Mosquitto
1. Chạy trình môi giới Mosquitto trong nền bằng lệnh dưới đây
mosquitto -d
2. Bây giờ, chúng ta sẽ đăng ký một chủ đề trong exampleTopic bằng lệnh sau
mosquitto_sub -d -t exampleTopic
3. Bây giờ, chúng tôi sẽ xuất bản một số thông báo lên exampleTopic
mosquitto_pub -d -t exampleTopic -m "Xin chào thế giới!"
Bạn sẽ nhận được Hello world! Tin nhắn trong thiết bị đầu cuối thuê bao.
Bây giờ, đã đến lúc kiểm soát và lấy dữ liệu từ một thiết bị khác trong trường hợp của chúng tôi, chúng tôi đang sử dụng ứng dụng bảng điều khiển NodeMCU và MQTT .
- Đầu tiên, chúng tôi sẽ điều khiển một đèn LED bằng cách gửi lệnh sử dụng Ứng dụng để trong trường hợp này NodeMCU hoạt động như một người đăng ký và Ứng dụng với tư cách là nhà xuất bản.
- Sau đó, ESP12E cũng có cảm biến DHT11 được kết nối với nó và nó sẽ gửi kết quả đo nhiệt độ này tới ứng dụng Mobile MQTT, vì vậy trong trường hợp này, thiết bị di động sẽ là người đăng ký và NodeMCU sẽ là nhà phát hành. Và để chuyển tiếp những thông điệp này trên các Chủ đề tương ứng, nhà môi giới MQTT của Mosquitto được sử dụng.
Sơ đồ mạch
Kết nối mạch điện như trong sơ đồ. Ở đây, DHT11 được sử dụng để đọc nhiệt độ nhưng cũng có thể sử dụng cảm biến Nhiệt độ LM35. Chúng tôi đã sử dụng cảm biến DHT11 trong nhiều dự án của mình bao gồm cả với NodeMCU để xây dựng một trạm thời tiết.
Hãy bắt đầu viết mã cho NodeMCU để đăng ký và xuất bản dữ liệu.
Mã và giải thích
Ở đây chúng tôi sẽ sử dụng mẫu thư viện Adafruit MQTT và sẽ thay đổi những thứ cần thiết trong mã. Mã tương tự có thể được sử dụng để xuất bản và đăng ký dữ liệu lên đám mây Adafruit IO chỉ bằng cách thay đổi một số điều.Để tải xuống thư viện Adafruit MQTT từ Sketch -> Bao gồm Thư viện -> Quản lý Thư viện. Tìm kiếm Adafruit MQTT và cài đặt nó. Sau khi cài đặt thư viện. Đi tới ví dụ -> Thư viện mqtt Adafruit -> mqtt_esp8266
Sau đó, chỉnh sửa mã này theo địa chỉ IP Raspberry Pi và thông tin đăng nhập Wi-Fi của chúng tôi.
Bao gồm tất cả các thư viện cho ESP8266WIFI và Adafruit MQTT .
#include
Sau đó, xác định SSID và Mật khẩu cho Wi-Fi của bạn, từ đó bạn muốn kết nối ESP-12e của mình. Đảm bảo RPi và NodeMCU của bạn kết nối với cùng một mạng.
# xác định WLAN_SSID "xxxxxxxx" # xác định WLAN_PASS "xxxxxxxxxxx"
Phần này xác định máy chủ Adafruit, trong trường hợp này là địa chỉ IP của cổng máy chủ và Raspberry Pi của bạn.
#define AIO_SERVER "địa chỉ ip của Pi" #define AIO_SERVERPORT 1883
Các trường bên dưới sẽ vẫn trống vì chúng tôi không sử dụng đám mây Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
Sau đó, tạo một lớp ESP8266 WiFiClient để kết nối với máy chủ MQTT.
Máy khách WiFiClient;
Thiết lập lớp máy khách MQTT bằng cách chuyển vào máy khách WiFi và máy chủ MQTT và thông tin đăng nhập.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Thiết lập một nguồn cấp dữ liệu có tên là 'Nhiệt độ' để xuất bản nhiệt độ.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / Temperature");
Thiết lập một nguồn cấp dữ liệu có tên 'led1' để đăng ký các thay đổi.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
Trong chức năng thiết lập , chúng tôi khai báo mã PIN của NodeMCU mà bạn muốn lấy đầu ra. Sau đó, kết nối NodeMCU với điểm truy cập Wi-fi.
void setup () { Serial.begin (115200); chậm trễ (10); pinMode (LED, OUTPUT); Serial.println (F ("Bản trình diễn Adafruit MQTT")); // Kết nối với điểm truy cập WiFi. Serial.println (); Serial.println (); Serial.print ("Đang kết nối với"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); trong khi (WiFi.status ()! = WL_CONNECTED) { …. …. … Thiết lập đăng ký MQTT cho nguồn cấp dữ liệu đã dẫn. mqtt.subscribe (& led1); }
Trong chức năng vòng lặp , chúng tôi sẽ đảm bảo rằng kết nối đến máy chủ MQTT vẫn hoạt động bằng cách sử dụng MQTT_connect (); chức năng.
void loop () { MQTT_connect ();
Bây giờ, đăng ký nguồn cấp dữ liệu 'dẫn đầu' và lấy chuỗi từ nhà môi giới MQTT và chuyển chuỗi này thành số bằng atoi (); hàm và ghi số này vào chân LED bằng cách sử dụng digitalWrite (); chức năng.
Đăng ký Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
Bây giờ, lấy nhiệt độ trong một biến và xuất bản giá trị này bằng cách sử dụng hàm Temperature.publish (t) .
float t = dht.readTempe Heat (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Không thành công")); } else { Serial.println (F ("OK!")); }
Mã đầy đủ với một video trình diễn được đưa ra ở cuối hướng dẫn này. Tải mã lên bảng NodeMCU và mở ứng dụng bảng điều khiển MQTT mà bạn đã tải xuống trong Điện thoại thông minh.
Bạn cũng có thể điều khiển Raspberry Pi GPIO từ mọi nơi trên thế giới bằng cách sử dụng đám mây MQTT như Adafruit IO, MQTT.IO, v.v. mà chúng ta sẽ tìm hiểu trong hướng dẫn tiếp theo.