아두이노에서 MQTT 접속이 끊어지면 Nodejs 서버가 멈추는 에러

20.03.06 13:33 작성 조회수 259

0

안녕하세요 선생님

좋은 강의 덕분에 공부가 많이 되고 있습니다. 많은 도움 주셔서 감사합니다.

수업을 통해서 Wemos -> Mqtt->Nodejs->Mongodb까지 데이타가 날라가는 것을 구현을 했습니다. 그런데
다음과 같은 에러현상이 있어서 문의드리고자 합니다.

1. Wemos(아두이노)가 MQTT에 접속하여 정상적으로 센서값을 전송하다가 MQTT와 접속이 한번씩 끊어집니다.
-> 해결을 위해 구글 검색해서 아두이노 루프문에 mqtt 재접속 함수(그림3)를 만들고 호출해주었습니다. 재접속되서 다시 MQTT에 센서 측정값을 쏴주고 mqtt의 cmd 창에서는 data가 잘 들어오고 있습니다.

2.  그런데 위 현상이 발생하면 Nodejs 가  첨부와 같은 에러 메세지가 나오면서 정지합니다.
    (에러코드와 메세지는 사진으로 첨부드립니다)
-> 이걸 해결해보려고 검색해서 테스트 해본 것은

1). Nodejs의 파일 모두에 //로 주석 단거는 다 옆이 아니라 위로 올리기
2). 아두이노의 PubsubClient.h파일에서 혹시 보내는 용량이 문제인가 해서
           #define MQTT_MAX_PACKET_SIZE 를 128에서 512로 수정

3). PubsubClient.h에서  keepAlive interval in Seconds를 10초로 수정
 4). www 파일 내부 곳곳에 console.log("position1"); 같은 flag를 달아서
       죽는 곳을 찾아보기 --> 죽기전에 위치 표시없이 에러나면서 끝나네요 ㅜ

                   

아직 해결을 못하고 있는데 혹시 선생님께서 이러 유사한 에러에 경험이 있으신지요.

제가 살펴볼만한 내용을 혹시 아시면 이야기 해주실 수 있을신지 궁금합니다.

매번 좋은 조언 감사합니다.

답변 2

·

답변을 작성해보세요.

0

highstar1님의 프로필

highstar1

질문자

2020.03.06

앗!  선생님이 해주신 말씀이 힌트가 되어서 왜 에러가 났는지 실마리를 발견했습니다. 좀 더 테스트 해보겠습니다

감사합니다.

0

열공하시는 군요~~
Node.js쪽에서 나는 에러는 아두이노에서 전달되는 센서데이터가 JSON형식이 아니기 때문에 나오는
에러인듯하는데 아두이노쪽에서 

 char message[64]="", pTmpBuf[50], pHumBuf[50];
 dtostrf(tmp, 5,2, pTmpBuf);
 dtostrf(hum, 5,2, pHumBuf);
 sprintf(message, "{\"tmp\":%s,\"hum\":%s}", pTmpBuf, pHumBuf);   
 mqttClient.publish("dht11", message); 

온습도를 저장하는 message변수를 JSON형태로 만들어주셨는지 체크해보시기 바랍니다.
(위 아두이노 소스코드에는 JSON형식으로 바꿔주는 부분이 없는 듯합니다.)
제가 제공하주는 소스로 여러 곳에서 실습을 했지만 끊기는 현상은 없었습니다.
다시한번 해보시고 질문주시기 바랍니다.~~