2

特定の UPnP 対応テレビ用の非常に単純な SSDP 検出ルーチンを作成しようとしています。これが私のコードの簡素化されたバージョンです:

private void discover() {

String header = "M-SEARCH * HTTP/1.1";
String[][] fields = new String[][] {
        {"ST", "ssdp:all"},
        {"MAN", "\"ssdp:discover\""},
        {"HOST", "239.255.255.250:1900"},
        {"MX", "10"}};

String p=this.make_packet(header, fields);

MulticastSocket s = null;
ArrayList<String> devices=new ArrayList<String>();
String[] ret;
String[] loc;

try {
    InetAddress addr=InetAddress.getByName("239.255.255.250");
    s = new MulticastSocket(1900);
    s.setReuseAddress(true);
    s.setSoTimeout(3000);
    s.joinGroup(addr);

    DatagramPacket pack=new DatagramPacket(p.getBytes("UTF-8"), p.length(), addr, 1900);
    s.send(pack);

    byte[] buffer=new byte[1024];

    DatagramPacket packrec=new DatagramPacket(buffer, 1024);

    for(;;) {
        System.out.println("Waiting for response...");
        s.receive(packrec);
        System.out.println(new String(buffer, 0, packrec.getLength()));
    }

} catch (Exception e) {
    System.out.println(e);
}

}

コンソール経由で Wi​​n8 マシンでコードをコンパイルして実行します。ソケットは常に、送信されるメッセージの 1:1 コピーという 1 つの応答だけを受け取りました。ソケットは最初にマルチキャスト グループに参加するため、これはおそらく正しいと思います。ただし、サード パーティの UPnP インスペクターで見ることはできますが、他の UPnP デバイスは応答しません。

WireShark でネットワーク トラフィックを監視すると、例外はスローされませんが、コードからパッケージがまったく送信されないようです。同じマシンから別の UPnP インスペクタを使用してネットワークをスキャンすると、アウトバウンド パッケージが WireShark に記録されます (奇妙なことに、一部のデバイスの応答は、インスペクタが検出しても記録されません)。

私はこれを4日間いじっていますが、役に立ちません。何か案は?

ありがとう、エリック

PS: JDK 1.8.0_45 (64 ビット)

4

0 に答える 0