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")
10
2Codata.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()});
}
識別子
スクリプトで定数、変数、およびカスタムフィールドを定義するには、識別子を使用する必要があります。識別子には、文字、数字、およびアンダースコア(_)を含めることができます。ただし、識別子は数字で始めることはできません。
次のキーワードと予約語は識別子として使用できません。
- キーワード:
for
break
continue
if
else
true
false
var
new
null
return
、、、、、、、、、、および 。 - 予約語:
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}
) がサポートされています。