2

私の問題は少し奇妙だと感じていますが、ここに行きます...

ソケットを使用してイーサネット経由でハードウェアに接続されたカメラと対話するC++プログラム(別の組織から)があります。表面的には、ソケットにメッセージを送信する最初の関数は次のとおりです。

char* cmd = "#TRGON\x0d";
m_pClient->Socket_Write( (BYTE*)cmd, strlen( cmd ));

コードを掘り下げて調べたところ、実際にデータを送信する最下位レベルの関数が見つかりました。

// Try to send what's in the buffer
int nFlags = 0;
int nSent = ::send( m_hSocket, (char*)m_pSendBuffer, m_nSendBufLen, nFlags );
...checking for errors, etc.

今、私が取り組んでいるプログラムは、Javaで書かれていることを除いて、同様のコマンドをカメラに送信する必要があります。私は一日中Javaソケットで遊んでいて、適切なアドレスに接続する以外の多くのことをカメラに実行させることができませんでした(LEDライトをトリガーするコマンドがあります)。

オンラインで調べてみると、この「送信」コマンドは、C++プログラムがカプセル化するWinsockライブラリからのものであることがわかりました。Javaでこれを行う同様の方法はありますか?または、JavaでDataOutputStreams、ソケットなどの正しい組み合わせを使用していないだけですか?私が見逃している「インポートウィンソック」はありますか(グーグルはそのようなものはないと言っているようです)?

助けてくれてありがとう。

編集:

コードが役立つかどうかは本当にわかりません!この時点で、私は基本的なことをしているだけです。接続して、それに書き込もうとしています。私はすべての組み合わせ、変換などを試したようです。これは単なるテストコードです(catchブロックのように、明らかに堅牢でも適切でもありません)。

InetAddress addr = null;
Socket sock = null;
ObjectInputStream in = null;
ObjectOutputStream out = null;

String msg = "#TRGON\\x0d";

try {
    addr = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168,
        (byte) 81, (byte) 58 });

    sock = new Socket(addr, PORT);

    out = new ObjectOutputStream(sock.getOutputStream());

    out.writeBytes(msg);

    in = new ObjectInputStream(sock.getInputStream());

} catch (IOException e) {
    e.printStackTrace();
}

そこの最後の行、in =new...にぶら下がっています。まるでカメラからどのタイプの入力ストリームも取得していないかのようです。引き続き試してみることができますが、外部からのアドバイスをいただければ幸いです。

4

3 に答える 3

3

一般的に、それは次のように簡単でなければなりません:

Socket s = new Socket("hostname", port);
OutputStream os = s.getOutputStream();
os.write("#TRGON\r".getBytes());
os.flush();

それで、あなたの問題は正確には何ですか?もちろん、接続が文字ベースに見える場合は、を使用せずにDataOutputStream、代わりに単純なASCII文字列を記述してください。

[編集:に置き換え\x0d\r]

于 2010-08-17T20:06:27.043 に答える
2

C++はプレーンバイトを受け入れるようです。したがって、Javaでも同じことを行う必要があります。

InetAddress addr = InetAddress.getByName("192.168.81.58");
Socket s = new Socket(addr, PORT);
OutputStream out = s.getOutputStream();
out.write("#TRGON\\x0d".getBytes());
s.close();

それは私が思うにそれが得るのと同じくらい生です。

于 2010-08-17T20:08:19.297 に答える
1

送信されるコマンド文字列には別の形式が必要であることがわかりました。それ以外の

"#TRGON\x0d"

私は使用する必要がありました

"#TRGON\r"

16進指定子は必要ありませんでした。返信ありがとうございます!

于 2010-08-18T18:50:02.563 に答える