Dùng nền tảng gì?
Mô tả chi tiết vấn đề hơn! Môi trường, nền tảng, đã thực hiện thao tác gì, xuất hiện hiện tượng gì, mục đích là gì
, sử dụng nền tảng đám mây Onenet, hiện tại muốn thực hiện việc truyền dữ liệu giữa mqttx và nền tảng đám mây. Sau khi đăng ký chủ đề bình thường, tôi đăng tin nhắn trên mqttx này, hệ thống nên phản hồi là thành công hay thất bại. Tuy nhiên sau khi đăng, lại hiển thị thiết bị đang kết nối lại, kết nối thành công. Như vậy kết nối thiết bị có vẻ không có vấn đề gì, nếu không phản hồi thì có phải là việc đăng ký chủ đề đã xảy ra lỗi không, nhưng tôi đều làm theo đúng thao tác thông thường mà.
Có vẻ như bạn đang gặp phải một vấn đề rất điển hình khi sử dụng MQTTX để mô phỏng giao tiếp mô hình thiết bị OneNET: “vừa phát hành tin nhắn là kết nối lại, và phía đám mây không ghi nhận dữ liệu”.
Thông thường, nguyên nhân không phải do mạng kém, mà là do máy chủ OneNET sau khi nhận được gói tin của bạn, phát hiện ra rằng gói tin này không tuân thủ quy chuẩn giao thức hoặc định nghĩa mô hình thiết bị, nên để bảo vệ máy chủ, nó đã thực hiện biện pháp “ngắt kết nối bắt buộc”.
Chúng ta có thể kiểm tra từ các nguyên nhân cốt lõi sau:
1. Định danh mô hình thiết bị (Identifier) không khớp
OneNET kiểm tra rất nghiêm ngặt trường params trong JSON.
- Kiểm tra: Hãy xác nhận xem định danh thuộc tính bạn khai báo trên nền tảng đám mây có đúng là
air_CO2vàair_humiditykhông? - Lưu ý: Định danh phân biệt chữ hoa/thường. Nếu bạn định nghĩa trên nền tảng là
Air_CO2, nhưng gửi xuống làair_CO2, OneNET sẽ coi đây là dữ liệu bất hợp lệ và ngắt kết nối thiết bị.
2. Định dạng JSON và kiểu dữ liệu
Từ ảnh chụp màn hình của bạn, cấu trúc JSON cơ bản là đúng, nhưng có một chi tiết nhỏ:
- Kiểu dữ liệu số: Giá trị
valuecủa bạn đi kèm chuỗi"500"(có dấu ngoặc kép). Nếu trên nền tảng OneNET, bạn định nghĩaair_CO2là kiểuinthoặcfloat, thì ở đây không được đặt trong dấu ngoặc kép. - Gợi ý sửa:
"air_CO2": { "value": 500, // Bỏ dấu ngoặc kép "time": 1706673129818 }
3. Thời gian (Timestamp) quá cũ
Trong gói tin bạn gửi, trường time là 1706673129818 (tương ứng tháng 1 năm 2024).
- Rủi ro: Mặc dù một số nền tảng cho phép truyền dữ liệu lịch sử, nhưng nếu thời gian gửi chênh lệch quá lớn so với thời gian hiện tại của máy chủ (năm 2026), có thể kích hoạt cơ chế kiểm tra an toàn hoặc bộ lọc dữ liệu của nền tảng.
- Thử nghiệm: Hãy thử xóa toàn bộ trường
time, hoặc cập nhật thành thời gian hiện tại. OneNET mặc định sẽ tự động lấy thời điểm gói tin đến làm thời gian chính xác.
4. Chưa đăng ký theo dõi chủ đề phản hồi (Post_reply)
Bạn nói: “Nếu không phản hồi có phải lỗi đăng ký không?”. Trong giao thức mô hình thiết bị OneNET:
- Chủ đề bạn đăng tải là:
$sys/{pid}/{device-name}/thing/property/post - Chủ đề phản hồi từ phía đám mây là:
$sys/{pid}/{device-name}/thing/property/post_reply - Giải pháp: Bạn cần nhấn vào "New Subscription" trong MQTTX để đăng ký trước chủ đề có đuôi
_reply. Chỉ khi đăng ký mới, sau khi nền tảng xử lý yêu cầu, bạn mới thấy được phản hồi (mã thành công hoặc mã lỗi) trong cửa sổ MQTTX.
5. Kiểm tra nhật ký (log) trên nền tảng OneNET
Ảnh thứ hai bạn cung cấp cho thấy phần “ghi chép sự kiện” trống rỗng. Gợi ý bạn hãy chuyển sang mục “Nhật ký thao tác” hoặc xem “Gỡ lỗi thiết bị” để theo dõi nhật ký thời gian thực.
Nếu kết nối thành công nhưng đăng tin thất bại, trong nhật ký thao tác của OneNET thường sẽ ghi rõ mã lỗi cụ thể (ví dụ: phân tích cú pháp dữ liệu thất bại).
Gợi ý các bước kiểm thử:
- Đơn giản hóa gói tin: Chỉ gửi một thuộc tính đơn giản nhất, bỏ thời gian, bỏ dấu ngoặc kép.
{ "id": "123", "version": "1.0", "params": { "air_CO2": { "value": 500 } } } - Đăng ký theo dõi Reply: Trước khi gửi, đảm bảo đã đăng ký chủ đề
$sys/24A1J1S6kn/dev1/thing/property/post_reply. - Quan sát khoảnh khắc mất kết nối: Nếu ngay khi nhấn gửi, góc trên bên phải MQTTX chuyển đỏ — chắc chắn 100% là Payload (dữ liệu tải) không đáp ứng yêu cầu về định dạng của mô hình thiết bị OneNET.
Được rồi, cảm ơn bạn, tôi sẽ thử lại vào ngày mai. ![]()


