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()によるクラウド接続の制御は、インターネット接続をご覧ください。