インターネット接続

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()を呼び出さなくなるような処理