2016-07-10 3 views
0

mosquitto mqtt client를 사용하고 있습니다.사용자로부터 발생한 MQTT 게시 이벤트와 브로드 캐스트 전용 내부 메시지의 구분은 어떻게합니까

예를 들어, 주제를 게시하고 가입하는 사용자가 있습니다. 주제는 실제로 REsT 엔드 포인트와 관련됩니다.

시나리오 1 (일반 술집/하위 사용)

  1. 사용자 A는 주제/디바이스/123/메타
  2. 사용자 B를 구독에 일부 데이터를 게시 주제/디바이스/123/메타
    • 이 게시는 구독자에게 브로드 캐스트됩니다.
    • /devices/#에 가입 된 스크립트는 topic/device/123/meta에 대한 페이로드를 저장하는 방법을 알고 있습니다. publish'ed 데이터를받습니다. 이 데이터는 데이터베이스에 저장됩니다.

시나리오 2

  1. 사람은 REST 인터페이스를 통해 데이터/장치/123/메타를 업데이트 (또는 직접 DB 업데이트, 키는이 MQTT 게시 아니다)입니다.
    • 데이터베이스는 모든 가입자가 페이로드로 업데이트를 얻을 수 있도록 시나리오 2는 내가 마무리하기 위해 노력하고있어 무엇

MQTT 브로커로 전송됩니다

  • 가 메시지를 게시 업데이트됩니다 내 주위에 머리. 이것은 불쾌한 피드백 루프를 만듭니다. 내부 메시지가 브로드 캐스트되면 사용자의 게시 이벤트를 처리하는 스크립트는 제 3 자 사용자로부터 게시 된 게시 이벤트 또는 데이터를 저장하지 않고 일부 데이터 만 브로드 캐스팅하려는 내부 게시 이벤트를 구분할 수 없습니다.

    어떻게 처리해야합니까? MQTT 메시지는 매우 단순하며 논리를 기반으로 할 수있는 것이 아무것도 없습니다. 어떻게 든 원점을 사용하여 탐구하려하지만, 지금까지는 행운이 없습니다. 내가 플러그인을 작성할 수 있다는 것을 알았지 만, 이것이 모기에 대한 과업이다.

  • 답변

    2

    메시지가 순수 MQTT 프로토콜 레벨에서 구독자로부터 발생한 위치를 구별 할 수있는 방법이 없습니다. 게시/구독 프로토콜의 핵심은 게시자와 구독자를 분리하는 것입니다.

    이 작업을 수행하는 데 가장 유용한 방법은 실제 메시지 페이로드에 플래그를 추가하여 메시지가 실제 장치가 아닌 다른 곳에서 온 것임을 나타내는 것입니다.

    들어오는 메시지가 데이터베이스의 기존 상태와 일치 할 경우 들어오는 메시지가 실제로 데이터베이스 저장된 값을 변경하면 데이터베이스의 트리거가 트리거 검사를받으며 결과가 게시되고 있다고 가정하면 필요가 없습니다. 그것을 다시 게시하십시오.

    Mosquitto의 플러그인 메커니즘은 현재 인증 및 권한 부여 솔루션 작성 용이지만 자바 스크립트 mosca 또는 Java HiveMQ 중개인은 원하는 것을 수행 할 수있는 플러그인을 지원합니다.