?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문 | 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이 네트워크 작업을 하는 것은 충돌로 인한 문제가 커질 수 있을 것 같아요.