[mqtt]트러블 슛팅:Client has exceeded timeout, disconnecting.

낭만개발자·2021년 1월 4일
0

mqtt

목록 보기
1/2

문제

mqtt broker에서
Client [esp32] has exceeded timeout, disconnecting.
에러 메시지 뜨면서 mqtt arduino 가 클라이언트인
(라이브러리 #include <PubSubClient.h>사용중)
소켓 통신이 죽음

해결


setKeepAlive(원하는 seconds)// default 15s
사용해서 keepAlive를 늘려서
mqttClient.loop();//데이터 전송 없더라도 ping request 해주므로 연결 유지시킴
가 40sec 안에 실행되도록 하니까 pingRequ..Pingres..
주고 받으면서 연결 유지 됨.

레퍼 API documnet : https://pubsubclient.knolleary.net/api#setKeepAlive

과정

Mqtt 통신에서 subscribe 해두고 아무도 publish가 없으니 keepAlive default인 15초 뒤에 Client [esp32] has exceeded timeout, disconnecting. 뜨면서 연결이 해제 되었다. 이거 잡으려고 몇시간 보냄

아마 소켓 통신이 연결 없으면 자동으로 죽는 구조인가 본데,, mqtt 데이터 올라오는게 없어도 계속 연결이 유지되길 원했고, client.loop()가 15s 안에 실행 되야 하는데 내가 다른 http통신을 하느라 15s를 넘기고 콜해서 계속 죽음.

따라서 keepAlive를 늘려야 할지, SocketTimeout을 늘려야지 할지 잘 몰랐는데 setSocketTimeout(60)를 줘봐도 socket error가 나는거였음. setKeepAlive(40)주니까 58s 정도 뒤에 recursive하게 pingRequest를 주면서 keepAlive 시키는거였음..

일단 mqtt는 (난 mosquitto Broker 사용중)
arduino PubSubClient.h 라이브러리에선 client.loop()
실행시켜서 데이터 전송이 없더라도 물고 있게 pingRequ.. 요청 주고, 15s 보다 더 걸리면 setKeepAlive()로 시간을 더 늘려준다..

문서 읽을게 많은데 읽고 틀린거나 보충 내용은 계속 수정..

참고
unix 서버 time dave convert to 시간/분 초로....
https://www.timestampconvert.com/?go2=true&offset=-9×tamp=1609318296&Submit=++++++Convert+to+Date++++++

엑셀 참고.
데이터 -> 텍스트 나누기 약간 우측 상단 보면 있는데
그걸로 tokenizer 가능하다

혹시 class PubSubClient' has no member named 'state #1 등등 라이브러리 얘가 member 가지지 못했다는 error 뜨고 document에는 수록되어있으면 library update 한다.

추후 node에서 사용할 mqtt

https://github.com/mqttjs/MQTT.js#mqttclientstreambuilder-options

mqtt 잘나온 자료

https://jeongchul.tistory.com/296

profile
낭만닥터와 슬의를 보고 저런 개발자가 되어야 겠다고 꿈꿔봅니다.

0개의 댓글