HTTP

HTTP のドライバーの手引き。HTTP と HTTPS のエンドポイントをタグとして読むこと、資格情報、パスの対応、本文の解釈、PUT の書き込み、そして型。

Markdown で表示

HTTP のドライバーは、ふつうの HTTP のエンドポイントをタグとして読みます。小さな Web サーバーを持つ LAN のセンサー、決まった URL に測定値を出すゲートウェイ、自分で用意したサービスなどです。製品の中でいちばん単純な、こちらから接続する方式のドライバーです。Ganter Lab のほうから現場設備につなぎ、飾りのない GET の要求を出して、応答の本文をそのまま 1 つの値として読みます。

このドライバーが何のためのものかは、2 つの性質が線を引きます。

  • 通信はアドレスが名指しするものです。ホストを https://host と書いた機器は、そのサービスに TLS で届きます。ホストだけを書けば、ふつうの HTTP です。どちらの場合も、ドライバーは機器の資格情報を要求のたびに送ります。HTTP Basic としてのユーザー名とパスワード、またはベアラーのトークンです。AVEVA PIRedfish のドライバーがその 2 つのサービスのためにさらに持っているのは、それぞれの語彙です。PI のパスや WebId、Redfish のリソースの木であり、このドライバーはそれらを知りません。
  • 応答の本文の全体が値です。このドライバーは JSON の項目を取り出す道具ではありません。数値のタグは、本文が数値そのものであることを期待します。

接続の項目

項目 意味 形式 既定
ホスト エンドポイントのホスト名か IP アドレス。https://host と書けば TLS で届き、それが資格情報を通信路にさらさない方法です。ホストだけを書けば、ふつうの HTTP です。 ホスト名、IP、またはそのどちらかの前に http://https:// を付けたもの
ポート TCP のポート。0 はその通信が答えるポート、つまりふつうの HTTP なら 80、HTTPS なら 443 という意味です。 ポート番号 0
リソースのパス すべてのタグのパスの前に置く、任意のパスの接頭辞です。たとえば api/v2。空なら何も付けません。 パスの文字列
ユーザー名 HTTP Basic の認証のためのアカウントで、ベアラーのトークンを設定していないときにだけ使われます。空のまま(トークンもなし)なら、要求は匿名になります。 自由記述
パスワード ユーザー名と組になるパスワード。Windows のユーザーごとに保存時に保護されます。別の Windows アカウントで入力した秘密は読めないものとして表示されるので、入力し直してください。 自由記述
ベアラーのトークン 要求のたびに Authorization: Bearer … として送るトークン。設定されているときは、ユーザー名とパスワードの組より優先されます。同じやり方で保存時に保護されます。 トークンの文字列

接続のとき、ドライバーは設定したアドレス、つまりホストとリソースのパスに HEAD の要求を出して確かめます。HEAD が実装されていなければ GET に切り替え、どちらかがうまく答えた相手は到達できたと数えます。ですから、ルートが 404 を返し、API のほうはふつうに答えるサービスも、リソースのパスが API を指しているかぎりオンラインです。HTTPS では、サービスの TLS の証明書が Windows のふつうの証明書の検証を通らなければなりません。TLS を名指ししないアドレスでは資格情報が暗号化されずに流れるので、機器がつながるときにステーションがコネクターの日誌にそう書きます。要求ごとに 10 秒を与えます。接続は受け付けるのに何も言わないエンドポイントは、1 回の読み取りを損なうだけで、機器の全体は損ないません。同じ 1 巡でその機器のほかのタグも読むからです。読み出し周期は設定できます。機器の既定(1000 ms)は、自分の周期を書いていないすべてのタグに効きます。

タグのアドレス指定

タグのパスの項目は、機器のリソースのパスから見た URL のパスです。

項目 意味 受け付ける値 既定
パス このタグのために要求するパス。完全な URL は <transport>://<host>:<port>/<resource path>/<path> です。 自由記述(必須)

例:ホストが 192.168.0.40、リソースのパスが api、タグのパスが sensors/temp なら、http://192.168.0.40/api/sensors/temp を読みます。

読み取り

読み出しのたびに、そのタグの URL を GET し、応答の本文の全体を、タグに宣言したデータ型として解釈します。

受け付ける本文
Float 数値。言語に依らない形式(21.5、小数点はピリオド、桁区切りなし)
Int32 整数(42
Boolean truefalse
String 何でも。本文がそのまま値です(JSON の文書は、その生の文字列として届きます)

宣言した型として解釈できない本文や、成功以外の状態コードは、失敗した読み取りになります。タグは品質の悪い状態になり、読み取りに失敗したときの方針が何を見せるかを決めます。Connector のページに書いてあるとおりです。

書き込み

書き込めるアクセスのタグは、同じ URL へ PUT で書きます。本文は JSON としての値で、コンテンツタイプは application/json です。数値は裸のリテラル(42.5)、ブール値は truefalse、文字列は引用符付き("automatic")で送ります。それをどう受け取るかは、相手のエンドポイントが決めます。成功以外の状態は、失敗した書き込みになります。ほかのすべてと同じで、書き込みの入力欄は工業値を受け取り、生値がバスに出る前にそのタグの変換の段階が逆向きに適用されます。Connector のページに書いてあるとおりです。

対応するデータ型

Boolean、Int32、Float、String です。

コマンド

タグは値を読みます。コマンドは、サービスに何かをするよう頼みます。1 つずつ機器のページのコマンドのカードで宣言してください。名前、POST する先のパス(機器自身のアドレスの下で、タグのパスとまったく同じ書き方です)、そして受け取る 1 つの値の名前(任意)です。行の実行の操作がそれを送り、サービスが何と答えたかを伝えます。コマンドは、このステーション自身の OPC UA のアドレス空間で機器のメソッドにもなるので、メソッドを呼べるものなら何からでも出せます。入力した値は、書いたそのままで要求の本文として送られます。

サービスが答えたものが、コマンドの結果です。サービスが成功の範囲の外の状態を返したのは、接続が失敗したのではなく、サービスがそのコマンドを拒否したということです。その拒否は状態を名指しし、サービスが一緒に言ったことを引用します(「HTTP 500:バーナーがロックアウトしています」)。それによって機器のほかのものが乱されることはありません。

機器検出

このドライバーに機器検出のスキャンはありません。エンドポイントはホストで、値はパスで、1 つずつ追加してください。機器を追加する流れは Connector のページにあります。