2.14 「バイナリパーサー」と「フォーマット変換」を併用した設定¶
本チュートリアルでは以下の利用を想定した設定例について説明します。
・IoT Connect Gatewayで設定する転送先クラウド:Things Cloud
・IoT Connect Gatewayで設定する認証:Things IoT認証
・IoT Connect Gatewayで利用する機能:スタンダード、フォーマット変換、バイナリパーサー
・IoT Connect Gatewayで設定するプロトコル:TCP→HTTPS
・Things Cloudで利用する機能:アラーム
注釈
- デバイスから送信されるデータは00001010、00010100、00011110、00101000のいずれかとします。
- Things Cloud側のデバイス登録、アカウント登録は設定済みの環境とします。
SIM設定¶
下記を参考に、SIMのThings Cloud向け設定をします。
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/common/update_sims/index.html
・Things Cloud向け設定 : 有効
・システムID : Things CloudのデバイスデータIDを入力
・MQTTクライアントID : 空欄
注釈
- システムIDは下図赤枠部分にてご確認できます。
認証設定¶
下記を参考に、ご利用クラウドの認証情報登録を参考に認証情報の設定をします。
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/common/create_auth/index.html#things-iot
・クラウド : Things Cloud
・証明書種別 : Things IoT認証
・認証名 : 任意の認証名
・Things IOT テナントID : Things CloudのテナントIDを入力
・Things IOT ユーザ名 : Things Cloudログイン時のユーザー名を入力
・Things IOT パスワード : Things Cloudログイン時のパスワードを入力
注釈
- Things CloudのテナントIDは下図赤枠部分にてご確認できます。
グループ作成とSIMの割り当て¶
- 下記を参考にグループ作成とSIMの割り当て設定をします。
「グループ」の作成
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/common/create_group/index.html
「グループ」へのSIMの割当
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/common/add_sims/index.html
スタンダード設定¶
- 下記を参考にスタンダード設定をします。
「スタンダード(TCPプロトコル)」 でクラウドに接続する
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/standard/tcp/index.html
注釈
- 設定名は任意の設定名を入力し、有効にします。
- デバイス側Path指定は無効とし、宛先設定の宛先Pathに/alarm/alarmsを入力します。
- 宛先設定のホスト名はThings CloudのFQDNを入力します。例) xxxx.je1.thingscloud.ntt.com
- 宛先設定の認証選択は認証設定手順で作成した認証情報を選択します。
バイナリパーサー設定¶
- 下記を参考にバイナリパーサーの設定をします。
「バイナリパーサー」 を利用する
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/bconv/index.html
・テンプレート内容に下記を入力します。バイナリパーサーで作成した設定はスタンダード設定手順で作成した設定に適用します。
error_code:0:int:8:be:7
・デバイスから送信されたバイナリデータは下記のようにJSONデータに変換されます。
00001010 → {"error_code":10} 00010100 → {"error_code":20} 00011110 → {"error_code":30} 00101000 → {"error_code":40} …
フォーマット変換設定¶
- 下記を参考にフォーマット変換設定をします。
「フォーマット変換」 を利用する
https://sdpf.ntt.com/services/docs/icgw/tutorials/rsts/fconv/index.html
・変換元形式はJSONを選択し、内容は下記を入力します。フォーマット変換で作成した設定はスタンダード設定手順で作成した設定に適用します。
{ "source": { "id": "$tc_systemid" }, {% if json_data["error_code"] is defined %}"text": "{{ json_data["error_code"] }}",{% endif %} {% if json_data["error_code"] is defined %}"severity": {% if json_data["error_code"] == 10 %}"CRITICAL"{% elif json_data["error_code"] == 20 %}"MAJOR"{% elif json_data["error_code"] == 30 %}"MINOR"{% elif json_data["error_code"] == 40 %}"WARNING"{% else %}"UNKNOWN"{% endif %},{% endif %} "time": "2024-09-18T17:00:00.165441Z", {% if json_data["error_code"] is defined %}"type": {% if json_data["error_code"] == 10 %}"CRITICAL_ACTIVE"{% elif json_data["error_code"] == 20 %}"MAJOR_ACTIVE"{% elif json_data["error_code"] == 30 %}"MINOR_ACTIVE"{% elif json_data["error_code"] == 40 %}"WARNING_ACTIVE"{% else %}"UNKNOWN"{% endif %},{% endif %} "status": "ACTIVE" }
・上記テンプレート内容の意味は下記になります。フォーマット変換されたJSONデータがHTTPSでThings Cloudに送信されます。
"source": SIM設定時に設定したThings CloudのシステムIDを反映 "text": "error_code"の数値を反映 "severity": "error_code"が10であれば"CRITICAL",20であれば"MAJOR",30であれば"MINOR",40であれば"WARNING"を反映 "time": "2024-09-18T17:00:00.165441Z"を反映 "type": "error_code"が10であれば"CRITICAL_ACTIVE",20であれば"MAJOR_ACTIVE",30であれば"MINOR_ACTIVE",40であれば"WARNING_ACTIVE"を反映 "status": "ACTIVE"を反映
バイナリデータ送信例¶
デバイス側のバイナリデータ送信例とThings Cloud側のアラーム通知例を説明します。
本手順では、デバイス側でPythonスクリプトを実行し、ソケット通信でバイナリデータを送信する手順をご紹介します。
ターミナルにて、下記Pythonスクリプトを作成します。
import socket import json # サーバーのアドレスとポート server_address = ('an1.icgw.ntt.com', 50000) # ソケットの作成 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # サーバーに接続 sock.connect(server_address) try: # 2進数データをバイナリ形式に変換(0b以降に2進数を入力) data = bytes([0b00001010]) # データを送信 sock.sendall(data) # サーバーからのレスポンスを受信 response = sock.recv(1024) # バッファサイズは適宜調整 # バイナリデータを文字列に変換 response_str = response.decode('utf-8') # ステータスコードとJSONデータを分離 status_code_str, json_data_str = response_str.split(' ', 1) # ステータスコードを表示 status_code = int(status_code_str) print("Status Code:", status_code) # JSONデータを整形して表示 json_data = json.loads(json_data_str) print("JSON Data:") print(json.dumps(json_data, indent=4)) finally: # ソケットを閉じる sock.close()
作成したPythonスクリプトを実行します。XXXはPythonスクリプト名になります。
$ python3 XXX.py
下記のようなレスポンスが表示されることを確認します。
Status Code: 201 JSON Data: { "severity": "CRITICAL", "creationTime": "2024-09-18T18:36:41.874+09:00", "count": 1, "history": { "auditRecords": [], "self": "https://tXXXXXXXXX.je1.thingscloud.ntt.com/audit/auditRecords" }, "source": { "name": "XXXXX", "self": "https://tXXXXXXXXX.je1.thingscloud.ntt.com/inventory/managedObjects/XXXXXXXXXX", "id": "XXXXXXXXXX" }, "type": "CRITICAL_ACTIVE", "lastUpdated": "2024-09-18T18:36:41.874+09:00", "self": "https://tXXXXXXXXX.je1.thingscloud.ntt.com/alarm/alarms/XXXXXXXX", "time": "2024-09-18T17:00:00.165Z", "id": "XXXXXXXX", "text": "10", "status": "ACTIVE" }
Things Cloudにログインし、対象デバイスのアラームが下図のように通知されていることを確認します。
・00001010がバイナリパーサーで{"error_code":10}に変換され、その後、フォーマット変換によってクリティカルアラームを通知するJSONに変換され、Things Cloudに送信されたことが確認できたかと思います。