待機とループ

待機

obnizデバイスに対して一定時間作業を停止させることができます。これにより接続してあるセンサーの処理をまったりすることができます。wait()関数ではデバイスに対してミリ秒で待機を指示し、同時に動作させている側のプログラムも同じだけ待機させます。

// Javascript Example

led.on();
await obniz.wait(1000); // led ON for 1sec.
led.off();

awaitを省くことでデバイスにだけ待機の指示を送り、プログラム側は動作を続けることができます。

// Javascript Example

var time = new Date();
led.on();
obniz.wait(1000); // led ON 1sec.
led.off();
console.log((new Date()).getTime() - time.getTime()) // 0 or very few ms. not 1000ms.

また、プログラム側のみ停止させる場合はsetTimeoutを活用します。

// Javascript Example

var time = new Date();
led.on();
await new Promise((resolve) => { setTimeout(resolve, 1000) });
led.off();

繰り返し

デバイスが接続中にある関数を繰り返し呼び出すにはobniz.onloopが便利です。
ここに設定された関数はデバイスがオンラインである限り繰り返し呼ばれます。

// Javascript Full Example

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.onloop = async function () {
    // called while online
  }
}

この関数は毎度pingWait()を内部で呼び出し、疎通確認と通信路に大量のbufferが貯まらないことを保証します。そのためより高速に繰り返し作業を行いたい場合はonloopを使わずにプログラムの中でループなど繰り返し処理することで実現できますが、以下の注意点があります

  • デバイスとの接続が切断されたらループを抜ける
  • スレッドが固まらないようにする

最も安全なループは以下のようになります。

// Javascript Example

while(obniz.connectionState === 'connected') {
  try {
    // 何か繰り返しやりたい作業をここに記載
    await obniz.pingWait(); // 通信を確認
  } catch(e) {
    // break or throw a error
  }
}

connectionStateはデバイスとの接続状態を表します。これが接続中の限り繰り返すようにします。
pingWait()はデバイスにデータを送りそれが帰ってくるまで待機する関数です。通信の確認とともにスレッドがフリーズしないようにし、かつデータが詰まったりしないように通信路を保つことができます。