Android 스마트폰, Linux 노트북(Linux mint), Sony a7R 카메라 등 세 가지 장치를 사용하는 장면이 있습니다.
내 목표는 노트북을 사용하여 카메라와 대화하는 것입니다.소니의 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();
}
}