2012-12-26 2 views
2

클라이언트가 로컬 DB에 보낸 메시지를 유지할 MQTT 서버를 설정하려고합니다. 각 메시지에는 수신 된 클라이언트가 각 메시지 (QOS = 1)에 대해 puback을 반환 할 때 반전시키고 자하는 "성공적으로 수신 된"플래그가 있습니다.MQTT : puback이 어떤 메시지인지 알 수있는 방법은 무엇입니까?

질문 : 내가 메시지를 게시 할 때

는 서버가 제대로 수신 클라이언트에서 다시 puback를받습니다. 그러나 messageId는 클라이언트의 패킷을 게시하는 것과 다릅니다. 나는 이것이 의도 된 것임을 안다. 그렇지만 DB에서 올바른 메시지를 찾아 플래그를 넘길 수는 없습니다. 클라이언트 A가 클라이언트 B에게 QOS = 1 인 2 개의 메시지를 연속적으로 보내는 경우 어떻게됩니까? 서버는 2 개의 puback을 어떻게 구별합니까?

아마도 MQTT 클라이언트는 내가 누락 된 messageIds를 맵핑하기 위해 마술처럼 행동하고있을 것입니다.

mqttjs 및 paho mqttv3 btw를 사용하고 있습니다.

+1

문제를 파악했습니다. 분명히 MQTT 서버에서 공개중인 메시지에 특별히 messageId를 지정해야합니다. 그렇지 않으면 임의 번호가 사용되며 puback의 messageId가 server.messageId와 다른 서버로 다시 전송됩니다. 특별히 메시지 ID를 부여한 후, puback의 messageId는 게시 할 때 지정한 messageId와 동일합니다. 이것이 의도 된 것입니까? – asonofdevily

답변

4

QoS 1 또는 2를 사용하는 MQTT PUBLISH 메시지에는 패킷의 일부로 메시지 ID가 필요합니다. 메시지 ID는 PUBACK (또는 QoS 2에 대한 PUBREC/PUBREL/PUBCOMP)이 참조하는 메시지를 식별하는 데 사용됩니다. 한 번에 여러 메시지를 "비행 중"으로 볼 수 있기 때문에 이것은 중요한 기능입니다.

누락 된 중요한 점은 클라이언트가 서로 완전히 별개라는 것입니다. 즉, 메시지 ID는 클라이언트 (브로커에서 클라이언트 또는 브로커에서 클라이언트로의 메시지 흐름 방향)에 고유합니다. 브로커는 브로커에서 생성 된 메시지에 대한 메시지 ID를 생성하고 클라이언트는 클라이언트에서 생성 된 메시지에 대한 메시지 ID를 생성합니다. 메시지 ID는 각 방향에 대해 독립적이므로 브로커와 클라이언트가 상대방의 작업을 추적 할 필요가 없습니다.

모든 수신 클라이언트로 전송 된 수신 메시지를 추적하려면 수신 메시지와 관련된 보내는 메시지를 추적하고 모든 PUBACK이 수신 된 후에 만 ​​DB를 트리거해야합니다 그 보내는 메시지들. 그러면 메시지 수신시 구독 된 모든 클라이언트에 어떤 메시지가 성공적으로 전송되었는지 알려줍니다.

브로커로 전송 된 모든 메시지의 로그를 원하고 전송이 정상적으로 작동한다고 가정 할 수 있다면 인생은 훨씬 쉬워집니다. 브로커 호스트에서 "#"주제 또는 원하는 내용을 청취하는 클라이언트를 작성한 다음 클라이언트 on_message() 콜백 (또는 라이브러리가 관리함)을 사용하여 메시지를 처리하고 DB에 저장하십시오 .

+0

예, 각 메시지에 대한 레코드를 클라이언트에 저장합니다. QOS 1 및 2에 대해 messageId가 필요합니다. messageId가 지정되지 않은 경우 사용자를 catch/통지하는 것이 더 좋지 않습니까? 어떻게 든 푸ack이 돌려 보낸 임의의 숫자를 할당하는 대신에 사용하지 않습니다. – asonofdevily

+0

나는 프로토콜 자체에 대해 말하고 있는데, 나는 Paho 라이브러리가 어떻게 작동하는지에 대해 정말로 언급 할 수 없다. – ralight

관련 문제