ウォッチドッグ

obnizOSには通信の死活監視(ウォッチドッグ)が搭載されています。サーバーとつながってデータを受け取っている状態を正常とし、一定時間通信がない場合は異常とみなして、Hang Detect. Rebooting...とログに出力し、端末を再起動します。

状態 通信がない場合に再起動するまでの時間
オンライン(サーバーと接続中) 3分。サーバーからデータを受け取るたびに自動でリセットされるため、何もする必要はありません。
未接続(オフライン、接続中、cloud.disconnect()で切断中) 10分

これはobnizOSの3段階の監視のうちの通信監視です。wdt.feed()が影響するのはこの通信監視だけです。ハードウェアWDTとタスク監視はOSが行います。異常検出とウォッチドックをご覧ください。

プラグインで意図的にオフラインを続ける場合、この再起動が問題になります。wdt.feed()を呼び、端末が正常に動作していることをOSに伝えてください。


wdt.feed()

通信の死活監視のタイマーをリセットします。OSは呼び出した時点を最後の通信とみなすため、再起動は上の表の時間だけ先に延びます。

引数と返り値はありません。

wdt.feed();
  • タイムアウトより短い間隔で定期的に呼んでください。たとえばon_offline_loop()の中で1秒に1回呼びます。
  • オンライン中は、サーバーとの通信でタイマーがリセットされます。オンライン中にwdt.feed()を呼ばないでください。接続が固まったとき、OSがそれを検知して再起動で復帰できなくなります。
  • netの関数は、ネットワークを待っている間に自動でタイマーをリセットします。そのため、長い転送で再起動することはありません。

Example: オフラインを保ち、10秒後に接続する

以下のプラグインは、起動時にクラウドとの接続を切り、オフラインを保ちます。オフラインの間は1秒ごとにwdt.feed()を呼び、オフラインになってから10秒後にクラウドへ接続します。obniz.jsからコマンドを受け取ると、再び切断します。

function on_event(event)
  if event == "power_on" then
    os.resetOnDisconnect(false); -- オフラインでもペリフェラルをリセットしない
    cloud.disconnect();
  elseif event == "online" then
    os.log(" - Lua Online");
  end
end

local lastTick = os.getTick();
local connecting = false;
local offlineTick = 0;

function on_offline_loop()
  -- オフラインの間、1秒ごとにウォッチドッグをリセットする
  if os.getTick() - lastTick > 1000 then
    lastTick = os.getTick();
    wdt.feed();
  end
  -- オフラインになってから10秒後にクラウドへ接続する
  if os.getTick() - offlineTick > 10 * 1000 and not connecting then
    cloud.connect();
    connecting = true;
  end
end

function on_command(command)
  cloud.disconnect();
  connecting = false;
  offlineTick = os.getTick();
end

⚠️ 注意

cloud.disconnect()とwdt.feed()の利用には十分注意してください。 Luaの書き方によっては、端末が永遠にオフラインのままになり、クラウドからスクリプトを更新できなくなる可能性があります。

以下のような処理を加えることを強く推奨します。

  • 起動後に一度はインターネットに接続する処理
  • 一定期間が経過したら、再びインターネットに接続する処理
  • 一定期間が経過したらwdt.feed()を呼ばなくなり、異常時にはOSが再起動できるようにする処理

cloud.connect()とcloud.disconnect()によるクラウド接続の制御は、インターネット接続をご覧ください。