データ解析タスクにおいて、ソースノードの Topic データ形式が生データの場合、解析にカスタムスクリプトを使用できます。IoT Platform は、JavaScript(ECMAScript 5)、Python 2.7、および PHP 7.2 スクリプトをサポートしています。このトピックでは、カスタム Topic データ解析スクリプトを作成するためのテンプレートと例を紹介します。
JavaScript スクリプト例
スクリプトテンプレート
/**
* デバイスから送信されたデータを、IoT Platform に送信する際にカスタム Topic に変換し、JSON 形式に変換します。
* 入力パラメーター: data、byte[] 配列、空であってはなりません。
* 出力パラメーター: jsonObj、オブジェクト、空であってはなりません。
*/
function executeScript(data) {
var jsonObj = {};
return jsonObj;
}
スクリプト例
/*
サンプルデータ:
カスタム Topic:
/user/update、データの送信先。
入力パラメーター:
data: 0x000000000100320100000000
出力パラメーター:
{
"prop_float": 0,
"prop_int16": 50,
"prop_bool": 1
}
*/
function executeScript(data) {
var uint8Array = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {
uint8Array[i] = data[i] & 0xff;
}
var dataView = new DataView(uint8Array.buffer, 0);
var jsonMap = {};
jsonMap['prop_int16'] = dataView.getInt16(5);
jsonMap['prop_bool'] = uint8Array[7];
jsonMap['prop_float'] = dataView.getFloat32(8);
return jsonMap;
}
Python スクリプト例
スクリプトテンプレート
# デバイスから送信されたデータを、IoT Platform に送信する際にカスタム Topic に変換し、JSON 形式に変換します。
# 入力パラメーター: data、リスト、要素は整数でなければならず、リストは空にできません。
# 出力パラメーター: jsonObj、辞書。
def execute_script(data):
jsonObj = {}
return jsonObj
スクリプト例
# coding=UTF-8
# サンプルデータ:
# カスタム Topic: /user/update、データの送信先。
# 入力パラメーター:
# data: 0x000000000100320100000000
# 出力パラメーター:
# {
# "prop_float": 0,
# "prop_int16": 50,
# "prop_bool": 1
# }
def execute_script(data):
uint8Array = []
for byteValue in data:
uint8Array.append(byteValue & 0xff)
jsonMap = {}
jsonMap['prop_int16'] = bytes_to_int(uint8Array[5:7])
jsonMap['prop_bool'] = bytes_to_int(uint8Array[7:8])
jsonMap['prop_float'] = bytes_to_int(uint8Array[8:])
return jsonMap
# バイト配列を整数に変換します。
def bytes_to_int(bytes):
result = ''.join(['%02X' % i for i in bytes])
return int(result, 16)
PHP スクリプト例
スクリプトテンプレート
<?php
/**
* デバイスから送信されたデータを、IoT Platform に送信する際にカスタム Topic に変換し、JSON 形式に変換します。
* 入力パラメーター: $data、通常の配列、要素は整数でなければなりません。
* 出力パラメーター: $jsonObj、連想配列、キーは文字列でなければならず、「10」のような数値文字であってはなりません。また、空であってはなりません。
*/
function executeScript($data)
{
$jsonObj = array();
return $jsonObj;
}
重要
グローバル変数または静的変数は、結果に一貫性がなくなる可能性があるため、使用しないでください。
スクリプトは、2 の補数演算を使用してデータを処理します。[-128,127] の範囲の値は、[0,255] に補完されます。たとえば、-1 は 255(10 進数)に補完されます。
カスタムプロトコル解析関数 executeScript の入力パラメーターは、整数配列です。各要素は、0xFF とのビット単位の AND 演算を行い、補数を導出する必要があります。この関数は、キーに配列以外の文字が含まれている連想配列を返します(たとえば、キーが「10」の場合、PHP 配列はそれを整数 10 として解釈します)。
PHP 実行環境では、厳密な例外処理が必要です。エラーが発生すると例外がスローされ、後続のコードの実行が停止します。堅牢性を確保するために、例外を適切にキャッチして管理してください。
スクリプト例
<?php
/*
サンプルデータ:
カスタム Topic:
/user/update、データの送信先。
入力パラメーター:
data: 0x000000000100320100000000
出力パラメーター:
{
"prop_float": 0,
"prop_int16": 50,
"prop_bool": 1
}
*/
function executeScript($bytes)
{
$data = array();
$length = count($bytes);
for ($i = 0; $i < $length; $i++) {
$data[$i] = $bytes[$i] & 0xff;
}
$jsonMap = array();
$jsonMap['prop_int16'] = getInt16($data, 5);
$jsonMap['prop_bool'] = $data[7];
return $jsonMap;
}
function getInt16($bytes, $index)
{
$array = array_slice($bytes, $index, 2);
return hexdec(implode('', array_map('dechex', $array)));
}
function byteArrayToHexString($data)
{
return implode('', array_map(function($byte) {
return str_pad(dechex($byte), 2, '0', STR_PAD_LEFT);
}, $data));
}