PHオリジナルWEBサーバー(pd_web)
HTTPを用いた双方向通信を実現するためにぷらっとホームオリジナル仕様のWebベースIoTサーバーです。
PD Webの概要
- PD Web はHTTPにおいて双方向通信を提供します。
- 下流方向へのペイロード転送は、上流方向へのPOSTに対する応答メッセージとして提供されます。
- 上流方向へ送るべきペイロードが存在しない場合、PD Repeaterは、受信ポーリング間隔に指定される間隔で空接続を行います。
- 下流方向へ送るべきペイロードが存在しない場合、Webサーバーは応答ヘッダーのみを返します。
PD Repeaterは応答メッセージが空でない場合、push_toキーに指定される下流モジュールのUNIXドメインソケットにペイロードを転送します。
- PD Web の認証方式は双方向のトークン認証です。
- PD RepeaterとWebサーバーには、デバイス毎に指定されたIDと鍵(Key)の情報を持ちます。
- PD Repeaterは、リクエストヘッダに記載するバージョン番号(PD Web仕様のバージョン番号)・ID・タイムスタンプ・ペイロードのハッシュ値(MD5)から構成される署名対象文字列(リクエスト用)を鍵(Key)で著名したハッシュ値(Shignature)をリクエスト用のトークンとします。
- Webサーバーは、バージョン番号・ID・タイムスタンプ・ペイロードのハッシュ値(MD5)にリクエストヘッダのトークンを加えた署名対象文字列(応答用)を鍵(Key)で著名したハッシュ値(Shignature)を応答用のトークンとします。
- 応答ヘッダーのShignatureもしくはペイロードのMD5が期待される値と一致しない場合、以降、PD Repeaterは応答ヘッダーに期待されるShignatureが返されるまでペイロードを空とします。
- Webサーバー一括のBASIC認証を併用することも可能です。
- エラーハンドリング
- PD Repeaterとwebサーバー間のエラーハンドリングはHTTPステータスコードのみで行われます。
ステータスが200~299以外の場合は、応答ヘッダーの内容に関わらず下流モジュールへのペイロードの転送は行われません。
- PD Repeaterとwebサーバー間のエラーハンドリングはHTTPステータスコードのみで行われます。
- ペイロードのフォーマットとトランザクション管理
- 上流方向のペイロードのフォーマットはJSON文字列であり、複数のメッセージをまとめて転送できるようメッセージの数に限らず最上位階層は配列となります。
- PD Repeaterの下流方向のメッセージフォーマットはPD Repeaterの下流方向メッセージに示す通りですが、ペイロードのフォーマットは規定されていません。下流方向のペイロードのフォーマットは PD Repeaterからペイロードを受け取る下流のモジュールの仕様に依存します。
- ペイロードのトランザクション(到達や再送処理)管理は、Webサーバーと下流のモジュール間で行われることを前提とし、PD Repeaterはトランザクションの管理を行いません。
- 弊社が提供するPD Handler Modbus と PD Handler Modbus2,PD HandlerSW4x および PD Agentはトランザクション管理用途に下流方向のペイロードのハッシュ値(MD5)をJSON文字列 "reply_to"キーの値として返す仕様となっています。
PD WebのHTTPヘッダー
PD Webで規定されているHTTPヘッダーは次の通りです。
PD Webで規定されているHTTPヘッダー
HTTPヘッダー | 内容 |
---|---|
X-Pd-Web-Version | PD Web の仕様のバージョン番号 |
X-Pd-Web-Id | クライアントのID |
X-Pd-Web-Time | RFC3339準拠のタイムスタンプ |
X-Pd-Web-Md5 | ハッシュ値 |
X-Pd-Web-Signature | ヘッダ情報と鍵(Key)から作成されたハッシュ値 |
Content-Type | application/json;charset=UTF-8 |
PD Repeaterからの要求ヘッダーの例を示します。
PD Repeaterへの応答ヘッダーの例を示します。
PD Webのトークン
PD Repeaterで作成されるリクエストヘッダのトークン(X-Pd-Web-Signature)は、Webサーバーにおいて次のPHPスクリプトにより再生できます。
ここで $keyは、は $_SERVER['HTTP_X_PD_WEB_ID'] と対をなす予めWebサーバーに保存された鍵(Key)となります。 再生した $signature と $_SERVER['HTTP_X_PD_WEB_SIGNATURE'] を比較することで認証します。
応答ヘッダーのトークン(X-Pd-Web-Signature)は、Webサーバーにおいて次のPHPスクリプトにより作成します。
ここで、$payload は、ペイロードの文字列、送信すべき文字列(下流方向の制御メッセージ)が無い場合は、$payload=""; とします。 リクエストヘッダのトークンとは異なり、被署名文字列に PD Repeater から送られて来たリクエストヘッダのトークン($_SERVER['HTTP_X_PD_WEB_SIGNATURE'])が、含まれる点に注意して下さい。
Webサーバー(PHPスクリプト)の実装例
Webサーバー(PHPスクリプト)の実装例を示します。
送受信設定メニューにおける設定
送受信設定メニューにおける設定項目
設定項目 | 説明 |
---|---|
インターバル[sec] | 送信完了後~送信開始までの時間間隔を秒単位で設定します。 |
有効時間[sec] | PD Reperterがデータ送信できない場合において、保持する時間を設定します。 0 を指定した場合、データ送信が完了するまで保持し続けます。 |
サブプロセス再起動間隔[sec] | サブプロセスを再起動する間隔を設定します。 通常デフォルト値(86400秒)から変更する必要はありません。 0を指定した場合、再起動は行いません。 |
メモリ増加量閾値[MB] | 常駐メモリの増加分の上限値を設定します。 通常デフォルト値(32Mbyte)から変更する必要はありません。上限値を超えるとサブプロセスを再起動します。 |
接続先URL | 接続先のPH社独自仕様WEBサーバーのURLを設定します。 |
受信ポーリング間隔[sec] | WEBサーバーから制御メッセージを読み出す間隔を設定します。 |
ユーザー名 | WEBサーバーのBASIC認証に用いるユーザー名を設定します。 |
パスワード | WEBサーバーのBASIC認証に用いるユーザー名を設定します。 |
最大POSTデータサーズ | 1回のPOSTメソッドで送信する最大データサイズを選択します。1~4Mbyteの中で選択します。 |
サーバー証明書検証機能 | 使用するに設定するとサーバー証明書の検証を行います。 |
デバイス一括設定 | 各デバイス設定メニューにおいて送信対象設定が送信するとなっている各対象の送信先設定を一括で有効/無効を選択できます。 |
各デバイス設定メニューにおける設定
各デバイス設定メニューにおける設定項目
設定項目 | 説明 |
---|---|
ID(pd_web) | WEBサーバーのトークン認証に用いるIDを設定します。 |
Key(pd_web) | WEBサーバーのトークン認証に用いるKeyを設定します。 |
info
- PH社独自仕様WEBサーバーでのデータ送信方法はContent-Typeを "application/json" としてPOSTしています。