切断とリセット

デバイスがインターネットから切断されたり、意図的にclose()関数を呼ぶことで通信は切断され、oncloseに指定した関数が呼ばれます。

切断後はデバイスに指示を送ることができませんが、デバイスとクラウドが自動的にリセット処理を行うようになっています。

デバイスがWi-Fiなどから切断された場合

デバイスの電源は正常なのに、ネットワークから切断されるとデバイスは自動的に「リセット」を行い、IOなどすべての状態が電源投入後と同じ状態に戻ります。その場合にリセットを行うのをやめさせてIOなどの状態を最後のまま維持する(highのioはそのままhigh)には接続後に以下のように設定しておくことで、デバイスはIOなどの状態を維持します。

接続されたディスプレイに表示したものをディスプレイをリセットせずに維持するといった用途に利用できます。

// Javascript Full Example

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function() {
  obniz.keepWorkingAtOffline(true);
}

IOなどはあくまで最後の状態を継続します。io.output(true)となっている場合は出力を続けますが

obniz.onconnect = async function() {
  obniz.keepWorkingAtOffline(true);
  var val = true;
  while(true) {
    obniz.io0.output(val);
    val = !val;
    await obniz.wait(1);
  }
}

このような場合、io0がfalseで停止するかtrueで停止するかは不明です。

obniz.jsなどクラウドとの接続が切断された場合

デバイス自体は正常にクラウドと通信しているのに、プログラムを動かしているブラウザを閉じたりnodejsのプログラムを止めた場合はobnizクラウドがデバイスに対してリセットを指示します。ただし、複数接続された状態で、まだ他のプログラムから接続がある場合はリセットは送信されません。この設定はオプションでオフにすることが可能です。オフにした場合はプログラムを終了したとしてもデバイスのIOなどは最後の状態のまま維持されます。

これを利用することでobniz.jsから必要なときにのみデバイスに接続し、表示を変えたりモーターを回したあとにobniz.jsのプログラムは停止する場合もデバイス側を最後の状態でキープさせることができます。

// Javascript Full Example

var obniz = new Obniz("OBNIZ_ID_HERE", { reset_obniz_on_ws_disconnection: false });
obniz.onconnect = async function() {

}

または以下のように接続後に設定を変更することも可能です。

// Javascript Full Example

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function() {
  obniz.resetOnDisconnect(false);
}

接続状態によるイベント駆動

obnizの接続状況に応じて、イベントの発火を受け取ることができます。

例えば、obnizを接続した際に発火されるconnectというイベントをon()関数で受け取り、それに応じた処理を実行できます。
同様にobnizの接続を切った際もcloseイベントをon()関数で受け取ることができます。

// Javascript Example

obniz.on('connect', async() => {
  console.log("a connect event occurred!");
  await obniz.wait(3000);
  obniz.close();
});

obniz.on('close', () => {
  console.log("a close event occurred!");
});

once()関数もリスナーとして使用することができます。on()関数は何度でもイベントを受け取って実行されるのに対し、once()関数は最初の1回目だけ実行されます。

// Javascript Example

let isConnectPhase = true;

setInterval(async() => {
  if(isConnectPhase){
    obniz.connect();
  }else{
    obniz.close();
  }
  isConnectPhase = !isConnectPhase
}, 3000);

obniz.once('connect', () => {
  console.log("a connect event occurred for the first time!");
});

obniz.on('connect', () => {
  console.log("a connect event occurred!");
});