IoT Platform は、複雑なメッセージデータを処理し、クラウドサービス間の通信を容易にするためのパーサーを提供します。パーサーは、メッセージコンテンツの取得、データ形式の変換、およびデータの転送に使用されます。パーサーは、文字列、JSON 形式のデータ、およびバイナリデータを処理できます。このトピックでは、パーサースクリプトの記述方法について説明します。
背景情報
IoT Platform は、トピック内のデータの形式に基づいてデータを処理および送信します。データ形式の詳細については、「データ形式」をご参照ください。
IoT Platform によって提供されるパーサーは、JavaScript 構文に類似した構文を使用します。 JavaScript 構文に基づいてパーサースクリプトを記述できます。ただし、パーサーはすべての JavaScript 構文をサポートしているわけではありません。次のセクションでは、スクリプトの記述方法について説明します。
スクリプトを記述する
次の手順を実行して、スクリプトを記述できます。
- payload() 関数を使用して、デバイスによって送信されたデータを取得し、JSON 形式のデータに変換します。
var data = payload("json");重要 解析する送信済みデータは、JSON 配列またはネストされた JSON データに変換する必要があります。 - フィールドを定義し、ペイロードから取得したプロパティ値に設定します。
- 識別子を使用したフィールドの定義方法とデータ型の設定方法の詳細については、「識別子」セクションと「データ型」セクションを参照してください。
- スクリプトで JSONPath 式または
getOrNull()関数を使用して、フィールド値を取得できます。 JSONPath 式または LanguageManual UDFgetOrNull()次のサンプル スクリプトでは、
getOrNull(data, "items", "Humidity", "value");を使用して値25を取得し、data.items.Temperature.valueを使用して値38を取得し、data.iotIdを使用して値JCp9***を取得できます。
重要 スクリプトを使用して、送信されたデバイスデータから特定のフィールド値を取得する場合:- フィールドの識別子が数字で始まる場合は、getOrNull() 関数を使用する必要があります。 JSONPath 式はサポートされていません。たとえば、サンプルスクリプトでは、
getOrNull(data, "items", "2Co", "value")102Codata.items.2Co.value関数のみを使用して、 フィールドの値 を取得できます。 式はサポートされていません。 - 取得するフィールドが送信されたデバイスデータに存在しない場合は、次のいずれかのシナリオが発生する可能性があります。
null関数を使用すると、値 が返され、スクリプトは引き続き実行できます。- JSONPath 式を使用すると、ヌルポインタが表示され、スクリプトの実行が停止します。
ビジネス要件に基づいてデータを処理したり、計算を実行したりすることもできます。パーサースクリプトでサポートされている演算子と関数の詳細については、「演算子」と「関数」をご参照ください。
- 関数を使用してデータを転送します。
このような関数の詳細については、「宛先にデータを転送する」をご参照ください。
また、制御文を使用してデータ転送条件を設定することもできます。次のサンプルスクリプトでは、
if文を使用して条件を設定しています。パーサースクリプトでサポートされている制御文の詳細については、「制御文」セクションをご参照ください。
サンプル スクリプト
次のプロパティデータが送信されます。
{
"deviceType": "CustomCategory",
"iotId": "JCp9***",
"requestId": "1626948228247",
"checkFailedData": {
},
"productKey": "a1o***",
"gmtCreate": 1626948134445,
"deviceName": "Device1",
"items": {
"Temperature": {
"value": 38,
"time": 1626948134319
},
"Humidity": {
"value": 25,
"time": 1626948134319
},
"2Co": {
"value": 10,
"time": 1626948134319
}
}
}次のスクリプトは、送信されたデータを解析および処理するために使用されます。
// payload() 関数を使用して、デバイスによって送信されたデータを取得し、JSON 形式のデータに変換します。
var data = payload("json");
// 送信された温度と湿度の値をフィルタリングします。
var h = getOrNull(data, "items", "Humidity", "value");
var t = data.items.Temperature.value;
var c = getOrNull(data, "items", "2Co", "value");
// データ転送ルールを設定します。温度値が 38 より大きい場合、ルールがトリガーされて ApsaraDB RDS にデータが送信されます。
// ApsaraDB RDS テーブルには、id(自動インクリメント プライマリキー)、deviceName、temperature、humidity、2Co、および time の各列が含まれています。writeRds() メソッドを呼び出し、メソッドで複数の <列名>:<値> ペアを指定して、指定された列に値を書き込むことができます。
if (t > 38) {
writeRds(1000, {"deviceName":deviceName(), "temperature":t, "humidity":h, "2Co":c, "time":timestamp()});
}識別子
スクリプトで定数、変数、およびカスタムフィールドを定義するには、識別子を使用する必要があります。識別子には、文字、数字、およびアンダースコア(_)を含めることができます。ただし、識別子は数字で始めることはできません。
次のキーワードと予約語は識別子として使用できません。
- キーワード:
forbreakcontinueifelsetruefalsevarnewnullreturn、、、、、、、、、、および 。 - 予約語:
breakdo、instanceof、typeof、case、catch、finally、void、switch、while、debugger、function、this、with、default、throw、delete、in、try、as、from、classenum、extends、super、const、export、import、await、implementslet、let、private、public、interface、package、protected、static、およびyield。
データ型
数値、ブール値、文字列、バイト、マップ、および配列は、スクリプトの定数、変数、およびカスタムフィールドでサポートされているデータ型です。
定数の値は null にすることができます。数値定数でサポートされているデータ型には、10 進整数、16 進整数、および浮動小数点数が含まれます。
制御ステートメント
IoT Platform は、for 文と if...else 文をサポートしています。for 文は、break キーワードと continue キーワードをサポートしています。
for宛先にデータを送信する ステートメントを使用してデータ転送関数を繰り返し実行する場合、ループの回数は 100 を超えることはできません。データ転送関数の詳細については、「」をご参照ください。演算子
- 論理演算子:
&&||論理条件で指定されたブール値以外の値の場合、null 値は false を示し、その他の値は true を示します。たとえば、
null && "x"は false を返し、null || "x"は true を返します。 - 算術演算子:
*、/、%、+、および-。数値データ型のみがサポートされています。それ以外の場合は、エラーが発生します。
- 比較演算子:
>、=>、<、<=、==、および!=です。== 比較演算子は数値のみをサポートします。
コメント
複数行コメント (/* ${comments}*/) と単一行コメント (// ${comments}) がサポートされています。