アプリケーションはSonyカメラからUDPパケットを受信できません。

アプリケーションはSonyカメラからUDPパケットを受信できません。

Androidスマートフォン、Linuxノートブック(Linux mint)、Sony a7Rカメラなど、3つのデバイスを使用するシーンがあります。

私の目標は、ラップトップを使用してカメラと会話することです。ソニーのhttp-SDKWiFi経由(カムはホットスポットを開きます) SDKにはAndroidサンプルアプリケーション用のコードが付属しています。まずSSDPパケットを送信し、カメラはUDPパケットで応答します。これまでは大丈夫です。 Linuxで同じJavaコードを使用すると、パケットも送信されますが、応答は受信されません。ただし、必要なUDPパケットがラップトップに表示されます(wiresharkを使用して確認)。

Q:パッケージはどこにありますか? JavaアプリケーションにLinuxでパケットを受信させる方法は?

以下はコードです(Sonyのサンプルアプリベース)。 Androidと汎用Javaの場合はほぼ同じです。

/*
 * Copyright 2014 Sony Corporation
 */

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class JavaSsdpTest {
  public static void main(String[] args) {
    search();
  }

  private static final String TAG = "MainActivity";
  private static final int SSDP_RECEIVE_TIMEOUT = 10000; // msec
  private static final int PACKET_BUFFER_SIZE = 2048;
  private static final int SSDP_PORT = 1900;
  private static final int SSDP_MX = 1;
  private static final String SSDP_ADDR = "239.255.255.250";
  private static final String SSDP_ST = "urn:schemas-sony-com:service:ScalarWebAPI:1";

  public static class Log {
    static void i(final String tag, final String msg) {
      System.out.println(tag + ": " + msg);
    }
  }

  public static synchronized void search() {
    final String ssdpRequest =
        "M-SEARCH * HTTP/1.1\r\n" + String.format("HOST: %s:%d\r\n", SSDP_ADDR, SSDP_PORT)
            + String.format("MAN: \"ssdp:discover\"\r\n")
            + String.format("MX: %d\r\n", SSDP_MX)
            + String.format("ST: %s\r\n", SSDP_ST) + "\r\n";
    final byte[] sendData = ssdpRequest.getBytes();

    new Thread() {
      @Override
      public void run() {
        // Send Datagram packets
        DatagramSocket socket = null;
        try {
          socket = new DatagramSocket();
          InetSocketAddress iAddress = new InetSocketAddress(SSDP_ADDR, SSDP_PORT);
          DatagramPacket packet = new DatagramPacket(sendData, sendData.length, iAddress);
          socket.send(packet);
          Log.i(TAG, "Sent packages");
        } catch (Exception e) {
          Log.i(TAG, "send: Something went wrong:");
          System.exit(1);
        }
        // Receive reply packets
        byte[] array = new byte[PACKET_BUFFER_SIZE];
        try {
          DatagramPacket receivePacket = new DatagramPacket(array, array.length);
          socket.setSoTimeout(SSDP_RECEIVE_TIMEOUT);
          socket.receive(receivePacket);
          Log.i(TAG, "Received package: " + receivePacket.getData().length);
          System.exit(0);
        } catch (Exception e) {
          Log.i(TAG, "recv: something went wrong");
          System.exit(1);
        }
      }
    }.start();

  }
}

関連情報