neqto: を使用して IIJ IoTサービスからデータを送受信する


本ページでは、 JIG-SAW社から提供されている neqto: を使用して、IoTサービスへデータ送信する手順を説明します。

neqto: とは?

neqto: とは、次世代IoTプロダクトのための組込みシステムです。ハードウェアのオンライン化・IoT化を進めるために必要な機能(機器、通信、セキュリティ、クラウドサービス)があらかじめ準備されていますので、自社のハードウェア開発やサービス運営に注力することができます。
ハードウェアのオンライン化を簡易に実現できる neqto: と、IoT専用のセキュアなネットワークとプラットフォームを提供する IIJ IoT サービスを組み合わせることで、よりシンプルで安全なハードウェア実装・システム実装が実現可能になります。

neqto: についての情報は https://neqto.jig-saw.com/ をご参照ください。


neqto: のセットアップ

使用する機器

今回は、neqto: Bridge LTE-1 ModuleIO Board を組み合わせて使用します。

neqto: と IIJ IoT サービスを組み合わせて使用する場合は、 LTE-1 Module を使用する必要があります。Wi-Fi Module, Spresense+neqto: Engine は IIJ IoTサービスには対応しておりません。



neqto: Bridge LTE-1 Module 初期設定

neqto: の初期設定のドキュメントを参照し、LTE-1 Module の初期設定を行います。APN/ユーザ名/パスワードに設定する値は モバイルアクセス のページをご参照ください。

neqto: Console 初期設定

neqto: Console のドキュメントを参照し、neqto: Console にログインした上で、ライセンス・デバイスの登録を行い、その後にグループの登録、スクリプトの実装、テンプレートの登録、ノードの登録、と操作を行います。
「スクリプトの実装」以降の作業については、次項で説明します。

IoTサービス用のスクリプトを実装する

neqto: Console の SCRIPTS タグから「スクリプトの登録」を行います。
名称に "iijiot" と入力して保存します。

neqto:用 IoTサービス操作ライブラリ

neqto: から IoTサービスを操作するために、2つの function を用意しました。
neqto: Console のスクリプトエディタに、以下のソースコードをコピー&ペーストしてください。

/*
  neqto:  IIJ IoT sample
*/
var IIJ_IOT_HOST = 'gw.iot.iij.jp';
var IIJ_IOT_PORT = 80;
var IIJ_IOT_SEND_PATH = '/v1';
var IIJ_IOT_STATUS_PATH = '/v1/dvc-state/json';
var IIJ_IOT_DEFAULT_TIMEOUT = 10 * 1000;
 
/**
 * IoTサービスにデータ送信する
 * @param {Object} json_data 送信するJSONオブジェクト
 * @param {Number} timeout POSTのタイムアウト(ms) default:10000ms
 * @return {Number} エラーコード 0:正常 0以外:異常
 */
function send_to_iot(json_data, timeout) {
    timeout === undefined ? IIJ_IOT_DEFAULT_TIMEOUT:timeout;
 
    var fin_flg = false;
    var fin_code = 0;
    var body = JSON.stringify(json_data);
    var header = {'Content-Type':'application/json;charset=UTF-8', 'Content-Length': body.length.toString()};
    var options = {method:'POST', host:IIJ_IOT_HOST, port:IIJ_IOT_PORT, path:IIJ_IOT_SEND_PATH, headers:header};
    var request = http.request(options, function(res){
        fin_flg = true;
    }, timeout);
    request.on('error', function() {
        fin_code = request.errCode;
        fin_flg = true;
    });
    request.write(body);
    request.end();
 
    //レスポンスが返ってくるまで待つ
    while(!fin_flg) {
        setTimeout(50).wait();
    }
    setTimeout(500).wait();
 
    return fin_code;   
}
 
/**
 * IoTサービスに設定されているデバイスのステータスを取得する
 * @param {Number} timeout POSTのタイムアウト(ms) default:10000ms
 * @return {Object} ステータスのJSONオブジェクト エラー時はnull
 */
function get_device_status(timeout) {
    timeout === undefined ? IIJ_IOT_DEFAULT_TIMEOUT:timeout;
 
    var fin_flg = false;
    var fin_code = 0;
    var body = '';
    var header = {};
    var options = {method:'GET', host:IIJ_IOT_HOST, port:IIJ_IOT_PORT, path:IIJ_IOT_STATUS_PATH, headers:header};
    var request = http.request(options, function(res){
        res.on('readable', function() {
            body += res.read();
        });
        res.on('end', function() {
            body += res.read();
            fin_flg = true;
        })
    }, timeout);
    request.on('error', function() {
        fin_code = request.errCode;
        fin_flg = true;
    });
    request.end();
 
    //レスポンスが返ってくるまで待つ
    while(!fin_flg) {
        setTimeout(50).wait();
    }
    setTimeout(500).wait();
 
    if(fin_code != 0 || body == "")   return null;
    return JSON.parse(body);
}
neqto: から IoTサービスにデータ送信する
スクリプトの作成

前項でコピー&ペーストしたライブラリの下部に、以下のソースコードをさらにコピー&ペーストします。
これは、IoTサービスに1分ごとにランダム値を送信するサンプルです。

//--------------------------------------------------
// ここからは動作サンプル
log.setLevel(0);   //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE
log.printLevel(3);  //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.clear();

var wait_time = 60;

while(1) {
    //IoTサービスにランダム値を送信する
    var data = {
        "namespace":"neqto",
        "name":"random",
        "value": Math.random() *100
    };
    var res = send_to_iot(data);
    if (res == 0) {
        print("data send OK. value=" + data["value"]);
    } else {
        print("data send ERROR. code=" + res);
    }

    //待ち
    setTimeout(1000 * wait_time).wait();
}

ソースコードを入力したら、スクリプトを保存します。

テンプレートの登録

スクリプト保存後、neqto: Console の TEMPLATES タグから「テンプレートの登録」を行います。
以下の情報を入力し、保存します。

タブ項目名入力値
デバイス情報名前IIJIOTSAMPLE
デバイス種類neqto Bridge LTE-1
デバイスのファームウェア一番新しいものを選択する
オプションMachine Driverのパッケージ空欄のまま
スクリプトiijiot
環境変数-空欄のままで
ノードの登録

テンプレート登録後、neqto: Console の NODES タグから「ノードの登録」を行います。
以下の情報を入力し、保存します。

タブ項目名入力値
メタデータ名前適当な名称を入力
備考適当な説明を入力
テンプレートIIJIOTSAMPLE
デバイス情報デバイス

登録されているデバイスを選択する

環境変数-空欄のまま
動作確認

neqto: Console でここまで設定を行ったところで、neqto: のボード(ハードウェア)に電源を接続します(電源に接続済みだった場合は、一度電源を抜き差しします)。
起動後に、ファームウェアの更新・スクリプトのロードが行われた後に、スクリプトが動作を開始します。

neqto: Console のノードの画面をリロードすると、正常に起動できた場合は、ノードの状態が緑の表示となり「有効: available」となっていることが分かります。
正常に起動できていると、上記で入力したスクリプト(1分ごとにランダム値を送信する)が動作を始めています。

IoTサービスのコントロールパネルにログインし、「デバイスモニタリング」を開くと、メトリック(グラフ)が表示されていることが分かります。つまり、送信されたデータがグラフとして可視化された状態です。


IoTサービスに設定したラベル情報を neqto: で取得する

ラベル機能を利用することで、外部から neqto: デバイス対して各種データを送ることができます。ラベル機能の詳細は ラベル機能 のページご参照ください。
今回は、IoTサービスで設定した "wait" という名称のラベル値を neqto: で取得して、データの送信間隔を変更してみます。

スクリプトの修正

neqto: Console より、前項で作成したスクリプトを開き、次のコードを追記して保存します。

//--------------------------------------------------
// ここからは動作サンプル
   :
  中略
   :
while(1) {
    //--- ↓ここを追記する  ------------------------
    //IoTサービスからラベルを取得する
    var st = get_device_status();
    var label = st["labelContents"];
    if (label != null && label != undefined) {
        print("label=" + JSON.stringify(label));
        var w = label["wait"];
        if (w != undefined && !isNaN(w)) {
            wait_time = parseInt(w, 10);
        }
    }
    //--- ↑ここを追記する  ------------------------
 
   :
  中略
   :
}
ノードへの反映

スクリプトを保存後、neqto: Console の NODES タグから「スクリプトの再ロード」を行います。

ラベルの更新

IoTサービスのコントロールパネルにログインし、「デバイス」を開きます。
デバイスの一覧から neqto: に挿してあるSIMを選択し、「編集」ボタンをクリックします。
表示された画面の「ラベル」の利用有無を「ON」に設定し、「ラベル」に以下の値を入力して「保存」します。

ラベル名
wait30

動作確認

ラベル設定後、neqto: デバイスからのデータの送信間隔が30秒に変更されたことがわかると思います。
また、neqto: よりデバッグログを取得することで実際にラベルが取得できていることが分かります。デバッグログの取得方法は neqto: ドキュメント「デバッグログの取得方法」 をご参照ください。

APIからラベルを更新

ラベルの更新は、画面(コントロールパネル)からだけではなく、外部のシステムから Web API を使用して操作することが可能です。
APIの使用方法については Web API を、ラベル操作を行うAPIの仕様については、API仕様 (UpdateDevice) のページをご参照ください。

まとめ

以上、neqto: から、IoTサービスへのデータ送信・ラベル(状態)更新の手順をご紹介いたしました。
ハードウェアのオンライン化を簡易に実現できる neqto: と、セキュアな閉域ネットワークを提供する IIJ IoT サービスを組み合わせることで、「ハードウェアのIoT化」をより簡単・安全に進めることが可能です。ぜひご活用ください。