To index
What is GSN? Protocol Sample Code Problems Amateur Radio Links

Protocolについて
コンセプト
構成
転送プロトコル
GS Controll Protocol
Controller&Database
今後の予定
遠隔計算構築方法
Appendix


 <gSOAPマニュアル>

/* gSOAPを用いた加算,積算,2乗を計算するClient,Serverの構築 */
/* Author: Naoki Miyashita (Tokyo Institute of Technology) */
/* E-mail: miyashita@lss.mes.titech.ac.jp */
/* Environment: Microsoft Visual C++ 6.0 Enterprise SP5 English Version */
/* gSOAP web: http://www.cs.fsu.edu/~engelen/soap.html */
/* Download file name: gsoap-win32-2.1.10.zip */
/* Checked library version: 2.1.10 */
/* Last Update: 13th Jan 2003 17:52 (JST) */

gSOAPは,Florida State UniversityのRobert A. van Engelenによって開発されたC/C++を用いたSOAPライブラリである.
gSOAPは,http://www.cs.fsu.edu/~engelen/soap.html よりダウンロードできる.
本マニュアルで使用したヴァージョンは,2.1.10であり,ファイル名は,gsoap-win32-2.1.10.zipである.
開発環境として,Visual C++ 6.0 SP5英語版を用いている.

このマニュアルでは,gSOAPを用いて以下のSOAPサービスを構築する.
本サンプルでgSOAPを理解し,GSNのサンプルコードの理解に役立てばと考えている.

サンプルサービス
サービス メソッド名 パラメータ1(型) パラメータ2(型) レスポンスデータ(型)
加算計算 add a (double) b (double) result (double)
積算計算 sub a (double) b (double) result (double)
2乗計算 square a (double) - result (double)

このサンプルでは計算を行っているが,GSNの場合,この計算ルーチンが実際のアンテナ制御ルーチンに入れ替わる事になる.


*注意! ここで示す例は構築方法の一例であるため,最適な方法とは限らない *

1.開発用のベースフォルダ"calc"を作る.
 (フォルダ名は任意であるが,本稿では以下"calc"として扱う)


2.ベースフォルダ"calc"内に,加算,積算,2乗計算に関する,メソッド名,パラメータ名,パラメータデータ型を"calc.h"ファイルに記述する.

また,calc.hの最初の部分には,C++言語におけるデータ型を,SOAPペイロード内で用いている XML Schemaのdatatypeにtypedefしている.

ここで,int ns__add(xsd__double a, xsd__double b, xsd__double &result);の行を解説する.
まず,関数の戻り値はintとなっているがこれは,gSOAPライブラリ内で利用する戻り値で,SOAPサービスにおける戻り値(レスポンス)は,参照&をつけて引数として扱う."ns__add"は,"__"(アンダースコア2つ)で区切られており,左側は名前空間を,右側はメソッド名を表す.名前空間に関してはここでは説明を避ける.上記の場合,
名前空間:ns:デフォルト値
メソッド名:"add"
パラメータ名1:"a"
パラメータデータ型1:"double"
パラメータ名2:"b"
パラメータデータ型2:"double"
戻り値名:"result"
戻り値データ型:"double"


3.ダウンロードしたファイルを解凍すると中に "soapcpp2.exe", "stdsoap2.h", "stdsoap2.cpp" ファイルがあるので,ベースフォルダ"calc"内にコピーする.


4.ソースコード作成
gSOAPは,ほかのSOAPライブラリとは違い,上記で設定したcalc.hを読み込み,その各サービスに関して,サーバ,クライアント用のソースコードを生成する.calc.hを読み込んでソースコードを生成するソフトは,”3”でコピーした"soapcpp2.exe"である.この実行ファイルを,読み込むファイル名を引数として実行するとソースコードが生成される.
soapcpp2.exeをコマンドプロンプトなどから実行するのは,環境変数(PATH)などを考えても少々面倒なので,バッチファイル(calc.bat)をメモ帳などで生成する.
///////////// 以下 バッチファイル"calc.bat" ///////////////
soapcpp2.exe calc.h
///////////// 以上 ファイル"calc.h" ///////////////


5.calc.batをダブルクリックして実行(ソースコードなどが複数生成される)

生成ファイル例と解説
soapH.h :クライアントおよびサーバーソフトウェアに#includeするファイル
soapStub.h :calc.hで規定したサービスの,サーバ側,クライアント側用のプロトタイプ宣言などがあるファイル
soapC.cpp :クライアント,サーバソフトともに使用するソースファイル
soapClient.cpp :クライアントソフト側で使用するソースファイル
soapServer.cpp :サーバソフト側で使用するソースファイル
ns.nsmap :namespaceを規定しているファイルで,クライアントおよびサーバソフトウェアで#includeする.
ns.xsd :namespaceのxml schemaファイル
ns.wsdl :このサービスを記述しているWSDLファイル
ns.add.req.xml :addメソッドに関するレクエストのSOAPメッセージ例
ns.sqrt.res.xml :sqrtメソッドに関するレクエストのSOAPメッセージ例
ns.sub.res.xml :subメソッドに関するレクエストのSOAPメッセージ例
ns.add.res.xml :addメソッドに関するレスポンスのSOAPメッセージ例
ns.sqrt.req.xml :sqrtメソッドに関するレスポンスのSOAPメッセージ例
ns.sub.req.xml :subメソッドに関するレスポンスのSOAPメッセージ例


6.次にVisual C++から,サーバおよびクライアント用のプロジェクトを生成する.
Visual C++では,同じフォルダ内に二つのソフトウェアを共存することは難しい.そこで,ベースフォルダ"calc"に,"Server"および"Client"というプロジェクトを生成する.2つのプロジェクトを生成する前に,ブランクワークスペース"calc"を生成する.
6.1 Visual C++の"File"メニューから"New"を選択する."New"ダイアログが表示される.
6.2 "Workspaces"タブから,"Blank Workspace"を選択し,右側の"Workspace name"は,"calc","Location"は,ベースフォルダ"calc"に設定する.ここで,"Location"が,ベースフォルダ"calc"の下に更に"calc"フォルダを作らない様に注意する.
6.3 "Workspace"ウインドウの"FileView"タブに,"Workspace 'calc': 0 project(s)"となっているはずである.その部分を右クリックし,"Add New Project to Workspace"を選択する."New"ダイアログが表示される.
6.3 "Projects"タブから,Win32 Console Application"を選択し,"Project name"を"Server"とし,"Location"を,ベースフォルダ"calc"の下に"Server"となるように設定し"OK"を押す.
6.4 "Win32 Console Application -Step 1 of 1"ダイアログで,"A simple application"を選択し"Finish"する.
6.5 次に"Client"プロジェクトを同様に制作する."Workspace"ウインドウの"FileView"タブの"Workspace 'calc': 1 project(s)"を右クリックし,"Add New Project to Workspace"を選択する."New"ダイアログが表示される.
6.6 "Projects"タブから,Win32 Console Application"を選択し,"Project name"を"Client"とし,"Location"を,ベースフォルダ"calc"の下に"Client"となるように設定し"OK"を押す.
6.7 "Win32 Console Application -Step 1 of 1"ダイアログで,"A simple application"を選択し"Finish"ボタンを押す.


7. ”5”で生成されたヘッダ,ソースファイルをプロジェクトに取り込む
(補足:Visual C++で,ワークスペースに複数のプロジェクトが存在している場合,ビルドなど各種操作は一つのアクティブプロジェクトに対してのみ行われる.プロジェクトをアクティブにするためには,"Workspace"ウインドウの"FileView"タブ内に,"Client files"または,"Server files"の部分で右クリックをし,"Set as Active Project"を選択することで変更できる)
7.1 サーバプロジェクトへファイルを追加する.サーバプロジェクトを上記の補足の方法でアクティブにする.
7.2 "Workspace"ウインドウの"FileView"タブ内の"Server files"以下にある"Source Files"で右クリックをし"Add Files to Folder"を選択する."Insert Files into Project"ダイアログが生成される.
7.3 ベースフォルダ"calc"から,"stdsoap2.cpp", "soapServer.cpp", "soapC.cpp"をCtrlキーを押しながら複数選択し"OK"ボタンを押す.
7.4 "Workspace"ウインドウの"FileView"タブ内の"Server files"以下にある"Header Files"で右クリックをし"Add Files to Folder"を選択する."Insert Files into Project"ダイアログが生成される.
7.5 ベースフォルダ"calc"から,"stdsoap2.h", "soapStub.h", "soapH.h", "calc.h"をCtrlキーを押しながら複数選択し"OK"ボタンを押す. 7.6 クライアントプロジェクトへファイルを追加する.クライアントプロジェクトを上記の補足の方法でアクティブにする.
7.7 "Workspace"ウインドウの"FileView"タブ内の"Client files"以下にある"Source Files"で右クリックをし"Add Files to Folder"を選択する."Insert Files into Project"ダイアログが生成される.
7.8 ベースフォルダ"calc"から,"stdsoap2.cpp", "soapClient.cpp", "soapC.cpp"をCtrlキーを押しながら複数選択し"OK"ボタンを押す.
7.9 "Workspace"ウインドウの"FileView"タブ内の"Client files"以下にある"Header Files"で右クリックをし"Add Files to Folder"を選択する."Insert Files into Project"ダイアログが生成される.
7.10 ベースフォルダ"calc"から,"stdsoap2.h", "soapStub.h", "soapH.h", "calc.h"をCtrlキーを押しながら複数選択し"OK"ボタンを押す.


8.各種プロジェクトの設定
8.1 メインメニューの"Project"メニューから"Setting"を選択する."Project Setting"ダイアログが生成される.ここでの設定は,ServerおよびClientに共通の設定項目であり,ServerおよびClientのDebug,Release両モードにそれぞれ適用する.
8.2 右側の"Link"タブをクリックする.
8.3 "Object/library modules:"という部分の最後に,"wsock32.lib"を追加する.
8.4 右側の"C/C++"タブをクリックし,"Category"から"Preprocessor"を選ぶ.
8.5 "Additional include directories"に,"../"を追加する(ここで,両側の" "は,入力に含めない)
8.6 右側の"C/C++"タブをクリックし,"Category"から"Precompiled Headers"を選ぶ.
8.7 "Use precompiled header file(.pch)"から,"Not using precompiled header"に変更する.


9.サーバソフトウェアの作成.
9.1 "Server"プロジェクトのソースファイルServer.cppを以下のように編集する.

9.2 メインメニューの"Build"メニューから"Build Server.exe"を選択しビルドする.


10 クライアントソフトウェアの作成.
10.1 "Client"プロジェクトのソースファイル"Client.cpp"を以下のように編集する.

ここで,"localhost"とは,開発しているホスト自身を示している."127.0.0.1"や,実際にホストのIPアドレスを取得してそれを入力してもよい.
10.2 メインメニューの"Build"メニューから"Build Client.exe"を選択しビルドする.


11 実行する.
11.1 "Server"プロジェクトをアクティブプロジェクトにして,メインメニューの"Build"メニューから"Execute Server.exe"を選択し実行する.
11.2 "Client"プロジェクトをアクティブプロジェクトにして,メインメニューの"Build"メニューから"Execute Client.exe"を選択し実行する.
11.3 以下のような結果が出れば成功である.
"Server.exe":a = 3.000000, b = 5.000000, result = 8.000000
"Client.exe":a = 3.000000, b = 5.000000, result = 8.000000
11.4 今回は,同じホスト上にServerとClientを立てて計算を行ったが,例えばクライアントを違うホストから実行すれば遠隔で計算ができる.その際,"Client.cpp"の"localhost"の部分をサーバのIPアドレスに変更する必要がある.


12 サービスの追加
12.1 "calc.h"の更新
 サービスを追加する場合は,"calc.h"の内容を以下のように変更する.例えば,平方根を求めるサービスを追加する場合は,
 "calc.h"を更新した場合,”5”で行ったように"calc.bat"を実行して,各種ファイルを生成しても良いが,Visual C++のビルドを行うと自動で生成する方法を紹介する.
12.2 "calc.h"更新とビルドとの連携(コンパイル前にsoapcpp2.exeを実行する)
 メインメニューの"Project"メニューから"Setting"を選択する.
12.3 左側の"Client"プロジェクトの中の"Header Files"の中の"calc.h"を選択し,右側の"Custom Build"タブを選択する.
12.4 "Commands"の部分に以下の一行を入力する.
///////////// 以下 入力する内容 ///////////////
..\soapcpp2.exe -d .. ..\calc.h
///////////// 以上 入力する内容 ///////////////
12.5 "Outputs"の部分に以下の一行を入力する.
///////////// 以下 入力する内容 ///////////////
soapStub.h;soapH.h;soapC.cpp;soapClient.cpp;soapServer.cpp
///////////// 以上 入力する内容 ///////////////
12.6 続いて"Server"プロジェクトの"calc.h"に対しても同じ作業をする.左側の"Server"プロジェクトの中の"Header Files"の中の"calc.h"を選択し,右側の"Custom Build"タブを選択する.
12.7 "Commands"の部分に以下の一行を入力する.
///////////// 以下 入力する内容 ///////////////
..\soapcpp2.exe -d .. ..\calc.h
///////////// 以上 入力する内容 ///////////////
12.8 "Outputs"の部分に以下の一行を入力する.
///////////// 以下 入力する内容 ///////////////
soapStub.h;soapH.h;soapC.cpp;soapClient.cpp;soapServer.cpp
///////////// 以上 入力する内容 ///////////////
12.9 以上の作業で,"Build"をする際に,"calc.h"が更新されていると,"Commands"の部分を実行し,各種ファイルを生成してからコンパイル,リンクする事になる.
12.10 以上のように"calc.h"とビルドを連携させると,"外部からファイルが更新されている”などのメッセージが頻繁にでるようになる.これに対して,メインメニューの"Tools"の"Options"を選択し,"Options"ダイアログが開いたら,"Editor"タブ内の"Automatic reload of externally modified files"にチェックを入れると外部更新に対して自動でプロジェクト内のファイルを更新してくれる.


13 文字列"string型”とSOAP-FAULTの取り扱い
 この節では,gSOAPを用いて文字列型(string型)を扱う方法と,サーバ側でSOAP FAULTメッセージを発行する方法を紹介する.SOAP FAULTとは,SOAPを用いたRPCサービス上でエラーが発生したときに発行されるメッセージである.
エラーには,
(a)通信に関するエラー(例えば,接続ができないなど)
(b)クライアントのデータに関するエラー(例えば,送られたデータの内容に誤りがあるなど)
と大別できる.(a)の通信エラーに関しては,gSOAPのライブラリが自動で生成する機能を持っている.
(b)に関しては,サーバ側でデータを受け取った時点でエラーだと判定されればSOAP Faultメッセージを発行しなければならない.
13.1 ユーザ認証サービスの追加
 サンプルのサービスとして,ユーザIDとパスワードを文字列で送信し,サーバ側で認証するサービスを追加する.認証に失敗した際は,SOAP Faultを発行する."calc.h"に以下の様に編集する.
*注意,”12”サービスの追加で説明した平方根計算サービスは削除してある.
13.2 クライアントの作成
 "Client.cpp"を以下の様に編集する.

13.3 サーバの作成
 "Server.cpp"を以下の様に編集する.

13.4 実行する.
 "Server"プロジェクトをアクティブプロジェクトにして,メインメニューの"Build"メニューから"Execute Server.exe"を選択し実行する.
 "Client"プロジェクトをアクティブプロジェクトにして,メインメニューの"Build"メニューから"Execute Client.exe"を選択し実行する.
 認証成功と失敗の両結果が得られるはずである.失敗時は,SOAP-FAULTによるエラーが発生するはずである.また,ここで,サーバを起動していない状態で,クライアントソフト実行すると,"Host not found"などのSOAP Faultが発生するはずである.




(C)2003 Ground Station Network