无法从设备接收 UDP 响应

Unable to receive the UDP response from device

我正在尝试发送 UDP 请求并接收响应。 Spring Integration 具有适合此类任务的工具:UnicastSendingMessageHandlerUnicastReceivingChannelAdapter。我是这样配置的

@Bean
public MessageChannel requestChannel() {
    return new DirectChannel();
}

@Bean
@ServiceActivator(inputChannel = "requestChannel")
public UnicastSendingMessageHandler unicastSendingMessageHandler() {
    UnicastSendingMessageHandler unicastSendingMessageHandler = new UnicastSendingMessageHandler("239.255.255.250", 1982);
    return unicastSendingMessageHandler;
}

@Bean
public UnicastReceivingChannelAdapter unicastReceivingChannelAdapter() {
    UnicastReceivingChannelAdapter unicastReceivingChannelAdapter = new UnicastReceivingChannelAdapter(8080);
    unicastReceivingChannelAdapter.setOutputChannelName("nullChannel");
    return unicastReceivingChannelAdapter;
}

我如何发送消息(我在任何地方使用 sendDiscoveryMessage()):

@Service
public class DiscoveryService {

    private static final String DISCOVERY_MESSAGE = "M-SEARCH * HTTP/1.1\r\n"
            + "HOST: 239.255.255.250:1982\r\n"
            + "MAN: \"ssdp:discover\"\r\n"
            + "ST: wifi_bulb";

    private final MessageChannel requestChannel;

    public DiscoveryService(final MessageChannel requestChannel) {
        this.requestChannel = requestChannel;
    }

    public void sendDiscoveryMessage() {
        requestChannel.send(new GenericMessage<>(DISCOVERY_MESSAGE));
    }
}

此时,我可以通过 WireShark 检查数据包,ensure 数据报已发送,相应的响应也已发送。 唯一的问题是如何接收此响应。据我阅读文档的理解,我需要用 @ServiceActivator 注释的方法。但是我不明白我应该在哪里(哪个频道)收到响应(以便正确指定@ServiceActivator(inputChannel=""))。另外,我不确定 @ServiceActivator(inputChannel = "requestChannel") 我为 UnicastSendingMessageHandler bean 放的。 我尝试创建以下方法(假设响应将到达同一频道):

@ServiceActivator(inputChannel = "requestChannel")
public void receiveResponse(Message<String> response) {
    System.out.println(response);
}

但它实际上拦截了我自己的请求消息(对我来说似乎合乎逻辑,因为我将请求发送到 requestChannel)。 所以我不明白我需要多少个通道(也许我需要 1 个用于请求,1 个用于响应)以及如何创建 @ServiceActivator 来捕获响应。

unicastReceivingChannelAdapter.setOutputChannelName("nullChannel");

您正在将结果发送到 nullChannel,这类似于 Unix 上的 /dev/null;你正在丢弃它。

使用@ServiceActivator(inputChannel = "replyChannel")

unicastReceivingChannelAdapter.setOutputChannelName("replyChannel");