2017-02-12 12 views
0

통신용 MQTT가 필요한 .NET IoT 프로젝트를 빌드 중입니다. 브로커의 경우 GnatMQ을 사용하고 클라이언트의 경우 MqttDotNet (모바일 호환성)을 사용합니다. 클라이언트 라이브러리는 메시지를 올바르게 작성, 연결 및 전송하지만 클라이언트의 PublishArrivedDelegate (메시지 수신 이벤트)이 트리거 될 때마다 오류가 발생합니다.MqttDotNet의 ProcessReceivedMessage 오류

표준 수신 메시지뿐만 아니라 보관 된 메시지에서도 오류가 발생합니다. MqttDotNet 오류 로그는 here입니다.

콘솔 출력 : enter image description here

이 오류가 라인 (91)에 QoSManager.cs에서 캡처 한 것 같다 :

else if (mess.QualityOfService == QoS.OnceAndOnceOnly) 
{ 
    _responses.Add(mess.MessageID, new MqttPubrelMessage(mess.MessageID)); 
} 

참고 : 나는없는 (있는 그대로) 원시 라이브러리를 사용하고 추가 된 코드.

누구든지이 라이브러리를 사용해 본 사람이 문제없이 제대로 작동하는지 확인할 수 있습니까? 그때까지, 나는 그것이 극단까지 디버깅하고 있다고 생각한다.

업데이트 1 : 오류 만의 QoS 레벨 2

요금으로 가입에 계속 2 오류가 지적했듯이, 해시 테이블에 추가되는 중복을 방지하기 위해 핸들을 추가로 방지 할 수있다 @hardillb에 의해. 그러나 이것이 실제 문제를 해결하지는 못합니다.

QOS 2를 사용하여 게시 및 구독 문제가 계속 발생합니다. 문제는 onClientPublishedArrived이 메시지가 수신 될 때마다 정확히 3 번 트리거되고 메시지가 수신 될 때 정확하게 2 번 트리거된다는 점입니다. 이 문제를 해결하기 위해 HiveMQ으로 테스트 할 때 문제가 해결되었습니다. 브로커 GnatMQ을 사용할 때만 문제가 지속됩니다.

+0

_responses 개체 란 무엇입니까? – hardillb

+0

@hardillb Hashtable 인스턴스의 이름입니다. – Jnr

+0

GnatMQ의 QOS2 구현이 깨져서 업데이트 된 것 같습니다. – hardillb

답변

0

복제 키를 Hashtable에 추가하려는 것처럼 보입니다.이 오류는 mess.MessageID이 여러 메시지에 대해 동일한 값을 반환하여 발생합니다.

C# 구현은 원래 값을 새 값으로 바꾸는 대신 예외를 throw하는 것처럼 보입니다.

해시 테이블에 고유 한 키가 필요하면 타임 스탬프와 같은 것을 사용할 수 있습니다.

+0

맞습니다. 중복 키가 추가되고 있지만 중복 키 중지가 추가 되어도 실제 문제는 해결되지 않습니다. 실제 "onClientPublishedArrived"이벤트 창은 게시 및 구독 QOS 2에서만 정확히 세 번 트리거합니다. – Jnr