送信Queueとタイムスタンプ

OS7以降

データは通常リアルタイムに即時インターネットに対して送信されます。

しかし、送信キューを有効にすることで

  • 即座ではなくあるデータを程度ひとまとまりにして送信することでパケットを削減する
  • 送信するすべてのデータに時刻情報をつけることで正確な時間を把握する
  • オフラインの期間に受け取ったデータを貯めておいて送信する

といった動作が可能となります。

obniz.setQueueMode({ timestamp, interval })

intervalで0より大きな数字を指定することで即時送信ではなくなります。

obnizOSは内部に送信Queueが存在しており可能な限り即時送信を行いますが、例えばintervalに10秒を指定した場合は10秒ごとか、またはQueueが一杯になるまではデータを送信せずに蓄積します。

Note: Queueはデータだけでなくコマンドの応答などすべてのクラウドに送られるデータが含まれます。期待しない部分も動作が遅くなる可能性があります。

Queueを利用すると、クラウド側で受け取ったデータがいつのデータかわかりにくくなります。そこで、timestampを指定することで各データに時刻を追加することができます。受け取った時刻はobniz.deviceTimestampを呼び出すことでデータ受信時に参照することができます。obniz.deviceTimestampはsecondsでもmillisecondsであってもDate.now()と同じくunixtimestamp(ミリ秒)が挿入されます。

Note: obniz.deviceTimestampは受け取ったときにのみ有効です。async/awaitなどで遅延した場合には次のデータの時刻が入力されます。

Key Type Default Value
timestamp string 'none' 'none' 'unix_seconds' 'unix_milliseconds'から選択。none以外では各送信データに時刻が付与されます。secondsの場合は4バイトの時刻、millisecondsなら8バイトの時刻が追加されます。
interval number 0 送信間隔(ミリ秒)
// Javascript Example
  obniz.setClock(); // set current time to obniz
  
  obniz.setQueueMode({
    timestamp: 'none',
    interval: 0 // No Delay and No Timestamp.
  });

  await obniz.ble!.initWait();
  obniz.ble!.scan.onfind = (peripheral) => {
    console.log(obniz.deviceTimestamp);
    console.log(peripheral.address);
  }
  await obniz.ble!.scan.startWait(null, { duration: null, duplicate: true });

  obniz.setQueueMode({
    timestamp: 'unix_seconds',
    interval: 10 * 1000 // every 10 seconds or until buffer acceptable data will be stored with timestamp.
  });

obniz.setClock();

端末の時計は自動では同期されないため時刻情報を送信する必要があります。
以下の方法で送信可能です。

  • obniz.pingWait()を呼ぶ
  • obniz.setClock()を呼ぶ

いずれでも現在時刻が端末に送信され時計が調整されます。

// Javascript Example
  obniz.setClock(); // set current time to obniz