[Espruino] 와이파이 안정화 Tips-wlan.reconnect 앞에서clearInterval과clearTimeout

11410 단어 JavaScriptEspruino
에스프리노에는 CC3000을 사용해 와이파이를 통해 센서 정보를 클라우드로 날릴 수 있지만, 이렇게 실제 서비스를 활용하면 안정화에 벽에 부딪힐 수 있다고 본다.이번 내용은'안정화'를 목표로 주의해야 할 요점이다.

Tips


WiFi에 연결하기 위해서 wlan.connect / wlan.reconnect 호출하기 전에 clearInterval 과 {clearTimeout '을 호출해서 정해진 비동기 처리를 실행하지 않는 것이 좋습니다.

해설


WiFi 연결 시 매혹적인 행동


Espruino &CC3000,wlan.connect/wlan.reconnect 방법으로 진행된 와이파이 연결 처리로 다른 비동기적인 운행을 막는 시한적 처리setTimeout,setInterval 등이 있음을 알아차렸다.와이파이에 연결되는 동안setTimeoutsetInterval 처리를 수행하지 않는다는 것이다.
이렇다면 특별히 주의할 필요가 없다. 일일이 clearInterval,clearTimeout 등은 하지 않지만, 다양한 활용에서 두 가지 번거로운 행동을 발견했다.어찌 그 짓이냐?
  • WiFi 연결에서 실행되어야 하는setInterval 처리는 모두 겹쳐서 연결이 끝난 후 정시에 단숨에 실행해야 한다
  • 와이파이 연결 처리 중 setTimeout의 귀속을 사용하는 정시 처리를 시도할 때 와이파이 연결이 끝난 후에 대량의 귀속 처리를 호출합니다.
  • 잘 모르기 때문에 자세히 알고 싶지 않은 사람은 먼저 제목대로 wlan.connect() , wlan.reconnect()할 때clearInterval()clearTimeout()만 기억하면 된다.
    이어 수수께끼 행동과 검증 결과를 상세히 설명한다.

    수수께끼 행동 1


    WiFi 연결에서 수행해야 할 처리setInterval를 모두 스택하여 연결이 완료된 시점에 한 번에 수행합니다.
    구체적인 예를 들다
    예를 들어 setInterval 1초 간격으로 처리를 실행한다a.이때 실행wlan.reconnect()하면 Espruino에서 처리가 모두 멈춘 것 같습니다.여기까지는 평범한 행동이었다.그러나 5~10초 후 WiFin과 연결하는 동시setInterval에 설치된 처리a는 같은 시간에 5차례 정도 실행됐다.다음은 검증 절차와 결과입니다.

    검증 프로그램


    WebIDE를 통해 다음 프로그램을 실행하고 1초마다 콘솔에서 수치를 계산합니다다음은 Espruino 시작 후 시간(초)입니다.
    
    /** WiFi 接続情報 */
    var wifiConfig = {
      ssid: "BCW710J-83EEA-G",
      key: "d5433a48fe448"
    };
    
    /** getTime()の少数を切った値を返す */
    function getTimeSec(){
      return Math.floor( getTime()  );
    }
    
    /* 
     * 1秒に1ずつカウントアップする
     * setIntervalの再帰で実装
     */
    function intervalCount( ){
      var cnt = 0;
      setInterval( function(){
        console.log( cnt++ + "@" + getTimeSec() );
      } , 1000);
    }
    
    
    var wlan = require("CC3000").connect();
    
    /**
     * WiFi接続処理
     */
    function execConnect(){ 
      wlan.connect( wifiConfig.ssid, wifiConfig.key, function (s) {
        if (s=="dhcp") {
          console.log("connected@" + getTimeSec() );
        }
      });
    }
    
    execConnect();   /* wifi 接続を実行 */
    intervalCount(); /* setIntervalによるカウントアップを開始 */
    
    
    계수가 계산되는 동안 WebIDE 왼쪽에 있는 콘솔에서 실행해 보십시오wlan.reconnect().

    Wifi 연결이 완료되면 카운트는 한 번에 5개 정도 진행됩니다.주의해야 할 것은 이때@ 이하의 값은 일정한 간격으로 실행하고자 하는 처리를 동시에 집행했다.

    문제의 소재


    예를 들어 이setInterval에 설정된 처리는 ping 역할을 하며, 센서http의 요청을 서버에 전달하는 데 사용되는 상황에서 와이파이와 다시 연결하는 순간 많은 요청을 보내려고 시도하여 와이파이 모듈이 다시 떨어졌다.이외에도 setInterval에 설치된 처리가 여러 개인 경우 병렬로 주행하면 좋지 않은 처리를 초래할 수 있다는 점도 문제가 된다.
    즉, reconnect/connect 이전에clear Interval을 하는 것이 좋다.

    수수께끼 행동 2


    WiFi 연결 처리에서 setTimeout의 귀속 시간 처리를 실행하려고 시도할 때, Wifi 연결이 끝난 후에 대량의 귀속 처리를 호출합니다.
    이거 실제로 해보세요.대단한 일이 될 거야.재현성도 100% 이거!찾지 못했지만 상당한 고민 때문에 주제에서 벗어난 내용은 아닌 것 같다.

    검증 프로그램


    WebIDE를 통해 다음 프로그램을 실행하면 콘솔에서 1초마다 숫자를 계산합니다.이번 처리는 set Timeout의 귀속 실시이다다음은 Espruino 시작 후 시간(초)입니다.
    
    /** WiFi 接続情報 */
    var wifiConfig = {
      ssid: "XXXXXXXXXXXXXX",
      key: "XXXXXXXXXXXXXX"
    };
    
    /** getTime()の少数を切った値を返す */
    function getTimeSec(){ 
      return Math.floor( getTime()  );
    }
    
    /* 
     * 1秒に1ずつカウントアップする
     * SetTimeoutの再帰で実装
     */
    function timerCount( cnt ){ 
      var timer = function( count ){
        setTimeout(function(){
          console.log(count + "@" + getTimeSec() );
          timer( ++count );
        }, 1000);
      };
      timer( cnt );
    }
    
    /**
     * WiFi接続を実行
     */
    function execConnect(){ 
      wlan.connect( wifiConfig.ssid, wifiConfig.key, function (s) {
        if (s=="dhcp") {
          console.log("connected@" + getTimeSec() );
        }
      });
    }
    
    
    var wlan = require("CC3000").connect();
    
    execConnect(); /* コネクション確立 */
    timerCount(0); /* 0からカウント開始 */
    
    
    계수가 계산되는 동안 WebIDE 왼쪽에 있는 콘솔에서 실행해 보십시오wlan.reconnect().

    나는 와이파이 연결이 성공할 때 톤이 아닌 일이 발생할 것이라고 생각한다.센 대로 세어 보아라.부하를 늘리는 처리라면 귀찮을 거예요.

    왜 문제야


    잘 아시네요.반드시 clearTimeout를 실행하거나 순환 중setTimeout의 회귀를 사용하지 말아야 한다.
    덧붙여 Espruino의 사활 감시용 핑 요청, 두 센서의 값의POST, 계산 처리는 모두 set Timeout의 회귀로 이루어졌고 와이파이가 다시 시작되는 순간 와이파이가 다시 떨어지면서 고통스러웠다.처리 내용은 http에서 그에 상응하는 시간을 들여 처리해 달라고 요청하기 때문에 추월 상황이 발생하지 않도록 고려하면 원수가 될 것 같다.


    advent 달력 마지막 날 보도이기 때문에 센서 장치 같은 서비스를 고려하면 범위가 넓어집니다!이런 구수한 기사를 쓰려고 했는데 막상 중간에 빠져나온 곳도 있고 무슨 말을 해도 보기 싫어서 포기했어요.다양한 시도의 오류를 겪으면서 재밌는 것들을 잘 보여줄 타이밍에 의기양양한 표정으로 쓰고 싶다.감사합니다.

    좋은 웹페이지 즐겨찾기