最上位のマシンを「サーバー」、中間のマシンを「コントローラー」、最下位のマシンを「デバイス」と呼びましょう。デバイスが周辺機器(たとえば、USBまたはシリアルデバイス)であるか、コンピューターであるかは関係ありません。
最初のタスクは、コントローラーにデバイスを照会させることです。これを行うための最良の方法は、実際にはデバイスによって異なります。USBオーディオ/ビデオデバイスのようなものを検討する場合、それらを調整する必要があり、その後、データの連続ストリームを送信します。温度センサーや湿度センサーなどは測定を行うように指示され、データで応答します。
通常、必要な関数を小さなライブラリに書き込み、コマンドラインツールを使用して機能することを確認します。場合によっては、ライブラリが必要ないこともあります。たとえば、デバイスがControllerのカーネルですでにサポートされていて、情報が簡単に利用できる場合などです。(たとえば、ハードドライブの温度センサーについて考えてみます。デバイスがハードディスクの場合、コントローラーはコマンドを使用して(最初のSATA / ATA / SCSIハードディスク)hddtemp /dev/sda
の温度を取得できます。/dev/sda
エンドユーザーは、関心のあるハードディスクを選択できるため、サーバーからコントローラーに選択を移す必要があります。)
次に、コントローラーで実行されるサービスを作成します。このサービスには、すでに作成およびテストされているライブラリ関数が組み込まれているため、デバイスに簡単にアクセスできます。(これにより、コントローラーとデバイスの通信が機能することがわかり、心配する必要はありません。一度に1つずつ)。
このサービスには、プレーンなTCP/IPまたはUDP/IPソケットから、リモートプロシージャコール(RPC)、HTTPなどの高レベルプロトコルまで、さまざまな設計があります。近年、HTTPを使用する最後の方法がますます一般的になり、応答はXML、プレーンテキスト、またはバイナリメディア(通常は画像)になっています。アイデアは、サービスを基本的に、デバイスに直接アクセスできる単なる別のWebサーバーにすることです。セキュリティは、世界中からアクセス可能である必要がないため、より単純です。サーバーからの要求にのみ応答することしかできません。私は、基本的なシェルスクリプト(Bash)、PHP(PHP-CGIとコマンドラインPHP、PHP-CLIの両方)、およびCなどを使用してこのようなサービスを作成しました。最良の選択は、実際には詳細によって異なります。私は個人的に、単純なテキストベースのTCP/IPソケットまたはHTTPのいずれかを好みます。
サーバーでは、コントローラーに接続するPHPページを記述して、要求したいものをすべて要求できます(通常、ユーザーデータに依存し、最初に正常性と安全性を確認します)。PHPには、HTTPリクエストと生のTCP / IPを使用した接続の両方を実行するための簡単な組み込み機能があるため、これに非常に適しています。HTTPプロトコルラッパーが有効になっている場合は、それだけ$handle = fopen("http://192.168.x.x/myservice?param1=" . urlencode($param1) . "¶m2=" . urlencode($param2), "r+b");
です。ソケット接続を取得するには、fsockopen()
代わりに関数を使用します。(詳細についてはfopen()
、httpラッパー、およびwww.php.netfsockopen()
のPHP関数リファレンスを参照してください。)
実際には、PHPページコードは最初にコントローラーへの接続を作成します。次に、エンドユーザーから受け取った関連するサニタイズされたコマンド/パラメーターを含むリクエストを送信します。次に、コントローラーが結果で応答するのを待って(応答を読み取るだけで)、接続を閉じます。応答には必要なすべてのデータが含まれている必要があるため、PHPページはエンドユーザーに対して自由にページを作成できます。
これはどれも本当に難しいことではありませんが、やるべきことはたくさんあります。コントローラーとデバイスの通信で最も多くの作業が必要であることがわかりました。それが行われた後、残りは常に非常に簡単です。
コントローラとデバイスの接続、デバイスが提供するデータの種類(テキスト、数値、画像、大量のバイナリデータなど)、およびパラメータ/コマンドの種類(「1つの結果をお願いします。 ?」、「上に移動」、「どこにいますか?」などの基本的なコマンド)コントローラー/デバイスに送信する必要があると思いますか?もっと具体的にすることができます。
また、PHPに制限されていますか、それともCを使用してControllerサービスを作成することに慣れていますか?私自身、それは非常に良い組み合わせであることがわかりました。
追加するために編集:
一言で言えば、3つのポイントは次のように答えることができます:
fopen("http://ip.add.re.ss:port/", "r+b");
HTTPプロトコルを使用していてPHPがhttpラッパーを許可するように構成されている場合(通常はそうです)を使用するか、を使用しますfsockopen()
。詳細については、上記のリンク先のPHPドキュメントを参照してください。
IP接続されたデバイスでは、コントローラーは基本的にリレーまたはトランスレーターです。通常、これは、コントローラー上で実行され、サーバー(または複数のサーバー)からの着信要求とデバイス(または複数のデバイス)からの応答を管理するデーモンを意味します。これは、デバイスの数が異なる場合や、複数のインターフェイスが必要な場合によく見られます。実際には、コントローラーは上記と同じようにデーモンを実行しますが、プロトコルが標準または十分に単純であるため、ライブラリーを作成する必要がない点が異なります。
サーバー上で実行されているPHPには、コントローラーへの要求の詳細(正確に必要なもの)が含まれている必要があります。コントローラはそれらをデバイスに渡す必要があります。コントローラが接続先のサーバー上のPHPにhttpURLを提供する場合、コントローラはクエリパラメータを解析し、デバイスが理解できる形式に変換できます。実際の特定の問題の1つは、同時アクセスを処理することです。通常、コントローラーからデバイスへの接続は1つだけですが、複数のPHPが同時にコントローラーに接続する場合があります。したがって、いくつかの簿記が含まれます。場合によっては、デバイスはデータの継続的なストリーム(またはデータの定期的な更新)をコントローラーに提供し、コントローラーは単にタブを保持します。サーバー上で実行されているPHPがコントローラーから何かを照会すると、コントローラは、最新のデータを検索し(デバイスにまったく接続せず、通常どおりデータを受信するだけです)、それに応答します。ここでは、コントローラーからサーバーへの応答にタイムスタンプ、さらにはデータの経過時間を含めるのが一般的です。
あなたは本当にあなたの質問にいくつかの詳細を追加する必要があります。(反対票は詳細が不足しているためだと思います。)デバイスの正確なメーカーとモデルを教えていただく必要はありません。受信機(テレビ?ラジオ?気象観測所?)かセンサークラスターか、ドアロック、そして通信プロトコル(どれ)の詳細を知っているか?これまでのところ、IPを使用していることしかわかっていません。それはまったく役に立ちません。今日ではほとんどすべてがIPを使用しています。これが私の答えがとても曖昧な理由でもあります。もっと正確に言いたいのですが、あなたは私がそうするのに十分な情報を提供してくれません。