无法从设备接收 UDP 响应
Unable to receive the UDP response from device
我正在尝试发送 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 检查数据包,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");
我正在尝试发送 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 检查数据包,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");