Replace deprecated MulticastSocket methods (#14611)

* Replace deprecated methods
* Call leaveGroup method in shutdown

Signed-off-by: Mark Hilbush <mark@hilbush.com>
This commit is contained in:
Mark Hilbush 2023-03-28 09:14:30 -04:00 committed by GitHub
parent d4a231e8a9
commit 1983bc36f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 111 additions and 20 deletions

View File

@ -17,11 +17,14 @@ import static org.openhab.binding.benqprojector.internal.BenqProjectorBindingCon
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.InterfaceAddress;
import java.net.MulticastSocket; import java.net.MulticastSocket;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -44,6 +47,7 @@ public class MulticastListener {
private final Logger logger = LoggerFactory.getLogger(MulticastListener.class); private final Logger logger = LoggerFactory.getLogger(MulticastListener.class);
private MulticastSocket socket; private MulticastSocket socket;
private InetSocketAddress inetSocketAddress;
// BenQ projector devices announce themselves on the AMX DDD multicast port // BenQ projector devices announce themselves on the AMX DDD multicast port
private static final String AMX_MULTICAST_GROUP = "239.255.250.250"; private static final String AMX_MULTICAST_GROUP = "239.255.250.250";
@ -57,20 +61,25 @@ public class MulticastListener {
*/ */
public MulticastListener(String ipv4Address) throws IOException, SocketException { public MulticastListener(String ipv4Address) throws IOException, SocketException {
InetAddress ifAddress = InetAddress.getByName(ipv4Address); InetAddress ifAddress = InetAddress.getByName(ipv4Address);
NetworkInterface netIF = NetworkInterface.getByInetAddress(ifAddress); NetworkInterface networkInterface = getMulticastInterface(ipv4Address);
logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(), logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(),
netIF != null ? netIF.getName() : "UNKNOWN"); networkInterface.getName());
socket = new MulticastSocket(AMX_MULTICAST_PORT); socket = new MulticastSocket(AMX_MULTICAST_PORT);
socket.setInterface(ifAddress); socket.setNetworkInterface(networkInterface);
socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT_SEC); socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT_SEC);
InetAddress mcastAddress = InetAddress.getByName(AMX_MULTICAST_GROUP); inetSocketAddress = new InetSocketAddress(InetAddress.getByName(AMX_MULTICAST_GROUP), AMX_MULTICAST_PORT);
socket.joinGroup(mcastAddress); socket.joinGroup(inetSocketAddress, null);
logger.debug("Multicast listener joined multicast group {}:{}", AMX_MULTICAST_GROUP, AMX_MULTICAST_PORT); logger.debug("Multicast listener joined multicast group {}:{}", AMX_MULTICAST_GROUP, AMX_MULTICAST_PORT);
} }
public void shutdown() { public void shutdown() {
logger.debug("Multicast listener closing down multicast socket"); logger.debug("Multicast listener closing down multicast socket");
socket.close(); try {
socket.leaveGroup(inetSocketAddress, null);
socket.close();
} catch (IOException e) {
logger.debug("Exception shutting down multicast socket: {}", e.getMessage());
}
} }
/* /*
@ -129,4 +138,25 @@ public class MulticastListener {
} }
return null; return null;
} }
private NetworkInterface getMulticastInterface(String interfaceIpAddress) throws SocketException {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface;
while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement();
if (networkInterface.isLoopback()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
if (logger.isTraceEnabled()) {
logger.trace("Found interface address {} -> {}", interfaceAddress.toString(),
interfaceAddress.getAddress().toString());
}
if (interfaceAddress.getAddress().toString().endsWith("/" + interfaceIpAddress)) {
return networkInterface;
}
}
}
throw new SocketException("Unable to get network interface for " + interfaceIpAddress);
}
} }

View File

@ -17,11 +17,14 @@ import static org.openhab.binding.epsonprojector.internal.EpsonProjectorBindingC
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.InterfaceAddress;
import java.net.MulticastSocket; import java.net.MulticastSocket;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -44,6 +47,7 @@ public class MulticastListener {
private final Logger logger = LoggerFactory.getLogger(MulticastListener.class); private final Logger logger = LoggerFactory.getLogger(MulticastListener.class);
private MulticastSocket socket; private MulticastSocket socket;
private InetSocketAddress inetSocketAddress;
// Epson projector devices announce themselves on the AMX DDD multicast port // Epson projector devices announce themselves on the AMX DDD multicast port
private static final String AMX_MULTICAST_GROUP = "239.255.250.250"; private static final String AMX_MULTICAST_GROUP = "239.255.250.250";
@ -57,20 +61,25 @@ public class MulticastListener {
*/ */
public MulticastListener(String ipv4Address) throws IOException, SocketException { public MulticastListener(String ipv4Address) throws IOException, SocketException {
InetAddress ifAddress = InetAddress.getByName(ipv4Address); InetAddress ifAddress = InetAddress.getByName(ipv4Address);
NetworkInterface netIF = NetworkInterface.getByInetAddress(ifAddress); NetworkInterface networkInterface = getMulticastInterface(ipv4Address);
logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(), logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(),
netIF != null ? netIF.getName() : "UNKNOWN"); networkInterface.getName());
socket = new MulticastSocket(AMX_MULTICAST_PORT); socket = new MulticastSocket(AMX_MULTICAST_PORT);
socket.setInterface(ifAddress); socket.setNetworkInterface(networkInterface);
socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT_SEC); socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT_SEC);
InetAddress mcastAddress = InetAddress.getByName(AMX_MULTICAST_GROUP); inetSocketAddress = new InetSocketAddress(InetAddress.getByName(AMX_MULTICAST_GROUP), AMX_MULTICAST_PORT);
socket.joinGroup(mcastAddress); socket.joinGroup(inetSocketAddress, null);
logger.debug("Multicast listener joined multicast group {}:{}", AMX_MULTICAST_GROUP, AMX_MULTICAST_PORT); logger.debug("Multicast listener joined multicast group {}:{}", AMX_MULTICAST_GROUP, AMX_MULTICAST_PORT);
} }
public void shutdown() { public void shutdown() {
logger.debug("Multicast listener closing down multicast socket"); logger.debug("Multicast listener closing down multicast socket");
socket.close(); try {
socket.leaveGroup(inetSocketAddress, null);
socket.close();
} catch (IOException e) {
logger.debug("Exception shutting down multicast socket: {}", e.getMessage());
}
} }
/* /*
@ -129,4 +138,25 @@ public class MulticastListener {
} }
return null; return null;
} }
private NetworkInterface getMulticastInterface(String interfaceIpAddress) throws SocketException {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface;
while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement();
if (networkInterface.isLoopback()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
if (logger.isTraceEnabled()) {
logger.trace("Found interface address {} -> {}", interfaceAddress.toString(),
interfaceAddress.getAddress().toString());
}
if (interfaceAddress.getAddress().toString().endsWith("/" + interfaceIpAddress)) {
return networkInterface;
}
}
}
throw new SocketException("Unable to get network interface for " + interfaceIpAddress);
}
} }

View File

@ -17,11 +17,15 @@ import static org.openhab.binding.globalcache.internal.GlobalCacheBindingConstan
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.InterfaceAddress;
import java.net.MulticastSocket; import java.net.MulticastSocket;
import java.net.NetworkInterface; import java.net.NetworkInterface;
import java.net.SocketException; import java.net.SocketException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.Date; import java.util.Date;
import java.util.Enumeration;
import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.thing.ThingTypeUID;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -37,6 +41,7 @@ public class MulticastListener {
private final Logger logger = LoggerFactory.getLogger(MulticastListener.class); private final Logger logger = LoggerFactory.getLogger(MulticastListener.class);
private MulticastSocket socket; private MulticastSocket socket;
private InetSocketAddress inetSocketAddress;
private String serialNumber = ""; private String serialNumber = "";
private String vendor = ""; private String vendor = "";
@ -59,24 +64,29 @@ public class MulticastListener {
public static final int DEFAULT_SOCKET_TIMEOUT = 3000; public static final int DEFAULT_SOCKET_TIMEOUT = 3000;
/* /*
* Constructor joins the multicast group, throws IOException on failure. * Constructor joins the multicast group
*/ */
public MulticastListener(String ipv4Address) throws IOException, SocketException { public MulticastListener(String ipv4Address) throws IOException, SocketException, UnknownHostException {
InetAddress ifAddress = InetAddress.getByName(ipv4Address); InetAddress ifAddress = InetAddress.getByName(ipv4Address);
NetworkInterface netIF = NetworkInterface.getByInetAddress(ifAddress); NetworkInterface networkInterface = getMulticastInterface(ipv4Address);
logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(), logger.debug("Discovery job using address {} on network interface {}", ifAddress.getHostAddress(),
netIF != null ? netIF.getName() : "UNKNOWN"); networkInterface.getName());
socket = new MulticastSocket(GC_MULTICAST_PORT); socket = new MulticastSocket(GC_MULTICAST_PORT);
socket.setInterface(ifAddress); socket.setNetworkInterface(networkInterface);
socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT); socket.setSoTimeout(DEFAULT_SOCKET_TIMEOUT);
InetAddress mcastAddress = InetAddress.getByName(GC_MULTICAST_GROUP); inetSocketAddress = new InetSocketAddress(InetAddress.getByName(GC_MULTICAST_GROUP), GC_MULTICAST_PORT);
socket.joinGroup(mcastAddress); socket.joinGroup(inetSocketAddress, null);
logger.debug("Multicast listener joined multicast group {}:{}", GC_MULTICAST_GROUP, GC_MULTICAST_PORT); logger.debug("Multicast listener joined multicast group {}:{}", GC_MULTICAST_GROUP, GC_MULTICAST_PORT);
} }
public void shutdown() { public void shutdown() {
logger.debug("Multicast listener closing down multicast socket"); logger.debug("Multicast listener closing down multicast socket");
socket.close(); try {
socket.leaveGroup(inetSocketAddress, null);
socket.close();
} catch (IOException e) {
logger.debug("Exception shutting down multicast socket: {}", e.getMessage());
}
} }
/* /*
@ -243,6 +253,27 @@ public class MulticastListener {
macAddress = ""; macAddress = "";
} }
private NetworkInterface getMulticastInterface(String interfaceIpAddress) throws SocketException {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface;
while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement();
if (networkInterface.isLoopback()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
if (logger.isTraceEnabled()) {
logger.trace("Found interface address {} -> {}", interfaceAddress.toString(),
interfaceAddress.getAddress().toString());
}
if (interfaceAddress.getAddress().toString().endsWith("/" + interfaceIpAddress)) {
return networkInterface;
}
}
}
throw new SocketException("Unable to get network interface for " + interfaceIpAddress);
}
public String getSerialNumber() { public String getSerialNumber() {
return serialNumber; return serialNumber;
} }