Spring-Boot-MQTT-Konfiguration
Habe ich eine Anforderung zu senden, die Nutzlast auf eine Menge von Geräten, deren Namen ausgewählt sind aus der Datenbank. Dann habe ich auf senden zu verschiedenen Themen, die wie settings/{put devicename here}
.
Unten ist die Konfiguration, die ich war, mit dem ich von Frühling-boot-Referenz-Dokumente.
MQTTConfiguration.java
@Configuration
@IntegrationComponentScan
public class MQTTConfiguration {
@Autowired
private Settings settings;
@Autowired
private DevMqttMessageListener messageListener;
@Bean
MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory clientFactory = new DefaultMqttPahoClientFactory();
clientFactory.setServerURIs(settings.getMqttBrokerUrl());
clientFactory.setUserName(settings.getMqttBrokerUser());
clientFactory.setPassword(settings.getMqttBrokerPassword());
return clientFactory;
}
@Bean
MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("dev-client-outbound",
mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(settings.getMqttPublishTopic());
return messageHandler;
}
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface DeviceGateway {
void sendToMqtt(String payload);
}
}
Hier bin ich senden um nur 1 Thema. Also ich habe die Bohne wie unten zu schicken, um mehrere Themen;
@Bean
public MqttClient mqttClient() throws MqttException {
MqttClient mqttClient = new MqttClient(settings.getMqttBrokerUrl(), "dev-client-outbound");
MqttConnectOptions connOptions = new MqttConnectOptions();
connOptions.setUserName(settings.getMqttBrokerUser());
connOptions.setPassword(settings.getMqttBrokerPassword().toCharArray());
mqttClient.connect(connOptions);
return mqttClient;
}
und ich senden mit
try {
mqttClient.publish(settings.getMqttPublishTopic()+device.getName(), mqttMessage);
} catch (MqttException e) {
LOGGER.error("Error While Sending Mqtt Messages", e);
}
Die funktioniert.
Aber meine Frage ist, Kann ich das gleiche zu erreichen, Sie output-channel für bessere Leistung? Wenn ja, jede Hilfe ist sehr geschätzt. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
MqttClient
synchron ist.Den
MqttPahoMessageHandler
verwendet eineMqttAsyncClient
und kann konfiguriert werden (setasync
zutrue
), nicht zu warten, für die Bestätigung, aber veröffentlichen die Bestätigung später als Anwendungs-Ereignis.Wenn Sie Ihren eigenen code und senden mehrerer Nachrichten in einer Schleife, wird es wahrscheinlich schneller sein, um die Verwendung einer asynchronen client, und warten Sie, bis die
IMqttDeliveryToken
Ergänzungen später.MqttPahoMessageHandler
konfiguriert, um zu senden, was auch immer Thema, das ich mag? Hier bin ich restrcted zu 1 ThemamessageHandler.setDefaultTopic(settings.getMqttPublishTopic());
. Kann ich diese Einschränkung aufheben und eine Methode, wievoid sendToMqtt(String topicName, String payload);
? Wo ich das Thema angeben-Namen jedes mal, wenn ich eine Nachricht senden.mqtt_topic
header (KonstanteMqttHeaders.TOPIC
). Sie können fügen Sie die Kopfzeile in mehrere Möglichkeiten - zum Beispiel mit einem header enricher, ein@GatewayHeader
mit einem Ausdruck auf dem@Gateway
- Methode oder in der gateway-Methode selbst:void sendToMqtt(String payload, @Header(MqttHeaders.TOPIC) String topic);
.