obnizOSは標準で起動後に保存されているネットワークに接続を試みて常時接続状態となるように動作します。
pluginでは接続状態の取得ができます。
また、pluginから接続を停止・許可することができるため、必要なデータが取得できるまでオンラインにならないような動作が可能です。
on_event
on_event()関数を設定することで、接続イベントごとに呼び出しが行われます。
| event | 意味 |
|---|---|
power_on |
電源が入ったときに一度だけ呼び出されます。 |
setting_mode |
接続ができなかったなどで設定モードとなったことを意味します。 |
connecting_to_network |
Wi-FiやLTE等を利用してネットワークに接続を試みています。 |
connecting_to_cloud |
ネットワークに接続ができたあとで、obnizCloudへの接続を試みています。 |
online |
obnizCloudとの接続が完了しました。 |
onlineのあとに接続が切れた場合には切れたのがTCPレイヤーなのか、それともWi-FiやLTEが切れたのかによってどこまで戻るかが変わります。
function on_event(event)
if event == "power_on" then
os.log(" - Lua PowerOn");
os.resetOnDisconnect(false);
os.log(" - No Reset On Disconnect");
elseif event == "setting_mode" then
elseif event == "connecting_to_network" then
elseif event == "connecting_to_cloud" then
elseif event == "online" then
os.log(" - Lua Online");
end
end
power_onについて
power_onとon_eventでないグローバル領域での動作は類似しています。
function on_event(event)
if event == "power_on" then
os.log(" - Lua PowerOn");
end
end
os.log(" - Lua Global");
しかし、以下の違いがあります。
| 場所 | 動作 |
|---|---|
| power_onイベント | 起動時に一度だけ呼び出されます。仮に起動後にLuaスクリプトを置き換えてobniz.plugin.realodLua()を呼び出しても実行されません。 |
| global | Lua Scriptが初めて実行されるときに実行されます。そのため、起動時だけでなくobniz.plugin.realodLua()を呼び出すことで再度呼び出されます。 |
そのため実際に一度しか動作を行いたくない場合にはpower_onを用意し、reloadを行ったときにも実行したい場合はglobal領域を活用するのがベストです。
cloud.connect() / disconnect()
通常はクラウドに対して自動的に接続を行いますが、plugin側から制御を行うことができます。
以下の例では、起動時にクラウドとの接続をオフとしています。
function on_event(event)
if event == "power_on" then
os.log(" - Lua PowerOn");
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()
if os.getTick() - lastTick > 1000 then
lastTick = os.getTick();
os.log("offline loop");
wdt.feed();
end
if os.getTick() - offlineTick > 10 * 1000 and not connecting then
os.log("connect to cloud");
cloud.connect();
connecting = true;
end
end
function on_command(command)
os.log("disconnect from cloud");
cloud.disconnect();
connecting = false;
offlineTick = os.getTick();
end
cloud.disconnect()を呼び出すことで接続を解除またはキャンセルできます。
ただし、タイミングによってはキャンセルできない場合があります。
os.resetOnDisconnect(false);
cloud.disconnect();
| タイミング | 動作 |
|---|---|
connecting_to_network呼び出し前 |
接続はトライすら行われません。 |
connecting_to_network呼び出し後からonlineまで |
止めることはできません。一度onlineとなったあとにキャンセルされます。 |
online後 |
切断処理が行われてオフラインとなります。 |
os.resetOnDisconnect(false)を利用することで、インターネット接続が切断された際にuartやspiなどがリセットされることを防ぎます。デフォルトでtrueとなっています。
クラウドとの接続管理やIOの制御をLuaから行う場合にはfalseとしたほうが不意のリセットを防ぐことができます。
offlineにおけるwdt()呼び出し
obnizOSでは死活監視機能が搭載されております。常にインターネットに繋がっており、データのやり取りがあることを正常とし、そうでない状態が続く場合には自動的に再起動となります。
これはpluginから接続をオフラインとする場合には不便な動作となります。
そこで、wdt.feed()を定期的に呼び出すことで、osが再起動することを防ぎます。
function on_offline_loop()
if os.getTick() - lastTick > 1000 then
lastTick = os.getTick();
os.log("offline loop");
wdt.feed();
end
end
cloud.disconnect()およびwdt.feed()の利用には十分注意してください。Luaの記載方法によっては永遠にクラウドに接続しなくなる可能性があります。
以下のような処理を加えることを強く推奨します。
- 起動後に一度はインターネットに繋がるような処理
- 一定期間経過したらインターネットに繋がるような処理
- 一定時間経過したら
wdt.feed()を呼び出さなくなるような処理