計量処理を Web で(重量値を扱う - その 2)

前回のエントリから前進して、今回は、より具体的な内容に移ります。

fig1
まず、指示計を含めた構成が左の図になります。internet 上に Web サーバがあり、指示計がローカルコンピュータに接続されています。ここで、ローカルコンピュータの IP は 192.168.0.5 であるとします。実際にはローカル側にも複数のコンピュータがありますが、ここでは省略します。
この構成で、Web サービス側からローカル側指示計の重量を取得する方法を、以下を使用して実装したいと思います。

  1. JSONP (javascript)
  2. 重量& HTTP サーバ

1. JSONP (javascript)

Web サーバ側からローカル側にアクセスすることは実現が難しい問題です。したがって、実際に重量を扱う処理は javascript で行い、計量処理の実装も javascript で行うことにします(その実装は今回は行いませんが)。javascript は、スクリプト自体はサーバが保持しますが、実行されるのはローカルコンピュータのブラウザになるからです。
javascript では、Ajax という技術により、非同期にデータを取得することができます。しかし、Ajax ではページ出力元サーバのドメイン以外と通信することができません。そこで、JSONP を利用します。
JSONP は、script タグで参照されるサーバに上記のような条件が発生しないため、その script タグを動的に発行することで外部サーバと通信をするというものです。これら javascript に関する技術は、他の詳しいサイトを参照してください。

2. 重量&HTTP サーバ

JSONP により実際の Web サーバ以外からデータを取れることが分かりました。したがって、次に必要なのは、JSONP でアクセスされるサーバです。
このサーバは、RS232C で指示計から重量値を受信しつつ、リクエストがあれば JSONP でアクセスされる javascript を出力します。この内容は、例えば以下のようなものです。

WeightCallbackFunc({stable: 1, weight: 3872});

こうすることで、重量値(とそのステータス)を Web サービス側 javascript にフィードバックすることができます。
このプログラムは、さほど複雑なプログラムである必要はありません。基本的に接続されるのはブラウザからだけであり、ローカル IP 以外からの接続は拒否します。したがって、重量値の受信機能と最低限のHTTPサーバとしての機能があるだけでよいのです。

実装

JSONP と 重量&HTTPサーバを実装すると、下図のような構成となります。
fig2
具体的な処理は、下記のような流れになります。

  1. クライアントが Web サーバにページをリクエストします。
  2. Web サーバが、192.168.0.5 に JSONP でアクセスする javascript を含むページを出力します。
  3. ブラウザがそのjavascript を処理し、ユーザのクリックによって、http://192.168.0.5/ にアクセスします。
  4. 重量&HTTP サーバは、そのアクセスに対して、最新の重量情報を返します。
  5. 重量情報がコールバックされ、javascript によって重量を扱うことができるようになります。

ここまでの処理が実際に動作しているデモをこちらから見ることができます。
また、デモに使用したページと javascript は、こちらで確認できます(動作はしません)。


以上で、Web サービス化するための障害であった、ローカル側の重量情報の取り扱いが可能になりました。あとは、実際の計量処理を Ajax などを利用して実装するだけであり、単純な計量処理であれば技術的な問題は残っていません。Web サービス化が十分実現可能となります。