From 65cb239b78d3e75db565309b0196378e29a439d4 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 10 Jul 2022 10:25:25 -0700 Subject: Specify multicast interface --- .../broadcast/MulticastBroadcastService.java | 22 ++++++++++++++++------ src/main/java/org/traccar/config/Keys.java | 7 +++++++ 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'src/main') diff --git a/src/main/java/org/traccar/broadcast/MulticastBroadcastService.java b/src/main/java/org/traccar/broadcast/MulticastBroadcastService.java index 81b6cd5ec..877008eda 100644 --- a/src/main/java/org/traccar/broadcast/MulticastBroadcastService.java +++ b/src/main/java/org/traccar/broadcast/MulticastBroadcastService.java @@ -30,7 +30,9 @@ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.MulticastSocket; +import java.net.NetworkInterface; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Map; @@ -44,8 +46,9 @@ public class MulticastBroadcastService implements BroadcastService { private final ObjectMapper objectMapper; - private final InetAddress address; + private final NetworkInterface networkInterface; private final int port; + private final InetSocketAddress group; private DatagramSocket publisherSocket; @@ -56,8 +59,15 @@ public class MulticastBroadcastService implements BroadcastService { public MulticastBroadcastService(Config config, ObjectMapper objectMapper) throws IOException { this.objectMapper = objectMapper; - address = InetAddress.getByName(config.getString(Keys.BROADCAST_ADDRESS)); port = config.getInteger(Keys.BROADCAST_PORT); + String interfaceName = config.getString(Keys.BROADCAST_INTERFACE); + if (interfaceName.indexOf('.') >= 0 || interfaceName.indexOf(':') >= 0) { + networkInterface = NetworkInterface.getByInetAddress(InetAddress.getByName(interfaceName)); + } else { + networkInterface = NetworkInterface.getByName(interfaceName); + } + InetAddress address = InetAddress.getByName(config.getString(Keys.BROADCAST_ADDRESS)); + group = new InetSocketAddress(address, port); } @Override @@ -106,7 +116,7 @@ public class MulticastBroadcastService implements BroadcastService { private void sendMessage(BroadcastMessage message) { try { byte[] buffer = objectMapper.writeValueAsString(message).getBytes(StandardCharsets.UTF_8); - DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, group); publisherSocket.send(packet); } catch (IOException e) { LOGGER.warn("Broadcast failed", e); @@ -150,11 +160,10 @@ public class MulticastBroadcastService implements BroadcastService { } private final Runnable receiver = new Runnable() { - @SuppressWarnings("deprecation") @Override public void run() { try (MulticastSocket socket = new MulticastSocket(port)) { - socket.joinGroup(address); + socket.joinGroup(group, networkInterface); while (!service.isShutdown()) { DatagramPacket packet = new DatagramPacket(receiverBuffer, receiverBuffer.length); socket.receive(packet); @@ -162,10 +171,11 @@ public class MulticastBroadcastService implements BroadcastService { LOGGER.info("Broadcast received: {}", data); handleMessage(objectMapper.readValue(data, BroadcastMessage.class)); } - socket.leaveGroup(address); + socket.leaveGroup(group, networkInterface); } catch (IOException e) { throw new RuntimeException(e); } } }; + } diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java index 8e11b4013..6f19ee863 100644 --- a/src/main/java/org/traccar/config/Keys.java +++ b/src/main/java/org/traccar/config/Keys.java @@ -1444,6 +1444,13 @@ public final class Keys { List.of(KeyType.CONFIG), "time,position,speed,course,accuracy,result"); + /** + * Multicast interface. It can be either an IP address or an interface name. + */ + public static final ConfigKey BROADCAST_INTERFACE = new StringConfigKey( + "broadcast.interface", + List.of(KeyType.CONFIG)); + /** * Multicast address for broadcasting synchronization events. */ -- cgit v1.2.3