LabVIEWでプログラムを書くときの強みの一つは、ユーザーインタフェースであるフロントパネルをドラッグアンドドロップの操作だけで簡単に構築することができることだと思います。
本ブログのまずこれのシリーズでは主にプログラムのアルゴリズムの部分の書き方について解説してきましたが、アルゴリズムを知っているだけではプログラムは書けず、どのような選択肢があるかということも知っておく必要があります。
使い方集は、まずこれのシリーズでステートマシンまでの知識はある程度知っている前提で、アルゴリズム以外に関わるプログラムの書き方について紹介するシリーズです。
本記事ではHTTPリクエストに応答するプログラムを作成できるWeb Serviceについて紹介しています。
なお、内容の一部は以下の別記事と重複していますが、構成を変えて内容を追加しています。
Web Serviceとは
LabVIEWはスタンドアローンのアプリケーションとしてEXE形式で動作させることができますが、この場合にはそれを動かしているPC上でしか表示させることが出来ません。
当たり前と言えば当たり前・・・なのですが、ネット経由で、データを取得できたらそれはそれで便利ですよね。
LabVIEWにはそんな場合のために、クライアントからのHTTPリクエストに対して応答を返すための仕組みをWeb Serviceという形で実現できます。
どんなものかイメージがつかない、という方のために簡単な例を一つお見せします。
Web Serviceの仕組みそのものはLabVIEW VIとして構成します。例えば以下の図のような形です。
これはHTTPリクエストの一つであるGETメソッドを使用し、リクエストを送ることで、現在の時刻を返してくれるプログラムになっています。
実際にウェブブラウザでこれを実行すると現在時刻を表示します。
このようなGETメソッド以外にも、他のHTTPメソッドを用意することができます。
Web Serviceの作り方
ではこういったWeb Serviceをどうやって用意するかについて、基本的なWeb Serviceの作り方を紹介していきます。
まずはLabVIEWでプロジェクトエクスプローラを用意してこれを開き、マイコンピュータで右クリック、新規からWebサービスを選択します。Webサービス名は後で「接続するWeb Service」を指定する際に使用するので、デフォルト名ではなく適切な名前にしておくことをオススメします。
以下の例ではSimpleWebServiceというWebサービス名にしています。
次にWebリソースの部分で右クリックして新規のVIを作ります。よくあるショートカット、Ctrl + Nではなく、必ずWebリソースの部分を右クリックで作るようにしてください。
すると、通常の新規VIとは異なるフロントパネルが出てきます。これがベースとなります。
このVIの名前は、後でURLに表記する際に使用されます。本来VI名にGETなどと入れる必要はないのですが、今回はわかりやすさのためにGETDatetime.viという名前で保存します。
なお、新規VIは必ずHTTPメソッドGET用として生成されます。プロジェクトエクスプローラ上でGETDatetime.vi(GET)などと表示される、この括弧の中身がメソッドの種類を表わします。もし他のHTTPメソッド用のVIを作る場合には、viを右クリックしてPOSTなど他のメソッドを選択します。
さて、今回作るGETDatetime.viの中で、GETのHTTPリクエストに対して応答を返す仕組みを入れます。
やり方は二種類あるのですが、まずはデフォルトの状態で応答を返せる方を紹介します。(他のやり方は後で紹介します)
といってもこれは単純で、応答として返したいデータに表示器をつけ、フロントパネル上でコネクタペーンにその表示器端子を割り当てるだけです。
以下の図は、日付/時間文字列をフォーマット関数の出力であるdatetimeというラベルの付いた文字列表示器を、デフォルトのコネクタペーンの一番右上に対応させている場合の例です。
プログラムができたら、Web Serviceを右クリックして「開始」します。NI Web Serverが構成されている場合、画面に表示される項目をそのまま次へ次へと進めばそれで終わりです。
もしNI Web Serverを構成していない、構成の仕方が分からないという場合には、別記事で紹介していますので参考にしてみてください(NI Webサーバーの構成の項目)。
この別記事ではSystem Designerから開く方法を紹介していますが、なんのことかわからんぞな方はC:\Program Files\National Instruments\Shared\Web Server ConfigのフォルダにあるNIWebServerConfiguration.exeを開く方法で試してみてください。
なお、Web Service側でNi Web Serverを使用できるのはLabVIEW 2020以降です。(これより前だとNI Application Web Serverという別サーバーで動かすことになります)
また、もし開始を押した後に以下の図のようなエラーが出た場合には、(根本的な原因がよくわからないのですがたまに出ることがあります)LabVIEW.exeを管理者権限で実行してやることで開始できるようになることがあるので試してみてください。
ただし管理者権限でLabVIEW自体を開いた後にプロジェクトエクスプローラをダブルクリックすると、管理者権限ではないLabVIEWも同時に立ち上がってしまうので、必ずLabVIEWのファイルメニューの「開く」からプロジェクトを開くようにします。
開始がうまくいったら、ウェブブラウザ上で特定のメソッドをWeb Serviceに投げるようにURL部分を構築していきます。
今回のプログラムの場合、Web Service名がSimpleWebServiceであり、GETメソッドのviの名前がGETDatetimeなので、指定するのはNI Web ServerのURIのあとにSimpleWebService/GETDatetimeというURLになります。(以下の図ではURLを入力しているところにhttp://が表示されていませんが、これを先頭につけます)
正しく実行されれば、日付文字列がJSON文字列として表示されます。
この時の命令は、メソッドURLとしてメソッドVIを右クリックして取得することもできます。ただしこのやり方で表示されるURLは127.0.0.1のローカルIPになります。
大まかに、Web Serviceを用意するためにやることは以上です。
では、HTTPリクエストに対して応答を返すためのもう一つの方法についても紹介します。
そのために、別のHTTP GETリクエストに対するメソッドVIを用意します。今回用意するVIはTestresult.viという名前にしていて、コネクタペーンには端子を設定していないのですが、Webサービスパレットにある二つの関数を使用して、表示させたい結果をJSON文字列として渡しています。
JSON文字列にするには「JSONに平坦化」関数を使用(文字列パレットの文字列を平坦化/非平坦化パレットにアリアス)しますが、この関数への入力はクラスタにしています。
メソッドVIが用意出来たらこれで終わり・・・ではなく、このように応答を書き込むの関数を使用した場合には、このメソッドVIの設定として出力タイプをストリームにする必要があります。
この設定はWebサービスのプロパティから変更できます。
ここまで終わったら、先ほどと同じくWebブラウザ上でURLを打ち込みます。
打ち込む内容は先ほど同様、IPアドレスやWebサービス名、そしてメソッドVI名です。
(以下の図では、上で紹介した図のプログラムの作成タイミングと異なるためIPアドレスが変わっています)
簡単にまとめると、メソッドVIについて大きく二通りの出力のさせ方があり、
- コネクタペーンに出力させたい表示器を接続する
- JSON文字列に変換して応答を書き込むの関数に配線する
のどちらかを選びます。前者は特にWebサービスのプロパティを変更する必要がない(デフォルトでは出力タイプは「端子」となっているため)のに対し、後者では出力タイプについて「ストリーム」にする必要があります。
なお、メソッドがGETではなくPOSTであっても、応答させるための仕組みはGET同様、コネクタペーンに端子を設定する方法や、JSON文字列として応答を書き込む方法があります。
Web Serviceと通信するには
せっかくWeb Serviceを作成しても、これと通信するための仕組みがないと活用できません。
ウェブブラウザのURL入力欄に 通信のための文字列を入力すれば表示されるのは上で紹介しましたが、毎回あれを入力するのかと言われるとそれは不便ですししね。
- HTMLを記述してWebブラウザ上で表示する
- Web ServiceとやりとりするためのHTTPリクエストプログラムを作成する
以下それぞれ見ていきます。
HTMLを記述する
まずは、HTMLを記述してWebサービスにアクセスする方法です。HTML自体はテキストファイルですが、Webブラウザ上で結果を見ることができます。
例えば以下のようなPOSTメソッドVIを用意します。これは、クライアント側からnameという文字列とscoreという数字を受け取ります。Webサービス名はResultcheckになっています。
なお、nameやscoreの制御器はコネクタペーンにつなげている状態にしています(なのでHTTPメソッドVI設定の出力タイプは「端子」です)。
このサービスにアクセスするHTMLの一例が以下のようなものです。テキストファイルに記述して、拡張子を.htmlとしています。
なお、HTMLはこれ専用の文法を知らないと書けない、という弱点があります。当たり前と言われれば当たり前なのですが、知らない人にとっては手軽に使うという意味で苦戦しますよね。
そこでもしLabVIEWの感覚でHTMLを記述する場合には、G Web Development Softwareを使用する、という手があります。
G Web Development Softwareを使用する場合の例は次の記事を参考にしてみてください。
このG Web Development Softwareの使い方を基本から紹介したシリーズもあるのでよければこちらも参考にしてみてください。
HTTPリクエストプログラムを作成する
HTMLを書くことができない、G Web Development Softwareをもっていない、という場合に使えるのが、HTTPリクエストを出せるプログラムを作ることです。(というかG Web Development Softwareを使ったとしても書くプログラムはこれから紹介するものと同様です)
これは別にLabVIEWでなくても、例えばPythonでも作れますが、LabVIEWで用意することもできます。
LabVIEWの関数パレットにHTTPリクエスト用の関数がそろっているので、これらを使用してレスポンスを取得、あとはLabVIEWでおなじみの表示器に表示させることができます。
使い方としても、難しいことを考えなければ関数一つでできたりします。
せっかくなので、POSTで受け取るデータがJSON文字列の場合のWebサービスを例にとります。
Webサービス側でJSON文字列として、リクエスト側(つまりWebクライアント側)からのデータを受け取る場合、ポストデータを読み取るの関数を使って、受け取った文字列をJSONから非平坦化します。
非平坦化とは、平たく言えば元のデータ形式に変換する、という意味で、今回は後述するPOSTリクエスト側でユーザ名とパスワードの二つの文字列を受け取るので、そのクラスタをJSONから非平坦化の関数に指定しています。
あとは変換されたusernameとpasswordの文字列に対して、ユーザ認証(あらかじめ決まったユーザ名とパスワードに、送られてきたデータが一致しているか)を行ってその結果を返します。
このWebサービスをAuthentication.viという名前で保存して、これに対してPOSTリクエストを送ります。その例が以下の図です。
POSTの関数に、URLと送りたいデータを入力します。URLは、Webブラウザに入力するのと同様で、http://<ipアドレス>:<ポート番号>/<webサービス名>/<メソッドVIの名前>
となります。
なお、GETの場合も同じですが、GETはクライアント側から送るデータはないので、URLさえ指定すれば結果を得られます。
GETでもPOSTでも、得られたデータ(本文)がJSON文字列になっているのであれば、JSONから非平坦化を使用してデータを変換することができます。これはPOSTメソッドVIでクライアント側からJSON文字列としてデータを受け取った後の操作と一緒ですね。
Web Serviceを他のPCに配布する
さて、Web Serviceを使ったプログラムの配布については、通常のLabVIEW VIと同じようにEXE化してこれを配布すればいいのですが、その一連の流れや配布先のPCでの操作について確認します。
といっても、必要な手順はEXE作成時にWebサービスを含めることくらいです。ここでいう「EXE作成」の、元になるプログラムはWebサービスのメソッドVIではなく、何か単純なVIで構いません。
もちろん、同じプロジェクトに意味のあるVIがあればそれをEXEにすればいいのですが、ここでは、以下のようにただ単に存在しているだけのVI(webservice_launcher.vi)を例にとります。
このVIをスタートアップVIとして、Webサーバーを含めてビルドしてEXEを作成します。
ただし、これを別のPCで使用するにはその別のPCにNI Webサーバーが必要となります。なので、これ(とEXEを実行するためのLabVIEWランタイムエンジン)を使用できるようにするためにインストーラを作ってしまいます。
インストーラを作成したら、これを別のPCで実行します。上のようにNI Webサーバ系のソフトをインストーラに含める事で、作成したEXE本体とNI Webサーバのソフトが一緒にインストールされます。
一番最初にEXEを実行する際にNI Webサーバ構成の画面が開くので、NI Webサーバを構成して使えるようにする必要があります。
なお、Webサービスが実行中となるのは、EXEが開いている状態の時です。EXEが実行していなくても、開いてさえいればWebサービスにアクセスできるようになります。
なので、EXEは開きっぱなしにして、あとはHTMLや、LabVIEWなどで作ったHTTPリクエストを送るプログラムを使用してWebサービス側のメソッドVIと通信をするようにします。
本記事では、LabVIEWのWeb Serviceについて使い方を中心に紹介しました。
全くWeb Serviceを使わないアプリケーションもありえますし、またただ単にVIを作るのとは違っていくつか特殊な操作があるのでWeb Service自体が敬遠されがちだと思いますがが、外部のプログラムからHTTP通信さえできればデータをやりとりできるといった利点があるためこの記事を参考に慣れてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント