次に、本発明の実施形態について、具体的な例を挙げて説明する。なお、以下に説明する実施形態のうち、第1実施形態は参考例であり、第2実施形態が本発明の実施形態に該当する。
(1)第1実施形態
まず、第1実施形態について説明する。
[システム全体の構成]
図1は、パーソナルコンピュータ1(以下、PC1という)、パーソナルコンピュータ2(以下、PC2という)、およびデバイス3を備えてなるシステム全体の構成を示した概略構成図である。
これらの内、PC1とPC2は、LAN(Local Area Network)5を介して通信可能になっている。また、PC1とデバイス3は、USB(Universal Serial Bus)インターフェースを介して通信可能になっている。なお、本実施形態において例示するデバイス3は、プリンタである。
本実施形態において、PC1、2にはマルチタスク機能を備えたOSが搭載され、PC1、2が備えるCPUは、OSのマルチタスク機能により、複数のソフトウェアに基づく処理を時分割で並列に実行することができる。
そして、このマルチタスク機能を利用して、PC1、2上では、本発明に関連するソフトウェアとして、後から詳述するステータスモニタ12、22、リードバックツール13、23、情報分配部15、25などが機能するようになっている。
また、PC1上では、OSが備える標準機能として、物理ポートドライバ16や、デバイス3へ出力する印刷データを印刷ジョブとして管理する印刷スプーラなどが機能するようになっている。デバイス3との通信を行う際には、物理ポートドライバ16によってPC1が備える物理ポート17が制御される。
なお、OSによって提供されるこれらの各種機能そのものは公知なので、ここでの詳細な説明は省略するが、以下の説明においては、PC1が、Windows(登録商標)によって提供される各種機能を有するとの前提で説明を続ける。
PC1、2上で機能するソフトウェアのうち、情報分配部15はサーバーとして機能し、ステータスモニタ12、リードバックツール13、および情報分配部25は、情報分配部15に対するクライアントとして機能する。また、情報分配部25はサーバーとしても機能し、ステータスモニタ22、およびリードバックツール23は、情報分配部25に対するクライアントとして機能する。
より詳しくは、情報分配部15は、ステータスモニタ12、リードバックツール13、および情報分配部25それぞれからの要求に応じて、デバイス3からデバイス情報を取得する。そして、取得したデバイス情報を、ステータスモニタ12、リードバックツール13、および情報分配部25それぞれからの要求に応じて、ステータスモニタ12、リードバックツール13、および情報分配部25それぞれへ提供する。
なお、ステータスモニタ12、22、リードバックツール13、23、情報分配部15、25は、それぞれ同一のプログラムである。これらは同一のプリンタドライバインストールセットに包含され供給されるものである。ただし、本例では、便宜上、PC1とPC2とで、その符号を変えてある。
ステータスモニタ12、リードバックツール13、および情報分配部25は、それぞれが、デバイス情報を利用して各種情報処理を行っている。具体的には、例えば、ステータスモニタ12は、取得したデバイス情報に基づいてデバイス3の状態をほぼリアルタイムで表示部に表示する処理を実行する。
リードバックツール13は、デバイス情報を参照したい利用者が任意に操作してデバイス情報を取得するための専用ツールである。このリードバックツール13を利用すれば、例えば、取得したデバイス情報に基づいてデバイス3のシリアル番号やファームウェアヴァージョン等の情報を表示する処理などを実行することができる。
情報分配部25は、ステータスモニタ22、およびリードバックツール23それぞれからの要求に応じて、情報分配部15からデバイス情報を取得する。そして、取得したデバイス情報を、ステータスモニタ22、およびリードバックツール23それぞれからの要求に応じて、ステータスモニタ22、およびリードバックツール23それぞれへ提供する。
つまり、本実施形態において、情報分配部15、25は、具体的なデバイス情報をどこから取得するか、どのクライアントに対するサーバーとなっているか、といった点が異なるものの、クライアントへデバイス情報を提供するという機能には差異がない。
さらに、図1においては図示を省略してあるが、PC2にデバイスが接続されている場合、情報分配部25は、情報分配部15と全く同様に、PC2に接続されたデバイスからデバイス情報を取得することができる。
また、この場合、情報分配部15は、情報分配部25に対するクライアントとして機能することもでき、PC2に接続されたデバイスから取得されたデバイス情報を、情報分配部25から情報分配部15へ提供することができる。
すなわち、情報分配部15、25は、どちらがサーバーとなり、どちらがクライアントとなるかについて、必要に応じて互いの立場を入れ替えることもできる。このようなことができるのは、情報分配部15、25が、全く同等な機能を備えた同一のプログラムだからである。
ただし、図1においては、サーバーとクライアントの関係を理解しやすくするため、PC2にはデバイスが接続されておらず、且つ、情報分配部15がサーバー、情報分配部25がクライアントとなる関係で機能する事例のみを図示してある。
なお、本実施形態では、情報分配部15に対するクライアントとして、ステータスモニタ12、リードバックツール13、および情報分配部25を例示してあるが、情報分配部15に対するクライアントは、さらに並列にいくつ機能してもよい。また、各クライアントが処理を開始するタイミングや処理を終了するタイミング等は任意であり、クライアント毎に独立したタイミングで構わない。
同様に、情報分配部25に対するクライアントも、ステータスモニタ22、およびリードバックツール23以外にいくつ機能してもよく、それら各クライアントによる処理の開始タイミングや終了タイミング等も任意である。
一方、デバイス3は、PC1側からの要求に応じて、デバイス3に関する情報であるデバイス情報をPC1に対して提供する機能を備えている。
本実施形態の場合、デバイス情報としては、例えば、オンライン、オフラインといった「デバイスの状態に関する情報」、用紙サイズ毎の印刷枚数あるいは総印刷枚数といった「使用頻度に関する情報」が提供される。
また、ドラム交換時期などの「交換部品の使用度合に関する情報」、トナーないしインク残量や記録用紙残量といった「消耗品の消耗度合に関する情報」、紙詰まり回数といった「異常の発生回数に関する情報」なども提供される。これらのデバイス情報のうち、どれを提供するかは、PC1側から送信されてくるコマンドにより指定される。
本実施形態において、PC1がデバイス3に対してデバイス情報を要求する際には、PC1からデバイス3に対してPJLコマンドを送信する。PJL(Printer Job Language;プリンタジョブ言語)は、プリンタが備える各種機能を制御するために用意されたコマンド言語で、Hewlett-Packard社において開発され、その後他社でも採用された周知のものである。
PC1上で機能するクライアント(本実施形態の場合、ステータスモニタ12、およびリードバックツール13)が、情報分配部15に対してコマンド送信要求を送信すると、このコマンド送信要求に応じて情報分配部15がPJLコマンドを出力する。
また、PC2上で機能するクライアント(本実施形態の場合、情報分配部25)が、LAN5経由で情報分配部15に対してコマンド送信要求を送信する場合もある。この場合も、PC2上で機能するクライアントからのコマンド送信要求に応じて、情報分配部15がPJLコマンドを出力する。
情報分配部15が出力したPJLコマンドは、通常の印字データと同様に、プリンタドライバ経由で印刷スプーラに引き渡され、印刷スプーラは、受け取ったPJLコマンドを印刷ジョブとして処理する。その結果、PJLコマンドは、物理ポート17を通じてデバイス3へと出力されることになる。
デバイス3では、通常の印刷データと同様にPJLコマンドを受信するが、受信したデータのヘッダ情報からPJLコマンドであることを認識し、その内容を解析する。その解析の結果、デバイス3が応答可能なPJLコマンドであった場合は、デバイス3が内蔵するメモリに蓄積されているデバイス情報を読み出して、そのデバイス情報をPC1へと送信する。
PC1では、情報分配部15がデバイス3から返されるデバイス情報を取得する。このとき、どのような方法でデバイス情報を取得するかは、PC1−デバイス3間の通信インターフェースによっても変わり得るが、本実施形態において、PC1−デバイス3間はUSBインターフェースを介して接続されている。
そのため、デバイス情報を取得する際には、情報分配部15が情報の受信を行い、受信した情報量が0(ゼロ)であった場合には再び情報の受信を繰り返し、その繰り返し処理によって情報を取得する、という方法がとられる。以下、このような方法でデバイス3からデバイス情報を読み取ることをリードバックを行うという。
リードバックを行うことにより、何らかのデータを受信した場合は、そのデータが所期のデバイス情報であるかどうかをチェックし、所期のデバイス情報でない場合は、さらに受信処理をやり直し、最終的に所期のデバイス情報を取得することになる。
デバイス情報を取得した情報分配部15は、図2に示すように、PC1上で機能するクライアント(本実施形態の場合、ステータスモニタ12、およびリードバックツール13)それぞれに対応付けて用意されたバッファ15A、15Bにデバイス情報を格納する。すなわち、バッファ15A、15Bには、同じ内容のデバイス情報が格納される。
ただし、クライアントが、PC1とは別PCにおいて機能する情報分配部となる場合は、別PC側でバッファが用意されるので、PC1ではバッファを用意せず、直ちにPC2へデバイス情報を送信する。
具体例を交えて説明すると、クライアントが、PC2において機能する情報分配部25となる場合、情報分配部25がバッファ25A、25Bを用意するので、情報分配部15ではバッファを用意せず、直ちにPC2へデバイス情報を送信する。ここで送信されたデバイス情報は、情報分配部25がバッファ25A、25Bに格納することになる。
さて、PC1では、情報分配部15がPC1上のクライアントのいずれかからの要求を受けた場合、情報分配部15は、要求元のクライアントに対応するバッファに格納されたデバイス情報を、要求元のクライアントに対して送信する。
例えば、情報分配部15がステータスモニタ12からの要求を受けた場合であれば、情報分配部15は、ステータスモニタ12に対応するバッファ15Aに格納されたデバイス情報を、ステータスモニタ12へ送信する。
その結果、要求元のクライアント(例えば、ステータスモニタ12)は、デバイス情報を取得することができるので、取得したデバイス情報に基づく情報処理(例えば、デバイス3の状態をPC1の表示部に表示する処理等)を実行することができる。
なお、PC2では、情報分配部25が上記情報分配部15と同様に機能する。すなわち、PC2上のクライアントのいずれかからの要求を受けた場合、情報分配部25は、要求元のクライアントに対応するバッファに格納されたデバイス情報を、要求元のクライアントに対して送信する。
その結果、要求元のクライアント(例えば、ステータスモニタ22)は、デバイス情報を取得することができるので、取得したデバイス情報に基づく情報処理(例えば、デバイス3の状態をPC2の表示部に表示する処理等)を実行することができる。
さて、以上のような仕組みにより、PC1とデバイス3との間、さらにPC1とPC2との間では、PJLコマンドの送受信およびデバイス情報の送受信が行われる。ただし、デバイス3は、PC1側からの要求に応じてデバイス情報を提供するものの、クライアントのいずれが要求元であるのかを認識する仕組みにはなっていない。
そのため、PC1側からのリードバックを受ければ、その時点でデバイス3が要求されていたすべてのデバイス情報をPC1側へ提供する。このような仕組みを採用しているため、情報分配部15が設けられていない場合には、次のような問題が発生する。
例えば、ステータスモニタ12、およびリードバックツール13双方が、デバイス3に対して直接デバイス情報の取得要求を発しするように構成してある場合、デバイス3は、それらに対する応答として返すべきデバイス情報を用意する。
しかし、その後、例えば、ステータスモニタ12が独自にデバイス3からのリードバックを行ってしまうと、リードバックツール13に送信されるべきデバイス情報までステータスモニタ12に送信されてしまう。この場合、送信済みのデバイス情報は、デバイス3の送信バッファ内から消されてしまう。
このような状況になった場合、その後、リードバックツール13がデバイス3からのリードバックを行ったとしても、リードバックツール13では、必要なデバイス情報を受け取れないという事態を招く。
上記同様の情報の取り合いは、クライアントとして機能する情報分配部25とステータスモニタ12との間でも発生し、クライアントとして機能する情報分配部25とリードバックツール13との間でも発生する。
上記情報分配部15は、こうした事態が発生するのを防止するために設けられたものである。具体例を交えて説明すると、例えば、ステータスモニタ12、およびリードバックツール13それぞれがデバイス情報の取得要求を発した場合、それらに対する応答として返すべきデバイス情報をデバイス3が用意する。
情報分配部15は、代表してデバイス3からのリードバックを行い、取得したデバイス情報を複数のバッファ15A、15Bに複製する。また、PC2側に存在するクライアントである情報分配部25に対しては、取得したデバイス情報を送信する。
このような処理が行われるため、ステータスモニタ12、リードバックツール13、および情報分配部25は、独自にデバイス3からのリードバックを行わず、必ず情報分配部15からデバイス情報の提供を受ける。
ここで、例えば、ステータスモニタ12が情報分配部15からデバイス情報の提供を受けた場合、送信済みのデバイス情報はバッファ15A内から消されてしまう。しかし、その後も、バッファ15B内には、複製されたデバイス情報が残っているので、リードバックツール13は、情報分配部15からデバイス情報の提供を受けることができるのである。
なお、以上、情報分配部15の役割について説明したが、情報分配部25も全く同様に機能することで、ステータスモニタ22、およびリードバックツール23に対してデバイス情報を分配する。したがって、ステータスモニタ22とリードバックツール23がデバイス情報を取り合った結果、一方だけがデバイス情報を取得し、他方がデバイス情報を取得できない、といった事態に至るのを防ぐことができる。
[情報分配部における主処理]
次に、上記のような情報分配部15、25の機能を実現するため、情報分配部15、25において実行される主処理について、図3および図4のフローチャートに基づいて説明する。この処理は、情報分配部15、25を機能させたい時点で開始されていればよい処理であり、例えば、PC1の起動に伴って開始される処理となっていればよい。
なお、上述の通り、情報分配部15、25は、まったく同じプログラムである。ただし、図1においては、情報分配部15がサーバーとして機能し、情報分配部25がクライアントとして機能する事例を図示してある。
そこで、以下の説明においては、図1に示す具体的事例との関係も考慮し、サーバーとして機能する部分に関しては、情報分配部15を例に挙げて説明し、クライアントとして機能する部分に関しては、情報分配部25を例に挙げて説明する。
主処理を開始すると、図3に示すように、情報分配部15(正確には、情報分配部15として機能しているPC1のCPU)は、まず、クライアント(ステータスモニタ12、リードバックツール13、および情報分配部25)からの要求待ちになる(S105)。ここで、クライアント(ステータスモニタ12、リードバックツール13、および情報分配部25)のいずれかから何らかの要求があるとS105の処理を抜ける。
続いて、情報分配部15は、PC1内のクライアントから受けた新規クライアント追加要求か否かを判断する(S110)。
S110の処理において、新規クライアント追加要求であった場合(S110:YES)、情報分配部15は、要求元となったクライアントのIDをPC1内のメモリに記憶させる(S115)。
上記IDは、新規クライアント追加要求ごとに情報分配部15によりユニークな値が生成されるものである。このIDは、このクライアントからの追加要求終了時に、戻り値としてクライアントに渡される。
以後クライアントは、後述する別の要求(クライアント削除要求、新規コマンド送信要求、デバイス情報呼び出し情報など)を発行する際に、このIDを指定することにより、その処理対象が自分であることを情報分配部15に知らせる。
図2に示すように、クライアント(ステータスモニタ12、リードバックツール13、および情報分配部25)には、それぞれユニークなID(図2に示した例では、CL−1A、CL−1B、CL−1C)が付与される。
例えば、ステータスモニタ12が新規クライアント追加要求を行った場合を例に挙げれば、その追加要求中にはID:CL−1Aが含まれているので、S115の処理では、ID:CL−1Aを記憶する。以後は、クライアントからの要求中にID:CL−1Aが含まれていれば、その要求がステータスモニタ12からの要求であることを、情報分配部15側で認識できるようになる。
次に、S115の処理を終えたら、要求元となったクライアントに対応するバッファを確保する(S120)。S120の処理で確保されるバッファは、図2に示したバッファ15A、15Bに相当するものである。例えば、ステータスモニタ12が新規クライアント追加要求を行った場合を例に挙げれば、S120の処理によりバッファ15Aが確保されることになる。
そして、S120の処理を終えたら、S105の処理へと戻り、再びS105以降の処理を繰り返す。なお、このバッファは、先のS115の処理により、生成・記憶されたIDと関連づけられて管理される。すなわちIDが与えられれば、対応するバッファが特定できるように管理される。
さて一方、上記S110の処理において、新規クライアント追加要求ではなかった場合(S110:NO)、続いて、情報分配部15は、クライアント削除要求か否かを判断する(S125)。
S125の処理において、クライアント削除要求であった場合(S125:YES)、情報分配部15は、要求元となったクライアントに対応するバッファを削除する(S130)。この際、クライアントはS115の処理で自分に与えられたIDを指定して、この削除要求を発行する。
情報分配部15は、その指定されたIDに対応するバッファを削除するのである。例えば、ステータスモニタ12がクライアント削除要求を行った場合を例に挙げれば、S130の処理によりバッファ15Aが削除されることになる。そして、S130の処理を終えたら、S105の処理へと戻り、再びS105以降の処理を繰り返す。
一方、上記S125の処理において、クライアント削除要求ではなかった場合(S125:NO)、情報分配部15は、新規コマンド送信要求であるか否かを判断する(S135)。本実施形態においては、各クライアント((ステータスモニタ12、リードバックツール13、および情報分配部25)からPJLコマンドを含むコマンド送信要求がクライアントを示すIDとともに送信されてくる。
ただし、これは、各クライアントからPJLコマンドを示すPJL識別子を含むコマンド送信要求を送信するとともに、送信されて来たPJL識別子に基づいて、情報分配部15側でPJL識別子に対応するPJLコマンドを用意するようにしてもよい。
S135の処理において、新規コマンド送信要求であった場合(S135:YES)、情報分配部15は、送信要求されたPJLコマンドをスプーラ経由で物理ポート17を通じてデバイス3へ送信する(S140)。
なお、S140の処理では、送信要求されたPJLコマンドが前記IDと関連付けてメモリに記憶される。そして、S140の処理を終えたら、S105の処理へと戻り、再びS105以降の処理を繰り返す。
一方、S135の処理において、新規コマンド送信要求ではなかった場合(S135:NO)、情報分配部15、25は、図4に示すように、他PCへの接続要求か否かを判断する(S205)。また、他PCへの接続要求ではなかった場合(S205:NO)、他PCからの接続要求か否かを判断する(S225)。
ここで、上記S205の処理では、例えば、PC2において、情報分配部25がステータスモニタ22からの要求を受けた結果、PC1の情報分配部15との通信が必要となった場合に肯定判断がなされる。
また、上記S225の処理では、例えば、PC1において、情報分配部15が情報分配部25からの要求を受けた結果、PC2の情報分配部25との通信が必要となった場合に肯定判断がなされる。
そこで、ここでは、上記の通り、PC2の情報分配部25において上記S205の処理で肯定判断がなされ、PC1の情報分配部15において上記S225の処理で肯定判断がなされた場合を例に挙げて説明を続ける。
PC2の情報分配部25において上記S205の処理で肯定判断がなされた場合(S205:YES)、他PC(本実施形態の場合、PC1)の接続情報を取得する(S210)。他PCの接続情報は、他PCのIPアドレス等、他PCと通信を行う上で必要となる情報である。
本実施形態の場合、PC2は、デバイス3を共有プリンタとして認識するように構成されており、その共有プリンタに関する情報中にS210の処理で取得したい情報が含まれているので、その情報を他PCの接続情報として取得する。
続いて、情報分配部25は、ネットワーク経由で他PCに対し、接続要求を発行し(S215)、他PCが自PCと接続するために必要となる自PC情報(自PCのIPアドレス等)を送信する(S220)。
上記S215の処理により、本実施形態の場合、情報分配部25から情報分配部15へ接続要求が送信されることになる。情報分配部25からの接続要求が送信された場合、S105の処理によってクライアントからの要求待ちとなっていた情報分配部15は、S105の処理を抜けた後、S225の処理で他PCからの接続要求であると判断する(S225:YES)。
この場合、情報分配部15は、接続に必要な他PC情報を受信する(S230)。S230の処理で受信する他PC情報は、上述したS220の処理によって送信された情報である。この他PC情報を受信した情報分配部15は、他PC(PC2)の情報分配部25をクライアントの一つとして認識することになり、そのクライアントのIDをメモリに記憶する(S235)。
なお、以上説明したS210〜S220の処理、あるいは、S230〜S235の処理を終えたら、いずれの場合とも、S105の処理へと戻る。
ちなみに、上述の事例では、情報分配部25がS210〜S220の処理を実行し、情報分配部15がS230〜S235の処理を実行する場合を例に挙げて説明したが、これらの処理が入れ替わることもあり得る。
すなわち、情報分配部15がS210〜S220の処理を実行し、情報分配部25がS230〜S235の処理を実行する状態になることもある。そのような状態になるのは、先に説明した通り、情報分配部25がPC2に接続されたデバイスからデバイス情報を取得し、そのデバイス情報を情報分配部15へ分配する場合である。
さて、以上が他PCとの通信を行う場合についての説明であるが、上記S225の処理において、他PCからの接続要求でもないと判断した場合(S225:NO)、本実施形態では、クライアントからデバイス情報のリード要求を受けたものと判断する。
すなわち、新規クライアント追加要求、クライアント削除要求、新規コマンド送信要求、他PCへの接続要求、および他PCからの接続要求、以上のいずれでもない要求としては、デバイス情報リード要求しか存在しないとの前提で処理を進める。
この場合、情報分配部15は、クライアントが付与したIDに基づいて要求元となったクライアントに対応するバッファをサーチし、そのバッファ内に記憶されたデバイス情報(後述する常駐スレッド処理により記憶されたもの)を読み出す(S240)。そして、読み出したデバイス情報を要求元となったクライアントに送信する(S245)。
例えば、ステータスモニタ12からデバイス情報のリード要求を受けた場合を例に挙げれば、S240の処理によりバッファ15Aからデバイス情報が読み出される。そして、そのデバイス情報が、S240の処理によってクライアントであるステータスモニタ12に送信されることになる。
なお、S240の処理により、バッファから読み出されるデバイス情報は、本処理と並列に実行される常駐スレッド処理によりデバイス3から読み出されてバッファに格納されたものであるが、この常駐スレッド処理の詳細については後述する。
そして、S245の処理を終えたら、送信分のデバイス情報をバッファから削除して(S250)、S105の処理へと戻り、再びS105以降の処理を繰り返す。
[情報分配部における常駐スレッド処理]
次に、情報分配部15、25において主処理と並列に実行される常駐スレッド処理について、図5のフローチャートに基づいて説明する。なお、先に説明した主処理(図3、図4参照)の場合と同様に、サーバーとして機能する部分に関しては、情報分配部15を例に挙げて説明し、クライアントとして機能する部分に関しては、情報分配部25を例に挙げて説明する。
この処理を開始すると、情報分配部15、25は、ターゲット(デバイス情報の取得対象となるデバイス)は他PCのデバイスか否かを判断する(S305)。
本実施形態の場合、PC2において情報分配部25が情報分配部15からデバイス情報を取得する場合であれば(S305:YES)、他PC(本実施形態の場合、PC1)よりデバイス情報を取得する(S310)。このデバイス情報は、情報元となるPC(本例ではPC1)で機能する情報分配部(本例では情報分配部15)のS330の処理(後述)により送り出されたものである。
また、PC1において情報分配部15がデバイス3からデバイス情報を取得する場合であれば(S305:NO)、デバイス3からデバイス情報を読み取る(S315)。
ここで、まだデバイス3に対してPJLコマンドが送信されていない場合など、デバイス3側がデバイス情報を送信できる状態にない場合は、S310またはS315の処理で待機状態になり、何らかの情報を取得したらS310またはS315の処理を抜ける。
続いて、情報分配部15は、ループ処理にてすべてのクライアントを順に処理するため、未処理のクライアントに対応するIDの中から、処理対象とするクライアントに対応する1つのIDを選ぶ(S320)。このS320の処理において、未処理のクライアントに対応するIDとは、上記S115またはS235の処理で記憶されたすべてのIDのうち、S320の処理でまだ選ばれたことがないIDである。
次に、情報分配部15は、S320の処理で選んだIDに対応するクライアントは、他PCの情報分配部か否かを判断する(S325)。ここで、情報分配部15が、情報分配部25のID(CL−1C)を選択していれば(S325:YES)、他PCであるPC2の情報分配部25へデバイス情報を送信し(S330)、後述するS350の処理へと進む。
一方、他PCの情報分配部のIDを選択していなければ(S325:NO)、情報分配部15は、S320の処理で選んだIDに対応するバッファに十分な空き領域があるか否かを判断する(S335)。
そして、バッファに十分な空き領域がない場合は(S335:YES)、古いデバイス情報を捨ててバッファ内の領域を空ける(S340)。一方、バッファに十分な空き領域がある場合は(S335:NO)、S340の処理をスキップする。
こうしてS335の処理またはS340の処理を終えたら、続いて、情報分配部15は、S315の処理で読み取ったデバイス情報を、S320の処理で選んだIDに対応するバッファに追記書き込みする(S345)。このS345の処理により、バッファ15A、15Bにはデバイス情報が格納され、このデバイス情報が上述したS240の処理によってバッファ15A、15Bから読み出されることになる。
そして、S330またはS345の処理を終えたら、上記S115またはS235の処理で記憶されたすべてのIDについての処理が終了したか否かを判断する(S355)。その判断の結果、終了していなければ(S355:NO)、S320の処理へと戻り、再びS320〜S355の処理を繰り返す。
一方、上記S115またはS235の処理で記憶されたすべてのIDについての処理が終了した場合(S355:YES)、この常駐スレッド処理を終了するか否かを判断する(S355)。
その判断の結果、終了する場合は(S355:YES)、常駐スレッド処理を終了する。また、常駐スレッド処理を終了しない場合は(S355:NO)、1秒待機して(S360)、S315の処理へと戻り、再びS315以降の処理を繰り返す。
以上のような常駐スレッド処理が情報分配部15、25において実行されることにより、S310またはS315の処理でデバイス情報を取得する毎に、S320〜S350のループ処理が実行される。その結果、このループ処理により、すべてのクライアントに対応するバッファ(15A、15B、あるいは、25A、25B)にデバイス情報が分配される。
そして、このデバイス情報の分配が完了したら、1秒の待機(S360)を経て、再びデバイス情報を取得するための処理(S305〜S315)以降の処理が繰り返されることになる。
[第1実施形態の効果]
以上説明したように、上記第1実施形態においては、デバイス情報を複数の分配先へ分配することができるので、各分配先において、デバイス情報を利用した情報処理を適切に実施することができる。
したがって、PC1およびPC2の内、いずれか一方にデバイス情報が提供されたことが原因で、他方にデバイス情報を提供できなくなることがない。また、PC1およびPC2それぞれが備える複数のクライアントに関しても、一つのクライアントにデバイス情報が提供されたことが原因で、他のクライアントにデバイス情報を提供できなくなることがない。
さらに、デバイス3からデバイス情報を取得する手段は、PC1にのみ存在し、PC2には存在しないものの、情報分配部15および情報分配部25が協働することにより、PC2においてもデバイス情報を取得できる仕組みになっている。
したがって、PC2側にある手段は、デバイス3と直接通信できなくてもよく、その場合でも、PC2内にある複数のクライアントに、何ら問題なくデバイス情報を提供することができる。
(2)第2実施形態
次に、第2実施形態について説明する。
[システム全体の構成]
図6は、パーソナルコンピュータ30(以下、PC30という)、およびデバイス3を備えてなるシステム全体の構成を示した概略構成図である。
本実施形態において例示するデバイス3も、第1実施形態同様、PJLに対応したプリンタであり、PC30とデバイス3は、USBインターフェースを介して通信可能になっている。
また、PC30には、第1実施形態同様、マルチタスク機能を備えたOS31が搭載されている。このOS31の制御下で、ステータスモニタ32、リードバックツール33、情報分配部35、物理ポートドライバ36などが機能する点、物理ポート37を介してデバイス3との通信を行う点も、第1実施形態同様である。
また、第1実施形態では明示しなかったが、OS31は、カーネルドライバ38を備えている。カーネルドライバ38は、OS31が提供する機能を実現する上で中心的な役割を果たすモジュールで、例えば、PC1が備えるメモリに対する入出力(リード/ライト)機能等は、カーネルドライバ38によって管理される。
さらに、PC30には、OS31の他に、もう一つのOS41が搭載されている。このOS41は、OS31の制御下で機能するソフトウェアによって実現された仮想コンピュータに対してインストールされた形態になっている。
なお、以下の説明において、OS31とOS41を明示的に区別したい場合は、PC1の各部を直接制御する方をホストOS31、ホストOS31の制御下で機能する方をクライアントOS41とも称する。
OS41は、OS31同様、マルチタスク機能を備えたもので、PC30が備えるCPUは、OS41のマルチタスク機能により、複数のソフトウェアに基づく処理を時分割で並列に実行することができる。
そして、このマルチタスク機能を利用して、OS41の制御下では、本発明に関連するソフトウェアとして、ステータスモニタ42、リードバックツール43、情報分配部45などが機能するように構成されている。
また、OS41も、カーネルドライバ46を備え、このカーネルドライバ46を介して、OS31が備えるカーネルドライバ38との間でデータをやり取り可能になっている。
なお、OS31とOS41が、それぞれどのようなOSであるのかは任意であるが、例えば、アーキテクチャが全く異系統のOS、あるいは、アーキテクチャは同系統であるもののバージョンが異なるOSなどを考えることができる。この場合、一方のOSの制御下では作動させることができないソフトウェアを、他方のOSの制御下で作動させる、といった運用が可能となる。
あるいは、OS31とOS41が、全く同じOSであってもよい。この場合、通常の運用を行う場合にはOS31の制御下で各種処理を実行させ、特殊な運用を行う場合にはOS41の制御下で各種処理を実行させる、といった使い分けができる。
なお、OSによって提供されるこれらの各種機能そのものは公知なので、ここでの詳細な説明は省略するが、以下の説明においては、OS31、41の双方が、Windows(登録商標)によって提供される各種機能を有するとの前提で説明を続ける。
ステータスモニタ32、42、リードバックツール33、43、情報分配部35、45等は、サーバーとして機能する情報分配部が、自身に対応するクライアントに対してデバイス情報を分配するように構成されており、この点は第1実施形態と同様である。
すなわち、図7に示すように、情報分配部35は、デバイス3から取得したデバイス情報をバッファ35A、35Bに分配し、各バッファ35A、35Bに格納されたデバイス情報をクライアント(ステータスモニタ32、リードバックツール33)に提供する。
また、情報分配部35は、デバイス3から取得したデバイス情報を、クライアントである情報分配部45へも提供する。情報分配部45は、情報分配部35から取得したデバイス情報をバッファ45A、45Bに分配する。そして、各バッファ45A、45Bに格納されたデバイス情報をクライアント(ステータスモニタ42、リードバックツール43)に提供する。
一方、上記第1実施形態では、情報分配部15と情報分配部25が、別PC上で機能するように構成されていたのに対し、第2実施形態では、情報分配部35と情報分配部45が、同一PC上の別OS上で機能するように構成されており、この点では相違する。
このような相違点があるため、情報分配部35と情報分配部45は、互いに情報伝送を行う際に、第1実施形態とは異なる方式で情報伝送を行うことになる。具体的には、第1実施形態では、LAN5経由での通信が可能なプロトコル(例えば、TCP/IP等)を使って情報伝送を行っていたが、第2実施形態では、OS31、41が、カーネルドライバ38、46経由でPC1内のメモリを共有し、情報伝送を実現する。
ただし、OS31とOS41との間で情報伝送を行うに当たって、どのような方式を採用するかは任意である。
例えば、OS31とOS41との間に仮想ネットワークを実現するモジュールを介在させてもよい。この場合、アプリケーション側(ステータスモニタ32、42、リードバックツール33、43、情報分配部35、45等)からは、第1実施形態と全く同様の通信方式を利用することができるようになる。
なお、第2実施形態においても、ステータスモニタ32、42、リードバックツール33、43、情報分配部35、45は、それぞれ同一のプログラムである。これらは同一のプリンタドライバインストールセットに包含され供給されるものである。ただし、本例では、便宜上、OS31側とOS41側とで、その符号を変えてある。
[情報分配部における主処理]
次に、上記のような情報分配部35、45の機能を実現するため、情報分配部35、45において実行される主処理について、図8および図9のフローチャートに基づいて説明する。この処理は、情報分配部35、45を機能させたい時点で開始されていればよい処理であり、例えば、OS31、OS41の起動に伴って開始される処理となっていればよい。
なお、第2実施形態においても、情報分配部35、45は全く同等に機能するが、第1実施形態同様、サーバーとしての機能については情報分配部35を例に挙げて説明し、クライアントとしての機能については情報分配部45を例に挙げて説明する。また、第1実施形態と差異のない処理等については、第2実施形態では一部説明を省略する。
主処理を開始すると、図8に示すように、情報分配部35は、まず、クライアント(ステータスモニタ32、リードバックツール33、および情報分配部45)からの要求待ちになる(S505)。ここで、クライアント(ステータスモニタ32、リードバックツール33、および情報分配部45)のいずれかから何らかの要求があるとS505の処理を抜ける。
続いて、情報分配部35は、PC30内のクライアントから受けた新規クライアント追加要求か否かを判断する(S510)。S510の処理において、新規クライアント追加要求であった場合(S510:YES)、情報分配部35は、要求元となったクライアントのIDをPC30内のメモリに記憶させる(S515)。
次に、S515の処理を終えたら、要求元となったクライアントに対応するバッファを確保する(S520)。S520の処理で確保されるバッファは、図7に示したバッファ35A、35Bに相当するものである。そして、S520の処理を終えたら、S505の処理へと戻り、再びS505以降の処理を繰り返す。
さて一方、上記S510の処理において、新規クライアント追加要求ではなかった場合(S510:NO)、続いて、情報分配部35は、クライアント削除要求か否かを判断する(S525)。
S525の処理において、クライアント削除要求であった場合(S525:YES)、情報分配部35は、要求元となったクライアントに対応するバッファを削除する(S530)。そして、S530の処理を終えたら、S505の処理へと戻り、再びS505以降の処理を繰り返す。
一方、上記S525の処理において、クライアント削除要求ではなかった場合(S525:NO)、情報分配部35は、新規コマンド送信要求であるか否かを判断する(S535)。
S535の処理において、新規コマンド送信要求であった場合(S535:YES)、情報分配部35は、送信要求されたPJLコマンドをスプーラ経由で物理ポート17を通じてデバイス3へ送信する(S540)。そして、S540の処理を終えたら、S505の処理へと戻り、再びS505以降の処理を繰り返す。
一方、S535の処理において、新規コマンド送信要求ではなかった場合(S535:NO)、情報分配部35、45は、図9に示すように、ホストOSへの接続要求か否かを判断する(S605)。また、ホストOSへの接続要求ではなかった場合(S605:NO)、クライアントOSからの接続要求か否かを判断する(S625)。
ここで、上記S605の処理では、例えば、クライアントOS41の制御下で機能する情報分配部45がステータスモニタ42からの要求を受けた結果、ホストOS31の制御下で機能する情報分配部35との通信が必要となった場合に肯定判断がなされる。
また、上記S625の処理では、例えば、ホストOS31の制御下で機能する情報分配部35がクライアントOS41の制御下で機能する情報分配部45からの要求を受けた結果、情報分配部45との通信が必要となった場合に肯定判断がなされる。
そこで、ここでは、上記の通り、情報分配部45において上記S605の処理で肯定判断がなされ、情報分配部35において上記S625の処理で肯定判断がなされた場合を例に挙げて説明を続ける。
情報分配部45において上記S605の処理で肯定判断がなされた場合(S605:YES)、ホストOS31の接続情報を取得する(S610)。ホストOS31の接続情報は、ホストOS31との間で情報伝送を行う上で必要となる情報である。
続いて、情報分配部45は、ホストOS31に対し、接続要求を発行し(S615)、ホストOS31がクライアントOS41と接続するために必要となる情報を送信する(S620)。
上記S615の処理により、本実施形態の場合、情報分配部45から情報分配部35へ接続要求が送信されることになる。情報分配部45からの接続要求が送信された場合、S505の処理によってクライアントからの要求待ちとなっていた情報分配部35は、S505の処理を抜けた後、S625の処理でクライアントOS41からの接続要求であると判断する(S625:YES)。
この場合、情報分配部35は、接続に必要な情報を受信する(S630)。S630の処理で受信する情報は、上述したS620の処理によって送信された情報である。この情報を受信した情報分配部35は、情報分配部45をクライアントの一つとして認識することになり、そのクライアントのIDをメモリに記憶する(S635)。
なお、以上説明したS610〜S620の処理、あるいは、S630〜S635の処理を終えたら、いずれの場合とも、S505の処理へと戻る。
さて、上記S625の処理において、クライアントOS41からの接続要求でもないと判断した場合(S625:NO)、本実施形態では、クライアントからデバイス情報のリード要求を受けたものと判断する。
この場合、情報分配部35は、クライアントが付与したIDに基づいて要求元となったクライアントに対応するバッファをサーチし、そのバッファ内に記憶されたデバイス情報(後述する常駐スレッド処理により記憶されたもの)を読み出す(S640)。そして、読み出したデバイス情報を要求元となったクライアントに送信する(S645)。
そして、S645の処理を終えたら、送信分のデバイス情報をバッファから削除して(S650)、S505の処理へと戻り、再びS505以降の処理を繰り返す。
[情報分配部における常駐スレッド処理]
次に、情報分配部35、45において主処理と並列に実行される常駐スレッド処理について、図10のフローチャートに基づいて説明する。なお、先に説明した主処理(図8、図9参照)の場合と同様に、サーバーとして機能する部分に関しては、情報分配部35を例に挙げて説明し、クライアントとして機能する部分に関しては、情報分配部45を例に挙げて説明する。
この処理を開始すると、情報分配部35、45は、ターゲット(デバイス情報の取得対象となるデバイス)は自OS制御下のデバイスか否かを判断する(S705)。
本実施形態の場合、情報分配部45であれば、ターゲットが情報分配部35となり、これは自OS制御下のデバイスではないので(S705:NO)、ホストOS31側の情報分配部35よりデバイス情報を取得する(S710)。また、情報分配部35であれば、ターゲットがデバイス3となり、これは自OS制御下のデバイスなので(S705:YES)、デバイス3からデバイス情報を読み取る(S715)。
ここで、まだデバイス3に対してPJLコマンドが送信されていない場合など、デバイス3側がデバイス情報を送信できる状態にない場合は、S710またはS715の処理で待機状態になり、何らかの情報を取得したらS710またはS715の処理を抜ける。
続いて、情報分配部35は、ループ処理にてすべてのクライアントを順に処理するため、未処理のクライアントに対応するIDの中から、処理対象とするクライアントに対応する1つのIDを選ぶ(S720)。
次に、情報分配部35は、S720の処理で選んだIDに対応するクライアントは、クライアントOS側の情報分配部か否かを判断する(S725)。ここで、情報分配部35が、情報分配部45のID(CL−1C)を選択していれば(S725:YES)、クライアントOS側の情報分配部45へデバイス情報を送信し(S730)、後述するS750の処理へと進む。
一方、クライアントOS側の情報分配部45のIDを選択していなければ(S725:NO)、情報分配部35は、S720の処理で選んだIDに対応するバッファに十分な空き領域があるか否かを判断する(S735)。
そして、バッファに十分な空き領域がない場合は(S735:YES)、古いデバイス情報を捨ててバッファ内の領域を空ける(S740)。一方、バッファに十分な空き領域がある場合は(S735:NO)、S740の処理をスキップする。
こうしてS735の処理またはS740の処理を終えたら、続いて、情報分配部35は、S715の処理で読み取ったデバイス情報を、S720の処理で選んだIDに対応するバッファに追記書き込みする(S745)。このS745の処理により、バッファ35A、35Bにはデバイス情報が格納され、このデバイス情報が上述したS640の処理によってバッファ35A、35Bから読み出されることになる。
そして、S730またはS745の処理を終えたら、上記S515またはS635の処理で記憶されたすべてのIDについての処理が終了したか否かを判断する(S755)。その判断の結果、終了していなければ(S755:NO)、S720の処理へと戻り、再びS720〜S755の処理を繰り返す。
一方、上記S515またはS635の処理で記憶されたすべてのIDについての処理が終了した場合(S755:YES)、この常駐スレッド処理を終了するか否かを判断する(S755)。
その判断の結果、終了する場合は(S755:YES)、常駐スレッド処理を終了する。また、常駐スレッド処理を終了しない場合は(S755:NO)、1秒待機して(S760)、S715の処理へと戻り、再びS715以降の処理を繰り返す。
以上のような常駐スレッド処理が情報分配部35、45において実行されることにより、S710またはS715の処理でデバイス情報を取得する毎に、S720〜S750のループ処理が実行される。その結果、このループ処理により、すべてのクライアントに対応するバッファ(35A、35B、あるいは、45A、45B)にデバイス情報が分配される。
そして、このデバイス情報の分配が完了したら、1秒の待機(S760)を経て、再びデバイス情報を取得するための処理(S705〜S715)以降の処理が繰り返されることになる。
[ホストOS−クライアントOS間での情報伝送方法の一例]
次に、ホストOS−クライアントOS間での情報伝送方法について、その一例を説明する。ただし、以下に説明する情報伝送方法は、あくまでも一例に過ぎず、ホストOS−クライアントOS間での情報伝送方法については、様々な具体的手法を考え得る。したがって、第2実施形態において、ホストOS−クライアントOS間で情報伝送を行うに当たって、どのような具体的手法を採用するかは任意である。
本実施形態において、図11に示すように、ホストOS31側では、ホストOS側カーネルドライバ38(クラスドライバ)経由で、メモリへのアクセスができる仕組みになっている。また、クライアントOS41側では、クライアントOS側カーネルドライバ46(クラスドライバ)経由でのリクエストが、ホストOS側カーネルドライバ38に渡り、その結果、メモリへのアクセスができる仕組みになっている。
また、情報分配部35、45は、それぞれの処理の中で、カーネルドライバ38、46に対して指令を与えるための関数(API;Application Program Interface)を呼び出すことにより、カーネルドライバ38、46に対して指令を与えることができる。
APIを利用して与えられる指令は、デバイスマネージャによってI/Oリクエストパケットと呼ばれる単位のデータとされ、そのデータがカーネルドライバ38、46に与えられる。また、カーネルドライバ38、46が相互にデータ通信を行う際にも、I/Oリクエストパケット単位でデータがやり取りされる。
カーネルドライバ38、46は、常にクライアントからの要求に対して応答を返すかたちで機能する。そのため、カーネルドライバ38、46経由で一方から他方へデータ伝送を行う際には、まず、一方がカーネルドライバ38、46に対してデータ送信要求を発行し、カーネルドライバ38、46が、送信要求されたデータを受け取る。
そして、カーネルドライバ38、46が受け取ったデータは、カーネルドライバ38、46がバッファに保持し、他方がカーネルドライバ38、46に対してデータ受信要求を発行した際に、カーネルドライバ38、46のバッファから他方へと伝送される。
以上のような手順で情報を伝送するため、クライアントOS41側のカーネルドライバ46が実行する処理を、図12のフローチャートに示す。また、ホストOS31側のカーネルドライバ38が実行する処理を、図13のフローチャートに示す。
クライアントOS41側のカーネルドライバ46は、I/Oリクエストパケットを受け取った場合、図12に示すように、まず、その要求が、ホスト側からの受信要求かホスト側への送信要求かを判断する(S805)。
S805の処理において、ホスト側からの受信要求であれば(S805:ホスト側からの受信要求)、Rパケットをホスト側から受信する(S810)。そして、受信したデータをクライアントOS41側の情報分配部45に渡して(S815)、処理を終了する。
また、S805の処理において、ホスト側への送信要求であれば(S805:ホスト側への送信要求)、Wパケットをホスト側へ送信し(S820)、処理を終了する。
一方、ホストOS31側のカーネルドライバ38は、I/Oリクエストパケットを受け取った場合、図13に示すように、まず、その要求が、書き込み要求か読み込み要求かを判断する(S905)。
S905の処理において、書き込み要求であった場合(S905:書き込み要求)、要求元がホストOS31側の情報分配部35かクライアントOS41側のカーネルドライバ46かを判断する(S910)。
S910の処理において、要求元がホストOS31側の情報分配部35であった場合(S910:ホストOS側情報分配部)、ホストOS31側の情報分配部35からのデータをRデータバッファに格納し(S920)、処理を終了する。Rデータバッファは、ホストOS31側の情報分配部35からクライアントOS41側のカーネルドライバ46へと伝送されるデータが格納されるバッファである。
S910の処理において、要求元がクライアントOS41側のカーネルドライバ46であった場合(S910:クライアントOS側カーネルドライバ)、クライアントOS41側のカーネルドライバ46からのデータをWデータバッファに格納し(S920)、処理を終了する。
Wデータバッファは、クライアントOS41側のカーネルドライバ46からホストOS31側の情報分配部35へと伝送されるデータが格納されるバッファである。このように、ホストOS31側のカーネルドライバ38は、情報分配部35−カーネルドライバ46間で伝送されるデータを、RデータバッファおよびWデータバッファ、以上2つのバッファを介して伝送する。
S905の処理において、読み込み要求であった場合(S905:読み込み要求)、要求元がホストOS31側の情報分配部35かクライアントOS41側のカーネルドライバ46かを判断する(S925)。
S925の処理において、要求元がホストOS31側の情報分配部35であった場合(S925:ホストOS側情報分配部)、Wデータバッファ内のデータをホストOS31側の情報分配部35に渡し(S930)、処理を終了する。
S925の処理において、要求元がクライアントOS41側のカーネルドライバ46であった場合(S925:クライアントOS側カーネルドライバ)、Rデータバッファ内のデータをクライアントOS41側のカーネルドライバ46に渡し(S935)、処理を終了する。
この例にあっては、クライアントOS側のS810の処理で受信されるデータは、ホストOS側のS915の処理にてホストOS側の情報分配部35より受け取り、S935の処理にてクライアントOS側に渡されたものである。また、クライアントOS側のS820の処理で送信されたデータは、ホストOS側のS920の処理にて受け取られ、S930の処理にてホストOS側の情報分配部35に渡される。
以上、一例を挙げて説明したような方法で、ホストOS−クライアントOS間での情報伝送を実現することができる。
[第2実施形態の効果]
以上説明したように、上記第2実施形態においても、デバイス情報を複数の分配先へ分配することができるので、各分配先において、デバイス情報を利用した情報処理を適切に実施することができる。
したがって、ホストOS31およびクライアントOS41の内、いずれか一方にデバイス情報が提供されたことが原因で、他方にデバイス情報を提供できなくなることがない。また、ホストOS31およびクライアントOS41それぞれの制御下にある複数の分配先に関しても、一つの分配先にデバイス情報が提供されたことが原因で、他の分配先にデバイス情報を提供できなくなることがない。
さらに、デバイス情報をデバイス3から直接取得できる構成は、クライアントOS41の制御下には存在しないものの、情報分配部35、45が協働することにより、クライアントOS41側においてもデバイス情報を取得できる。
したがって、クライアントOS41の制御下にある構成そのものは、デバイス3と直接通信できなくてもよく、その場合でも、クライアントOS41の制御下にある複数の分配先に、何ら問題なくデバイス情報を提供することができる。
[変形例等]
以上、本発明の実施形態について説明したが、本発明は上記の具体的な一実施形態に限定されず、この他にも種々の形態で実施することができる。
例えば、上記実施形態では、デバイスの例としてプリンタを示したが、プリンタ機能を有する複合機(MFP;Multi Function Product)、プリンタ機能を有するファクシミリ装置など、各種プリンタ系デバイスを対象とすることができるのはもちろんである。
また、これらプリンタ系デバイス以外のデバイスであっても本発明の構成を採用することができる。また、PJLコマンドは、一般にプリンタ系デバイスを制御するためのコマンドとして採用されているものなので、プリンタ系デバイス以外のデバイスにおいて本発明の構成を採用する場合には、PJLコマンドとは異なる体系のコマンドを使用してもよい。
また、上記実施形態では、ステータスモニタやリードバックツールから情報分配部への要求を契機として、デバイス情報がステータスモニタやリードバックツールへ提供されるようになっていたが、これに限らない。例えば、情報分配部側が能動的にステータスモニタやリードバックツールへ情報を提供するように構成してもよい。