왜 제가 MQTTX로 테스트할 때 구독은 되는데, 메시지를 게시하려고 다시 연결하면 메시지가 발행되지 않나요? 이미 연결된 상태인데도 메시지 기록이 없습니다.

어떤 플랫폼을 사용하셨나요?

문제를 좀 더 자세히 설명해 주세요! 어떤 환경과 플랫폼에서, 어떤 작업을 수행했으며, 어떤 현상이 나타났고, 목적은 무엇인가요?

, OneNET 클라우드 플랫폼을 사용하고 있으며, 현재 MQTTX와 클라우드 플랫폼 간의 데이터 통신을 구현하려고 합니다. 일반적으로 토픽을 구독한 후, 이 MQTTX에서 메시지를 게시하면 응답이 정상 또는 오류로 돌아와야 합니다. 그러나 메시지를 게시한 후에는 기기 재연결 및 연결 성공만 표시됩니다. 기기 연결에 문제는 없는 것으로 보이는데, 응답이 없으면 구독에 문제가 있는 것인지요? 하지만 저는 정상적인 절차에 따라 모두 수행하였습니다.

MQTTX를 사용하여 OneNET 물리 모델 통신을 시뮬레이션할 때 매우 전형적인 문제를 겪고 계신 것 같습니다. “메시지를 게시하자마자 재연결이 발생하고, 클라우드에 기록이 남지 않는다” 는 현상 말입니다.

이 문제는 일반적으로 네트워크 상태가 좋지 않아서 발생하는 것이 아니라, OneNET 서버가 수신한 메시지 패킷이 프로토콜 사양 또는 물리 모델 정의 와 맞지 않을 경우 서버 보호를 위해 연결을 강제로 끊기 때문입니다.

다음의 핵심 원인들부터 점검해보세요:

1. 물리 모델 식별자(Identifier) 불일치

OneNET의 물리 모델은 JSON 데이터 내 params 필드에 대해 매우 엄격한 검사를 수행합니다.

  • 점검: 클라우드에서 정의한 속성 식별자가 정말로 air_CO2air_humidity인지 확인하세요.
  • 주의: 식별자는 대소문자를 구분합니다. 예를 들어 클라우드에서 Air_CO2로 정의했는데, 클라이언트에서 air_CO2로 전송하면 OneNET은 이를 무효한 데이터로 간주하고 연결을 강제 종료합니다.

2. JSON 형식 및 데이터 타입 오류

스크린샷을 보면 JSON 구조는 대체로 올바르지만 한 가지 세부 사항이 있습니다:

  • 숫자 데이터 타입: value 뒤에 있는 값 \"500\"은 따옴표로 묶여 있어 문자열(string)입니다. 만약 OneNET 클라우드에서 air_CO2int 또는 float 타입으로 정의했다면, 여기에는 따옴표를 붙이면 안 됩니다.
  • 수정 제안:
    "air_CO2": {
        "value": 500,  // 따옴표 제거
        "time": 1706673129818 
    }
    

3. 시간 스탬프(timestamp)가 지나치게 오래됨

전송한 메시지의 time 값은 1706673129818이며, 이는 2024년 1월에 해당합니다.

  • 위험 요소: 일부 플랫폼은 과거 데이터를 허용하지만, 현재 서버 시간(2026년)과 너무 큰 차이가 나면 플랫폼의 보안 검사나 데이터 필터링 메커니즘이 작동할 수 있습니다.
  • 테스트 방법: time 필드를 아예 삭제하거나, 현재 시간 스탬프로 업데이트해보세요. OneNET은 기본적으로 메시지 도착 시점을 기준으로 자동 처리합니다.

4. 응답 토픽(post_reply) 미구독

"응답이 없는데 구독에 문제가 있는 건가요?"라고 하셨는데, OneNET 물리 모델 프로토콜에서는 다음과 같습니다:

  • 클라이언트가 게시하는 토픽: $sys/{pid}/{device-name}/thing/property/post
  • 클라우드의 응답 토픽: $sys/{pid}/{device-name}/thing/property/post_reply
  • 해결 방법: MQTTX에서 반드시 “New Subscription” 버튼을 눌러 _reply가 포함된 이 토픽을 미리 구독해야 합니다. 구독하지 않으면 클라우드에서 요청 처리 후 성공 여부나 오류 코드를 받을 수 없습니다.

5. OneNET 플랫폼 로그 확인

두 번째 이미지에서 "이벤트 기록"이 비어 있습니다. 이 경우 “작업 로그(Operation Log)” 또는 “장치 디버깅(Device Debugging)” 메뉴에서 실시간 로그를 확인해보세요.

연결은 되었으나 게시 실패 시, OneNET 작업 로그에는 일반적으로 구체적인 오류 코드(예: 데이터 형식 파싱 실패 등)가 기록됩니다.


:light_bulb: 권장되는 테스트 단계:

  1. 메시지 간소화: 하나의 가장 간단한 속성만 전송하고, 시간 스탬프를 제거하며, 숫자값의 따옴표도 제거하세요.
    {
      "id": "123",
      "version": "1.0",
      "params": {
        "air_CO2": {
          "value": 500
        }
      }
    }
    
  2. Reply 토픽 구독: 게시 전에 반드시 $sys/24A1J1S6kn/dev1/thing/property/post_reply 토픽을 구독하세요.
  3. 연결 끊김 순간 관찰: 전송 버튼을 누르는 순간 MQTTX 상단 오른쪽이 빨간색으로 바뀐다면, 100% Payload(전달 데이터) 형식이 OneNET 물리 모델 요구사항과 맞지 않다는 의미입니다.

좋아요, 감사합니다. 내일 다시 시도해 보겠습니다. :hand_with_index_finger_and_thumb_crossed: