Невозможно получить ответ UDP от устройства - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь отправить запрос UDP и получить ответ. В Spring Integration есть подходящие инструменты для решения таких задач: UnicastSendingMessageHandler и UnicastReceivingChannelAdapter. Я настроил его следующим образом

@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 и убедиться, что было отправлено дейтаграмма и соответствующий ответ. Вопрос только в том, как получить этот ответ. Насколько я понимаю, читая документацию, мне нужен метод, помеченный @ServiceActivator. Но я не понимаю, где (какой канал) я должен получить ответ (чтобы правильно указать @ServiceActivator(inputChannel="")). Кроме того, я не уверен насчет @ServiceActivator(inputChannel = "requestChannel"), который я положил для UnicastSendingMessageHandler боб. Я попытался создать следующий метод (предполагая, что ответ придет на тот же канал):

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

, но на самом деле он перехватывает мое собственное сообщение с запросом (мне кажется логичным, потому что я отправляю запрос на requestChannel ). Поэтому я не понимаю, сколько каналов мне нужно (возможно, мне нужно 1 для запроса и 1 для ответа) и как создать @ServiceActivator, чтобы перехватить ответ.

1 Ответ

0 голосов
/ 23 апреля 2020
unicastReceivingChannelAdapter.setOutputChannelName("nullChannel");

Вы отправляете результат на nullChannel, что похоже на /dev/null в Unix; вы отбрасываете его.

Используйте @ServiceActivator(inputChannel = "replyChannel") и

unicastReceivingChannelAdapter.setOutputChannelName("replyChannel");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...