Tại sao khi tôi dùng MQTTX để thử nghiệm, sau khi đăng ký chủ đề rồi muốn gửi tin nhắn thì phải kết nối lại, nhưng không thể gửi được tin nhắn mặc dù đã kết nối thành công, và cũng không có ghi nhận tin nhắn nào?

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_CO2air_humidity khô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ị value củ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ĩa air_CO2 là kiểu int hoặc float, 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 time1706673129818 (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).


:light_bulb: Gợi ý các bước kiểm thử:

  1. Đơ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
        }
      }
    }
    
  2. Đăng ký theo dõi Reply: Trước khi gửi, đảm bảo đã đăng ký chủ đề $sys/24A1J1S6kn/dev1/thing/property/post_reply.
  3. 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. :hand_with_index_finger_and_thumb_crossed: