[IoT] Bài 7: ESP8266 – arduino ide và giao thức MQTT

MQTT là giao thức phù hợp nhất cho các dự án IoT thương mại, nó dáp ứng tốc độ tốt, băng thông ít, độ tin cậy cao. Tài liệu về MQTT thì các bạn tham khảo ở các trên mạng hoặc 1 số bài sau :

Mình sẽ không nhắc lại phần lí thuyết nữa vì trên mạng có rất nhiều rồi. Chúng ta sẽ đi vào thực hành làm thử 1 project với MQTT luôn

Đầu tiên, phía esp8266 các bạn tải thư viện Pubsubclient

ADD thư viện vào

Giao thức MQTT cần có 1 server ( gọi là broker) để làm trung tâm của mọi luồng dữ liệu, trong các bài viết sau mình sẽ hướng dẫn các bạn tự build server, còn trong bài này mình sẽ sử dụng server miễn phí không bảo mật là broker.hivemq.com để demo

Các bạn copy chương trình cho esp8266

  • Ở dòng 5 và 6 các bạn đổi thành wifi của mình.
  • Hàm callback là hàm gọi lại khi có dữ liệu gửi đến topic mà chúng ta đăng kí
  • Hàm client.subscribe dùng để đăng kí 1 topic
  • Hàm client.publish dùng để gửi dữ liệu lên 1 topic
  • Hàm client.connect để kết nối vào MQTT Broker, với các tham số
    ESP8266_id1 : Id của thiết bị đăng kí vào (có thể chỉnh sửa bất thành bất kì)
    ESP_offline : khi thiết bị (esp8266) mất mạng (offline) thì broker sẽ xuất bản
    1 tin nhắn vào topic này
    ESP8266_offline : Nội dung của tin nhắn offline

Sau khi kết nối thành công ở dòng 53 mình đăng kí topic IoT47_MQTT_Test và trong hàm loop xuất bản tin nhắn “Xin chao” vào chính topic IoT47_MQTT_Test .Như vậy chúng ta sẽ nhận lại được chính tin nhắn mà ta đã xuất bản !

Kết quả: Mình đã nhận được chính tin nhắn mà mình xuất bản lên

Thiết kế giao diện web gửi tin nhắn cho ESP8266

Để có thể kết nối tới MQTT broker, mình sẽ sử dụng ngôn ngữ JavaScript và thư viện PahoMQTT

Các bạn tạo 1 file tên là index.html và thêm mã code web

  • Hàm makeID có nhiệm vụ tạo ra 1 id ngẫu nhiên để web kết nối tới MQTT broker tránh bị trùng id
  • Mình sẽ kết nối vào broker.hivemq.com qua cổng 8000 vì cổng 8000 là cổng dành cho các kết nối thông qua Socket, trong khi cổng 1883 dành cho các kết nối qua TCP
  • Hàm public dùng để xuất bản 1 tín nhắn tới 1 topic nào dó
  • Hàm client.subscribe dùng để đăng kí nhận tin nhắn từ 1 topic nào đó
  • Hàm onMessageArrived là hàm callback khi có 1 tin nhắn từ 1 topic đã đăng kí gửi tới

Mình sẻ lưu lại và mở file này bằng trình duyệt, sau đó ấn F12 để xem dữ liệu debug in ra màn hình console

Các bạn có thể thấy sau khi thông báo Connect OK thì chúng ta đã nhận được tin nhắn “Xin chao !” mà esp8266 liên tục gửi lên mỗi 500 mili giây

Cũng trong màn hình debug, mình gõ hàm public để gửi thử dữ liệu đến esp8266 nhé !

Gọi hàm public gửi dữ liệu
ESP8266 đã nhận được tin nhắn xin chào

Thiết kế giao diện nút nhấn điều khiển thiết bị

Chúng ta sẽ tận dùng lại giao diện dã xài ở bài 5 nhé

Demo MQTT

Điều khiển thiết bị qua WIFI - MQTT

Tin nhắn từ esp8266: ...

Khi ấn nút ( sự kiện OnClick) mình sẽ cho xuất bản tin nhắn tương ứng tới ESP8266 qua topic ESP8266_read_data. Do vậy ở code esp8266 mình sẽ sửa lại code cho nó đăng kí vào topic ESP8266_read_data và cho web đăng kí vào kênh ESP8266_sent_data để nhận tin nhắn esp8266 gửi lên

Sửa lại topic đăng kí của esp8266 thành ESP8266_read_data

Mình cũng thêm đoạn mã đọc data tử cổng Serial để gửi lên cho web

Full code cho esp8266

Demo kết quả

 

Từ tác giả:

Có rất nhiều bạn inbox trực tiếp cho mình để hỏi các vấn đề giống nhau, các bạn vui lòng để lại thắc mắc dưới phần bình luận, mình sẽ phản hồi trong vòng 24h. Điều này sẽ giúp những người cùng thắc mắc có thể tự đọc, tìm hiểu mà không cần mất công hỏi lại mình. Like và comment cũng là một cách rất tốt để Google đánh giá cao bài viết và cho hiển thị lên thanh tìm kiếm, điều này sẽ giúp các bài viết tiếp cận được những người cần đến nó !

Nếu thấy các bài viết thật sự có ích đối với bạn, các bạn có thể donate cho mình tại tài khoản:

Giới thiệu Đào Nguyện 28 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

Hãy bình luận đầu tiên

Để lại comment nếu có thắc mắc, mình sẽ phản hồi trong 24h