IoT Platform コンソールでプロダクトを作成する際、データ型として[データを解析しない / カスタマイズ] を選択した場合、元のデータを JSON 形式にして解析するためのスクリプトを IoT Platform コンソール上で書くことができます。

データ解析について

データ解析は、限られた記憶領域または帯域幅を持つデバイスが Alink JSON 形式で IoT Platformにデータを直接送信しなくなるようにする方法です。 代わりに、デバイスは元のデータをクラウドに渡し、それによってスクリプトが実行されてデータが Alink JSON 形式に変換されます。 デバイスが元のデータをクラウドに渡せるようにするには、プロダクトを作成するときに、データ型として [データ解析をしない / カスタマイズ] を選択し、データ解析用の JavaScript ファイルを作成します。 IoT Platform は、データ解析スクリプトを編集およびデバッグするためのオンラインエディターを提供します。

データ解析プロセス

データ解析スクリプトエディターを使用して次のことができます。

  • JavaScript データ解析ファイルをオンラインで編集。
  • コンテンツの下書き保存、下書きの編集、または削除。
  • アナログデータを使用したスクリプトのデバッグ。 アップストリームまたはダウンストリームのアナログデータを入力し、スクリプトを実行してそれが機能するかどうかを確認できます。
  • 静的構文 (JavaScript 構文) チェックの実行。
  • 検証済みスクリプトを実行中のプラットフォームに送信し、デバイスデータを解析。

スクリプトをオンラインで編集

プロダクト詳細ページで、[データ解析] をクリックし、編集ボックスにデータ解析スクリプトを入力します。 現時点では、JavaScript のみサポートされています。

  • 全画面表示で表示や編集をするには、[全画面表示] をクリックします。 全画面表示を終了するには、[全画面表示の終了] をクリックします。

  • 編集したコンテンツを保存するには、ページ下部の [下書きを保存] をクリックします。 次回、データ解析ページにアクセスするとき、下書きがあるという通知が表示されます。 その場合、[編集を再開] または [下書きを削除] を選択できます。
    • 下書きは、保存されたとき、実行中の解析プラットフォームには公開されず、現在公開されているスクリプトには影響しません。
    • 新しい下書きは、以前に保存された下書きを上書きします。

アナログデータを使用したスクリプトの検証

スクリプトを編集したら、[アナログ入力] ボックスにアナログデータを入力し、[実行] をクリックします。 このスクリプトが呼び出されてアナログデータが解析され、ページ右側の [解析結果] ボックスに解析結果が表示されます。 スクリプトが正しくない場合、[解析結果] の横に、"実行に失敗しました" というメッセージが表示され、スクリプトの修正に使用できる情報とともにエラーメッセージがボックス内に表示されます。

アップストリームアナログデータの解析

シミュレーションタイプとして、[アップストリームデバイスデータ] を選択し、デバイスの、渡されるバイナリデータを入力し、[実行] をクリックします。 バイナリデータが Alink JSON 形式に変換され、結果はページ右側のボックスに表示されます。

ダウンストリームアナログデータの解析

[デバイスデータの受信]をクリックし、Alink JSON 形式のデータを入力し、[実行] をクリックします。 ALink JSON データがバイナリデータに変換され、結果はページ右側のボックスに表示されます。

スクリプトの送信

送信されたスクリプトが正しく、適切に実行されることを保証するために、解析テストに合格したスクリプトのみを実行中のプラットフォームに送信できます。 スクリプトの送信後、システムはそのスクリプトを自動的に使用し、デバイスのアップストリームデータとダウンストリームデータを変換します。

少なくとも 1 回はスクリプトでアナログデータを正しく解析してから送信します。

開発フレームワーク

概要

次の 2 つのメソッドをスクリプトに定義する必要があります。

  • protocolToRawData: Alink JSON 形式のデータをバイナリデータに変換します。
  • rawDataToProtocol: バイナリデータを Alink JSON 形式のデータに変換します。
言語

現時点では、ECMAScript 5.1 を満たす JavaScript のみサポートされています。

メソッドの定義
  • 以下のようにして、Alink JSON 形式のデータをバイナリデータに変換します。
    // サーバーによって送信された Alink JSON 形式のデータを解析し、そのデータをバイナリデータに変換する
    function protocolToRawData(jsonObj){
        return rawdata;
    }

    パラメーターの説明: 入力パラメーター (jsonObj) は、プロダクトの TSL にある Alink JSON 形式のデータと一致します。

    {
        "method": "thing.service.property.set", 
        "id": "12345", 
        "version": "1.0", 
        "params": {
            "prop_float": 123.452, 
            "prop_int16": 333, 
            "prop_bool": 1
        }
    }

    返されるパラメーター: バイナリバイト配列。 以下に例を示します。

    0x0100003039014d0142f6e76d
  • バイナリデータを Alink JSON 形式のデータに変換:
    // デバイスによって送信されたバイナリデータを解析し、そのデータを Alink JSON 形式のデータに変換する
    function rawDataToProtocol(rawData){
        return jsonObj;
    }

    パラメーターの説明: 入力パラメーター (rawData) は、例のようなバイナリバイト配列です。

    0x00002233441232013fa00000

    パラメーターの説明: データは、プロダクトの TSL にある Alink JSON 形式のデータと一致します。

    {
        "method": "thing.event.property.post", 
        "id": "2241348", 
        "params": {
            "prop_float": 1.25, 
            "prop_int16": 4658, 
            "prop_bool": 1
        }, 
        "version": "1.0"
    }

スクリプトデモ

  1. プロダクトを作成し、プロダクトの機能を定義します。
    1. Pro Edition プロダクトを作成し、データ型として [解析しない / カスタマイズ] を選択します。
    2. プロダクトの機能 (プロパティ、サービス、イベントなど) を定義します。 このデモでは、次の 3 つのプロパティが定義されています。
      識別子 データ型
      prop_float float
      prop_int16 int32
      prop_bool bool
  2. シリアルポートプロトコルの例。
    フレームタイプ ID prop_int16 prop_bool prop_float

    1 バイト

    0 - アップストリーム、1 - ダウンストリーム

    リクエストシーケンス番号

    2 バイト

    prop_int16 のプロパティ値

    1 バイト

    prop_bool のプロパティ値

    4 バイト

    prop_float のプロパティ値

  3. スクリプトのデモコードをコピーします。

    次のデモコードをコピーし、スクリプト編集ボックスに貼り付けます。

    var COMMAND_REPORT = 0x00;
    var COMMAND_SET = 0x01;
    var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //トピックがクラウドにプロパティデータをアップロードできるように、ALink JSON 形式にした標準的なトピック。
    var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //トピックがデバイスにプロパティ管理コマンドを送信できるように、ALink JSON 形式にした標準的なトピック。
    /*
    Sample data:
    Input parameters ->
        0x00002233441232013fa00000
    Output parameters  ->
        {"method":"thing.event.property.post","id":"2241348",
        "params":{"prop_float":1.25,"prop_int16":4658,"prop_bool":1},
        "version": "1.0"、
    */
    function rawDataToProtocol(bytes) {
        var uint8Array = new Uint8Array(bytes.length);
        for (var i = 0; i < bytes.length; i++) {
            uint8Array[i] = bytes[i] & 0xff;
        }
        var dataView = new DataView(uint8Array.buffer, 0);
        var jsonMap = new Object();
        var fHead = uint8Array[0]; // command
        if (fHead == COMMAND_REPORT) {
            jsonMap['method'] = ALINK_PROP_REPORT_METHOD; //プロパティを報告できるように、ALink JSON 形式にしたトピック
            jsonMap['version'] = '1.0'; //ALink JSON 形式でのプロトコルバージョン
            jsonMap['id'] = '' + dataView.getInt32(1); //ALink JSON 形式でのリクエスト ID 値
            var params ={
            params['prop_int16'] = dataView.getInt16(5); //プロダクトの prop_int16 のプロパティ
            params['prop_bool'] = uint8Array[7]; //prop_bool のプロパティ
            params['prop_float'] = dataView.getFloat32(8); //prop_float のプロパティ
            jsonMap['params'] = params; //ALink JSON 形式でのパラメーターの標準的なフィールド
        }
        return jsonMap;
    }
    /*
    Sample data:
    Input parameters  ->
        {"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
    Output parameters ->
        0x0100003039014d0142f6e76d
    */
    function protocolToRawData(json) {
        var method = json['method'];
        var id = json['id'];
        var version = json['version'];
        var payloadArray = [];
        if (method == ALINK_PROP_SET_METHOD) // プロパティ設定
        {
            var params = json['params'];
            var prop_float = params['prop_float'];
            var prop_int16 = params['prop_int16'];
            var prop_bool = params['prop_bool'];
            // カスタムプロトコル形式に従って接続された生データ
            payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // コマンドフィールド
            payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON 形式での ID
            payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // プロパティ 'prop_int16' の値
            payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // プロパティ 'prop_bool' の値
            payloadArray = payloadArray.concat(buffer_float32(prop_float)); // プロパティ 'prop_float' の値
        }
        return payloadArray;
    }
    // 以下に示すのは補助機能です
    function buffer_uint8(value) {
        var uint8Array = new Uint8Array(1);
        var dv = new DataView(uint8Array.buffer, 0);
        dv.setUint8(0, value);
        return [].slice.call(uint8Array);
    }
    function buffer_int16(value) {
        var uint8Array = new Uint8Array(2);
        var dv = new DataView(uint8Array.buffer, 0);
        dv.setInt16(0, value);
        return [].slice.call(uint8Array);
    }
    function buffer_int32(value) {
        var uint8Array = new Uint8Array(4);
        var dv = new DataView(uint8Array.buffer, 0);
        dv.setInt32(0, value);
        return [].slice.call(uint8Array);
    }
    function buffer_float32(value) {
        var uint8Array = new Uint8Array(4);
        var dv = new DataView(uint8Array.buffer, 0);
        dv.setFloat32(0, value);
        return [].slice.call(uint8Array);
    }
  4. アナログデータを使用してスクリプトを検証します。
    • アップストリームデータの解析

      [アップストリームデバイスデータ] をクリックし、次のデータを入力します。

      0x00002233441232013fa00000

      [実行] をクリックし、出力を表示します。

      {
          "method": "thing.event.property.post", 
          "id": "2241348", 
          "param": {
              "prop_float": 1.25, 
              "prop_int16": 4658, 
              "prop_bool": 1
          }, 
          &quot;version&quot;: &quot;1.0&quot;
      }
    • [受信したデバイスデータ] をクリックし、次のデータを入力します。
      {
          "method": "thing.service.property.set", 
          "id": "12345", 
          &quot;version&quot;: &quot;1.0&quot;、 
          "param": {
              "prop_float": 123.452, 
              "prop_int16": 333, 
              "prop_bool": 1
          }
      }

      [実行] をクリックし、出力を表示します。

      0x0100003039014d0142f6e76d

付録: ローカルコンピューターで書かれたスクリプトをデバッグする方法

現在、IoT Platformデータ解析は、実行中のプラットフォームでのデバッグをサポートしていません。 したがって、完成したスクリプトをオンラインエディターに直接貼り付けてテストすることを推奨します。 以下はテストメソッドの出力例です。

// テストデモ
function Test()
{
    //0x001232013fa00000
    var rawdata_report_prop = new Buffer([
        0x00, //固定されたコマンドヘッダー、0 プロパティのの報告を示す
        0x00, 0x22, 0x33, 0x44, // IID のフィールドに対応するリクエストシーケンスを識別。
        0x12, 0x32, //int16 での 2 バイトの値で、prop_int16 のプロパティに対応
        0x01, //bool での 1 バイトの値で、prop_bool のプロパティに対応
        0x3f, 0xa0, 0x00, 0x00 //float での 4 バイトの値で、prop_float のプロパティに対応
    ]);
    rawDataToProtocol(rawdata_report_prop);
    var setString = new String('{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}');
    protocolToRawData(JSON.parse(setString));
}
Test();