Sử dụng giao thức MQTT để gửi dữ liệu từ ứng dụng Android
Ngày cập nhật: 2024-05-16 | Số lần xem: 2147 | Số chữ: 767 | Phân loại: Android
Tìm kiếm
Ứng dụng Android đọc dữ liệu vận hành từ thiết bị công nghiệp thông qua Bluetooth, sau đó truyền lên máy chủ bằng giao thức MQTT. Máy chủ sẽ chuyển tiếp dữ liệu này đến nền tảng đám mây của khách hàng.
- Thiết bị khách hàng sử dụng là một chiếc máy tính bảng chạy hệ điều hành HarmonyOS của Huawei, không phải phiên bản thuần khiết, vẫn có thể chạy ứng dụng được phát triển bằng Kotlin trên nền Android.
- Về phía máy chủ, đang sử dụng phần mềm EMQX – một broker MQTT mã nguồn mở.
Thư viện hỗ trợ MQTT bên thứ ba
Thư viện cuối cùng được chọn là:
Đây là dự án được phát triển và duy trì từ một thư viện cũ đã bị bỏ rơi:
Thư viện gốc của Eclipse hiện không còn được cập nhật nữa và không tương thích với các phiên bản Android mới nhất.
Lý do cụ thể bạn có thể
Do thư viện đầu tiên hoạt động tốt, chúng tôi chưa tiến hành kiểm tra phương án sử dụng HiveMQ MQTT Client. Theo thống kê trên GitHub, nhiều lập trình viên cũng đang dùng HiveMQ, và nó hoàn toàn tương thích với EMQX.
Tài liệu hướng dẫn của EMQX
EMQX có bài viết giới thiệu cách kết nối đến MQTT server của họ trên nền tảng Android bằng Kotlin:
Bài viết này được đăng năm 2020, tuy nhiên theo thử nghiệm thì vẫn khả thi nếu thay thế thư viện eclipse/paho.mqtt.android bằng hannesa2/paho.mqtt.android.
Lưu ý: Nên tham khảo tài liệu tiếng Trung vì bản tiếng Anh thiếu sót nhiều nội dung. Nếu tiếp tục sử dụng thư viện cũ, bạn sẽ gặp lỗi như:
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/content/LocalBroadcastManager
java.lang.SecurityException: Caller com.sunzhongwei.mqtt needs to hold android.permission.SCHEDULE_EXACT_ALARM to set exact alarms.
Và những vấn đề kiểu này sẽ không thể giải quyết triệt để.
Những khác biệt so với tài liệu
Thư viện paho.mqtt.android của tác giả hannesa2 có ít tài liệu hướng dẫn, nên chúng tôi đã phải tự tìm hiểu và thực hiện từng bước để hoàn thành việc cài đặt và kết nối.
Trong file settings.gradle
, thêm dòng sau:
|
|
Trong build.gradle
, thêm dependency:
|
|
Bạn chỉ cần một dependency duy nhất này, trong khi thư viện cũ yêu cầu thêm một service phụ thuộc khác của Android.
Trong file AndroidManifest.xml
, thêm quyền sau:
|
|
Không cần khai báo service trong phần <application>
nữa.
Dependency ‘androidx.work:work-runtime-ktx:2.9.0’ requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs. :app is currently compiled against android-33.
Bạn cần nâng cấp SDK từ 33 lên 34:
compileSdk 34
targetSdk 34
Phần code còn lại có thể làm theo tài liệu, không cần chỉnh sửa gì thêm.
Kiểm tra gửi tin nhắn (publish)
|
|
Bạn có thể thấy tin nhắn được hiển thị trên giao diện quản trị EMQX.
!Thông điệp hiển thị trên bảng điều khiển EMQX
Kiểm tra cơ chế heartbeat
Theo quan sát từ giao diện web EMQX, thời gian heartbeat mặc định là 60 giây.
Khi tắt ứng dụng về màn hình chính hoặc khóa màn hình, kết nối vẫn tồn tại, cho thấy rằng có một tác vụ định kỳ trong nền giữ kết nối MQTT.
Chỉ khi tắt Wifi, sau khoảng một phút mới thấy kết nối bị ngắt.
Mặc định không có chức năng kết nối lại tự động. Bạn cần cấu hình như sau:
|
|
Sau khi bật tùy chọn này, ứng dụng sẽ tự động cố gắng kết nối lại khi mạng trở lại bình thường.