2017-12-13 58 views
1

저는 여기 Stackoverflow에서 새로운 질문을했습니다.Java에서 "org.eclipse.paho.client.mqttv3-1.2.0"라이브러리를 사용하면 한 번에 둘 이상의 MQTT 메시지를 가져올 수 있습니까?

두 개의 센서 (습도, 온도)가있는 ESP8266으로 IoT 기상 관측소를 만들고 파이에서 실행중인 브로커 (Mosquitto)에 데이터를 보내려고합니다. nodered를 사용하여 데이터를 가져오고 시각화하는 쉬운 방법 외에도 Java로 데스크톱 응용 프로그램을 프로그래밍하고 싶습니다.

"org.eclipse.paho.client.mqttv3-1.2.0"패키지를 사용하여 클라이언트를 만들고 메시지를 가져옵니다. 하나의 주제 (예 : '/ 테스트/온도')를 사용하면 온도 값을 쉽게받을 수 있습니다. 그러나 습도에 대해 두 번째 클라이언트를 추가하면 동시에 두 가지 클라이언트를 수신 할 수 없습니다. 두 클라이언트가 구현 될 때 나중에 호출되는 클라이언트는 값을 가져옵니다.

ESP8266에서 값을 약간 시간을 보내어 문제를 해결했습니다. 그러나 동시에 메시지를 가져 오는 방법이 있습니까? 나는 Threads에 대해 생각했지만 작동하지 않습니다.

누구나 이미 동일한 문제가 있었나요?

미리 감사 드리며 추가 질문이 있으시면 언제든지 알려주십시오.

건배.

로빈

+0

코딩 관련 질문이 없습니다. https://stackoverflow.com/help/how-to-ask를 참조하십시오. 잘 정의되고 잘 연구 된 코딩 문제가 필요합니다. 어느 쪽이 아닌가. https://arduino.stackexchange.com/ – dda

답변

0

먼저 주제 구조를 재고해야합니다. 그렇게 제한하지 마십시오. 집과 같은 주제를 할로윈에 사탕을 나누어줍니다. :)

robin/weather/ESP8266/temperature 
robin/weather/ESP8266/humidity 

상태 머신은 거의 아무것도 할 수 있습니다. 즉 Hashtable, 데이터베이스 등. 내역 데이터를 유지하려면 데이터베이스와 연결해야합니다. 즉 SQLite, Derby, H2 등입니다. Taro L. Saito에서 "sqlite-jdbc"드라이버를 사용합니다. JDBC 드라이버는 매우 잘 작동하며 코드를 SQLite 코드 기반과 동기화합니다.

기본 데이터베이스에는 온도 및 습도라는 두 개의 테이블이 있습니다. 클라이언트가 두 주제를 모두 구독하게하고 메시지가 도착하면 들어오는 값과 현재 날짜와 시간으로 적절한 테이블을 업데이트하십시오.

원하는 경우 테이블에서 3 번째 테이블 ('최근')을 만들 수 있으며 계속해서 교체되는 테이블에는 2 행 (현재 온도와 현재 습도 중 하나) 만있을 것입니다.

+0

영감을 얻어서 고맙습니다. DB에 대한 아이디어는 좋은 생각이지만, 두 주제에 모두 동의한다는 것은 무슨 뜻입니까? 실제로 예를 들어 구독 할 때 "/ robin/weather/ESP8266/#"MqttCallback에 의해 메시지는 단지 하나의 값을 제공합니다 ... – Robin

+0

토픽 shoud는 '/'로 시작하지 않습니다. 토픽 트리의 시작 부분에 null 요소를 추가합니다. – hardillb

+0

모든 콜백은 메시지가 게시 된 실제 토픽을 제공합니다. – hardillb

0

아니, 메시지 브로커에서 불러올 수 없습니다, 그들은 브로커 밀었다. 브로커는 메시지가 도착할 때 메시지를 푸시합니다. MQTT가 작동하는 방식 일뿐입니다.

이렇게하는 방법은 각 센서에 대한 마지막 값을 보유하는 상태 시스템을 유지하고이 값을 사용하여 한 값이 변경 될 때 출력을 업데이트하는 것입니다.