特定の 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);
}
}
コンソール経由で Win8 マシンでコードをコンパイルして実行します。ソケットは常に、送信されるメッセージの 1:1 コピーという 1 つの応答だけを受け取りました。ソケットは最初にマルチキャスト グループに参加するため、これはおそらく正しいと思います。ただし、サード パーティの UPnP インスペクターで見ることはできますが、他の UPnP デバイスは応答しません。
WireShark でネットワーク トラフィックを監視すると、例外はスローされませんが、コードからパッケージがまったく送信されないようです。同じマシンから別の UPnP インスペクタを使用してネットワークをスキャンすると、アウトバウンド パッケージが WireShark に記録されます (奇妙なことに、一部のデバイスの応答は、インスペクタが検出しても記録されません)。
私はこれを4日間いじっていますが、役に立ちません。何か案は?
ありがとう、エリック
PS: JDK 1.8.0_45 (64 ビット)