질문 | ESP8266 espconn_sent시 espconn_maxnum 에러가 발생합니다
페이지 정보
작성자 임상일 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일17-03-05 00:03 조회1,326회 댓글1건본문
1초마다 전력량을 자바 웹 서버로 올려주는데
처음엔 잘돌아가다가 하루정도지나면 espconn_maxnum (-7)에러가 espconn_sent 할때마다 발생되어 서버로 전송이 되지않습니다.
어떤 문제가 발생했을 가능성이있고 해결방법은 어떤 것이 있을까요
프로젝트 남은 기간이 얼마없어 빨리 문제를 해결야하는데 원인을 잘 모르겠네요..
문서에서는 sent_buffer 가 가득차서 발생하는 에러라고 나와있던데 tx queue buffer를 free해주는 함수도 없고.. 막막합니다 ㅜㅜ
* espconn_sent는 총 2개의 메세지를 서버에 올려주는데 사용합니다.
1. 전력량 미터링 전달 ( 1초마다)
2. 플러그 제어에 요청대한 응답결과 전달 ( 사용자가 앱에서 제어 )
// 서버에게 1초마다 전력량 미터링 데이터를 전달하는 타이머를 아래와 같이 사용중입니다.
#if 1
os_timer_disarm(&meter_timer);
os_timer_setfn(&meter_timer, (os_timer_func_t *)user_esp_platform_powermeter, pespconn);
os_timer_arm(&meter_timer, 1000,1);
#endif
// recv_cb함수에서 서버에서 플러그 제어 요청에 대한 메세지를 처리하고 응답을 다시 서버에게 전달합니다.
user_esp_platform_recv_cb(void *arg, char *pusrdata, unsigned short length)
// 전력량 미터링과 서버에서 요청한 제어 메세지에대한 응답을 아래 함수를 통해 서버에게 올려줍니다.
// 동일한 함수에서 espconn_sent를 수행합니다. (문제가 발생할 가능성이 있을까요?)
LOCAL void ICACHE_FLASH_ATTR
my_tcp_sent(char *pbuf,int length,int flag,int control){
sint8 result = espconn_sent(pespconn, pbuf,length);
if(flag == 0){ // 전력량 미터링데이터를 서버에 올려주는 경우
if(result == 0){
}else{
os_printf("%d metering tcp_sent result !!!!!!!!!!!!!!!!!!!!!",result);
}
}else{ // 제어요청에대한 응답메세지를 서버에 올려주는 경우
if(result == 0){
// 서버에게 tcp 메세지 전달이 잘되었으면 전원을 ON 또는 OFF 합니다.
GPIO_OUTPUT_SET(GPIO_ID_PIN(SENSOR_RELAY_IO_NUM), control);
}else{
// 서버에게 tcp 메세지가 잘 전달되지 않았을 경우 ON/OFF 메세지를 작성하고 전달합니다. (1번만 다시 전달)
if(control == 1){ // ON 메세지 다시전달
os_timer_disarm(&response_timer);
os_timer_setfn(&response_timer, (os_timer_func_t *)resent_response_on);
os_timer_arm(&response_timer, 2000, 0);
}else{ // OFF 메세지 다시전달
os_timer_disarm(&response_timer);
os_timer_setfn(&response_timer, (os_timer_func_t *)resent_response_off);
os_timer_arm(&response_timer, 2000, 0);
}
}
}
os_free(pbuf);
}
문서에보니 espconn_sent를 하기전 이전 패킷(pre pakcet)이 전송이 완료되어 sent_cb이 호출된 시점에서 espconn_sent 를 호출하라고 나와있던데 저는 os_timer 함수를 이용해서 1초마다 정해진 메세지를 던지기만하고 sent_cb가 호출되어진 것을 고려하지 않았는데 문제의 여지가 있을까요??
또
- 1초마다 미터링을 올려주는 espconn_sent 와
- 서버에서 플러그 제어 요청에대한 응답 espconn_sent가
동시에 호출되어 충돌될 가능성이 있을까요?
부탁드려요 ㅜㅜ
댓글목록
최고관리자님의 댓글

일단 동시 호출되지 않도록 해서 확인해 보셔야 할 것 같습니다. 네트웍 연결 상태에 따라 딜레이가 발생하면 충돌이나 지연으로 인해 오동작이 발생할 수 있을 것 같습니다. os_timer 외에 다른 스케쥴링 방법을 찾아보는 것도 좋을 것 같습니다. os_timer 의 callback이 네트워크 작업을 하는 것은 충돌로 인한 문제가 커질 수 있을 것 같아요.