Tại sao Mosquitto vẫn là “vua” trong các dự án IoT thực tế?
Khi triển khai Smart Home hay hệ thống cảm biến công nghiệp, bài toán khó nhất là kết nối hàng trăm thiết bị (ESP32, Raspberry Pi) mà không làm sập server. Sau hơn nửa năm vận hành hệ thống thực tế, mình vẫn chọn Mosquitto. Nó cực nhẹ. Một con VPS rẻ tiền nhất với 512MB RAM có thể xử lý mượt mà hơn 1.000 kết nối đồng thời trong khi chỉ chiếm chưa đầy 10MB tài nguyên.
MQTT hoạt động theo cơ chế Publish/Subscribe. Thay vì các thiết bị gọi trực tiếp cho nhau, chúng đẩy tin nhắn qua một trạm điều phối trung tâm là Broker. Mosquitto chính là trạm điều phối đó. Nó tuân thủ cực tốt các chuẩn MQTT từ v3.1 đến v5.0.
Mình từng “ăn hành” với lỗi mất gói tin (packet loss) vào giờ cao điểm. Khi đó, tin nhắn bị trễ hàng chục giây, thiết bị thì kết nối lại liên tục do cấu hình mặc định chưa tối ưu cho đường truyền kém. Bài hướng dẫn này sẽ giúp bạn đi tắt đón đầu, tránh những lỗi ngớ ngẩn đó ngay từ đầu.
Cài đặt Mosquitto trên Linux (Ubuntu/Debian)
Hầu hết các bản phân phối Linux hiện nay đều có sẵn Mosquitto. Mình sẽ thao tác trên Ubuntu 22.04, nhưng các dòng Debian hay Raspberry Pi OS cũng làm hoàn toàn tương tự.
Trước tiên, hãy làm sạch và cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y
Cài đặt Broker và gói Client (để test lệnh nhanh) chỉ bằng một dòng lệnh:
sudo apt install mosquitto mosquitto-clients -y
Sau khi cài xong, hãy kiểm tra xem service đã chạy chưa:
sudo systemctl status mosquitto
Nếu thấy dòng active (running) màu xanh là ổn. Nhưng khoan hãy dùng ngay. Từ phiên bản 2.0, Mosquitto cực kỳ khắt khe về bảo mật. Nếu bạn không cấu hình lại, các thiết bị bên ngoài sẽ không thể nào kết nối vào được.
Cấu hình bảo mật: Đóng các lỗ hổng nguy hiểm
Mặc định, Mosquitto chỉ cho phép kết nối từ localhost và không cần mật khẩu. Để dùng cho dự án thực tế, chúng ta cần mở cổng và đặt khóa cho nó.
1. Thiết lập Listener và xác thực
Đừng sửa file config tổng. Hãy tạo một file riêng trong conf.d để dễ quản lý và backup sau này.
sudo nano /etc/mosquitto/conf.d/default.conf
Dán nội dung cấu hình sau vào:
# Mở cổng 1883 cho mọi IP truy cập
listener 1883 0.0.0.0
# Bắt buộc phải có tài khoản mới được kết nối
allow_anonymous false
# Chỉ định file lưu trữ mật khẩu
password_file /etc/mosquitto/passwd
2. Quản lý tài khoản người dùng
Giờ hãy tạo user đầu tiên (ví dụ: admin_user). Hệ thống sẽ yêu cầu bạn nhập mật khẩu hai lần.
sudo mosquitto_passwd -c /etc/mosquitto/passwd admin_user
Lưu ý: Tham số -c sẽ xóa sạch các user cũ để tạo file mới. Nếu bạn muốn thêm user thứ hai, hãy bỏ -c đi để tránh mất dữ liệu.
3. Tối ưu Persistence (Lưu trữ trạng thái)
Để tin nhắn không bị mất khi server khởi động lại hoặc khi mạng chập chờn, hãy thêm các dòng sau vào cuối file default.conf:
persistence true
persistence_location /var/lib/mosquitto/
# Lưu dữ liệu xuống ổ cứng mỗi 30 phút
autosave_interval 1800
Khởi động lại để áp dụng mọi thay đổi:
sudo systemctl restart mosquitto
Kiểm tra hệ thống bằng lệnh thực tế
Để chắc chắn mọi thứ đã thông suốt, chúng ta sẽ giả lập một thiết bị gửi dữ liệu và một app nhận dữ liệu.
Nhận dữ liệu (Subscribe)
Mở một Terminal và treo lệnh này để chờ tin nhắn từ cảm biến phòng khách:
mosquitto_sub -h localhost -t "home/livingroom/temp" -u "admin_user" -P "your_password"
Gửi dữ liệu (Publish)
Mở Terminal thứ hai và bắn một gói tin giả lập nhiệt độ 28.5 độ C:
mosquitto_pub -h localhost -t "home/livingroom/temp" -m "28.5" -u "admin_user" -P "your_password"
Nếu Terminal thứ nhất hiện số 28.5 ngay lập tức, broker của bạn đã sẵn sàng trực chiến.
Kinh nghiệm vận hành và bảo mật nâng cao
Khi đưa hệ thống ra Internet, username/password là chưa đủ. Dữ liệu chạy qua cổng 1883 là dạng văn bản thuần túy (plain text), rất dễ bị đánh chặn.
- Triển khai SSL/TLS: Luôn dùng cổng 8883 kèm chứng chỉ Let’s Encrypt để mã hóa toàn bộ đường truyền.
- Sử dụng ACL (Access Control List): Phân quyền chi tiết. Đừng để một con cảm biến nhiệt độ có quyền gửi lệnh mở khóa cửa (topic
door/unlock). - Theo dõi sức khỏe (Monitoring): Subscribe vào topic
$SYS/broker/clients/connected. Nếu con số này nhảy vọt bất thường, có thể hệ thống đang bị tấn công DDoS hoặc thiết bị đang bị lỗi vòng lặp kết nối.
Làm chủ Mosquitto không khó, nhưng để nó chạy ổn định trong môi trường mạng thực tế đầy biến động lại là câu chuyện khác. Hy vọng những chia sẻ này giúp bạn xây dựng hệ thống IoT vững chắc hơn. Nếu gặp lỗi khi cấu hình SSL hay ACL, cứ để lại comment, mình sẽ hỗ trợ!

