1. はじめに
ネットワーク接続が不安定な環境でもIoTデバイスを導入したい場面があります。
IoT-CoreエンジンNEQTOではExpressモードを使うことによって、ネットワーク接続がない場合でもあらかじめデバイスにダウンロードしておいたスクリプトを起動することが可能です。
2. Expressモードとは
Expressモードとはネットワーク接続がない環境でもデバイスにダウンロード済みのスクリプトの起動を可能にする機能です。
IoTデバイスはいつでも安定したネットワーク接続がある環境にあるとは限りません。不安定なネットワーク環境下でデバイスを起動させたい場合にExpressモードは有効です。
通常、NEQTOの起動動作ではスクリプトが起動するまでにネットワーク接続、認証およびスクリプトのダウンロードが必須です。Expressモードはこれらの必須条件をバイパスし、デバイスに保存されているスクリプトを起動することを可能とする機能です。

図1. Expressモード有効時の起動動作
通常の起動動作ではネットワーク接続が必須であり、ネットワーク接続ができない場合はリトライを繰り返すのでスクリプトを実行することができませんが、Expressモードを有効にしていると、ネットワーク接続ができない場合はデバイス内に保存されているダウンロード済みのスクリプトを起動することができます。
※ ネットワーク接続がある状態で起動したスクリプトは、スクリプト実行中にネットワーク接続が切れたとしてもネットワーク再接続が発生しない限り動作はします。ただ、ネットワーク再接続が発生する場合は、ネットワーク接続がない環境ではExpressモードにする必要があります。
3. Expressモードが有効なシチュエーション
Expressモードが有効なシチュエーションとしては通信環境が悪い、省電力やエネルギーハーベストが求められる環境が例として挙げられます。
通信環境が悪いというのは、例えば海上や地下など電波が届きづらい環境にデバイスが置かれる場合を考えます。Expressモードを利用していない場合、スクリプトを実行中に何らかの障害によってNEQTOデバイスの電源が落ちてしまったとき、スクリプトの再起動が必要です。
この際ネットワーク接続可能になるまで待たなければならず、その間のデータを取得できないことが起こり得ます。しかし、Expressモードを有効にすることでデバイス再起動後すぐにスクリプトを動作させ、データ取得を再開することができます。
省電力が求められる場合も同様です。例えば、太陽光発電のみでNEQTOデバイスを動作させるなど、デバイスへの電力供給が十分確保できない環境を考えます。常にデバイスを起動させておくと電力がすぐなくなってしまいます。そこでデバイスはスタンバイモード(参考: スタンバイモードの動作)にしておき、1時間に1回だけ起動しスクリプトを実行したいとします。

図2. スタンバイモードの動作
この1時間に1回だけ起動する場合、通常の起動動作から開始します。
この時、運悪くネットワーク接続ができないとネットワーク接続のステップで止まってしまい、スクリプトを実行できないのでデータの取得も行うことができません。またネットワーク接続ステップで止まると、圏外の場合再接続動作を繰り返すため太陽光発電で蓄電した電荷がなくなってシステムダウンする可能性もあります。Expressモードを有効にしていると、保存済みスクリプトをすぐに実行できるのでネットワーク接続の有無に左右されません。Expressモードが有効であればエネルギーハーベストシステムにも対応することができます。
※ スタンバイモードにはオフラインレジュームがあります。オフラインで保存済みスクリプトを実行できる点ではExpressモードと同じです。オフラインレジュームでは通信機能を要する機能を使えません。Expressモードではネットワーク接続待機時間が存在するため、ネットワーク接続ができた場合には通信機能を使うことができます。要件によって使い分けるのが良いでしょう。
4. Expressモードを有効化する方法
では実際にデバイスのExpressモードを有効化してみます。
ノード登録まで完了したデバイスを用意し、デバイスを NEQTO Console(以下Console)に疎通させます。
今回使用したデバイス、ファームウェアは以下です。
- デバイス: NEQTO Bridge Wi-Fi Module
- ボード: NEQTO Bridge Connector Board
- ファームウェア種類: NEQTO Bridge Wi-Fi
- ファームウェアバージョン: v02.00.01(執筆時の最新バージョン)
Consoleからノードの状態を確認するとExpressモードがDisabledになっています。

Expressモードの「設定」から有効化を押します。

リクエストが成功するとExpressモードのステータスがEnablingに変わりました。

指示に従ってノードの「再起動」コマンドを実行します。
これはExpressモードを有効にしたいというConsoleの命令をデバイスに認識させるために必要です。同様に「クライアントの証明書の再発行」コマンドでも動作します。


ターミナルソフトウェアの方でも再起動が確認できました。時間がかかるので完了まで数分待ちます。

無事に再起動が成功するとExpressモードがEnabledになっていることが確認できます。

これでデバイスのExpressモードが有効になりました。
次はExpressモードの挙動を確認したいと思います。
5. ExpressモードでLEDの点灯スクリプトを実行する
それでは、ドキュメントのサンプルスクリプトを使用してExpressモードを体感してみたいと思います。今回はLEDを1秒周期でON/OFFするスクリプトを使用します。
このスクリプトはTutorialのstep3にあるスクリプトです。step2までは各自で設定する必要があります。
//==============================================================
// Sample scenario
//==============================================================
// Turn the LED on and off with a timer.
//==============================================================
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
if(nqEx.getBoardType()) { //using IO board or Digital IO board
nqEx.enGPIO(true);
}
var gpioLED = new GPIO(15,5); //NODE1_IO5(OUT:PUSH-PULL)
gpioLED.setValue(0);
var timerInterval = 1000; //ms
var maxNumOfTimes = 30;
var loopcnt = 0;
var to = setInterval(function() {
var date = new Date();
if(++loopcnt >= maxNumOfTimes) {
print(date + '+' + date.getMilliseconds() + 'ms : finished');
clearInterval(to);
gpioLED.setValue(0);
nqEx.enGPIO(false);
} else {
print(date + '+' + date.getMilliseconds() + 'ms : ' + (maxNumOfTimes - loopcnt));
gpioLED.setValue(loopcnt & 1);
}
}, timerInterval);

図3. NEQTO Bridge+Connector BoardにおけるLEDの結線図
まずはTutorialに従ってネットワーク接続が可能な状態でスクリプトをダウンロードし、実行します。
Expressモードはデバイスに保存されているスクリプトを実行するためです。
1秒周期でLEDが点滅する様子が確認できると思います。
次にネットワークに接続できない環境を用意します。
今回は先ほどまで接続していたWi-Fiのパスワードを無効なものに変更することで再現しました。

ネットワーク接続がないので、デバイスのシステムL E D赤が点灯、システムLED青が点滅の状態になることを確認できます。(参考: トラブルシューティング)
通常、ネットワーク接続がないとスクリプトを実行することはできませんが、
Expressモードを有効にしておくと保存されたスクリプトが実行できます。
ターミナルソフトウェアでstartコマンドを打ってからほどなくして、以下のようにExpressモードが開始されました。

ネットワーク接続処理がタイムアウトになるまで30秒待ちます。
この値は変更が可能です(参考: ネットワーク接続待ちタイムアウト値)。
ネットワーク接続がある場合は通常動作と同じように最新が実行されます。
タイムアウトになったので認証などがバイパスされ、LEDが1秒周期で点灯し始めました。
ここまでで、Expressモードの動作を確かめることができました。
6. デバイス外部にデータ送信したい場合の注意点
IoTデバイスであるからには、センサーからデータを収集し、どこかデバイス外部にデータを送信したい場面があるでしょう。ここで外部にデータ送信するスクリプトを使用する際の注意点があります。
ネットワーク接続がない場合、外部にデータを送信することはできず、代わりにデバイスのストレージに保存してネットワーク接続があった場合に送信するように実装する必要があります。これはExpressモードの場合も必要です。
アプリケーションノートにサンプルが掲載されていますので、そちらをご確認ください。(NEQTOコンソールにログインの上ご確認ください)
7. まとめ
今回は、Expressモードをご紹介しました。
Expressモードはネットワーク接続がない場合に素早くスクリプトを実行できるため、さまざまな場面で活躍が見込める便利な機能だと思います。特にIoTデバイスをネットワーク接続が不安定な場所に設置する場合、また省電力としたい場合などに有効でしょう。ExpressモードによってNEQTOが活躍する範囲が広がりました。上記のシーンでご利用時にぜひご活用してみてください。