This plugin provides a full MQTT client solution for KTOR servers. It is based on Paho Java by Eclipse.
Methods available :
- Every Paho method
Provided by the lib, available everywhere under Mqtt.client.
Mqtt.client.publishMessageTo(topic: Topic, message: String, qos: QualityOfService, retained: Boolean)
Mqtt.client.unsubscribeFrom(topic: Topic)
Mqtt.client.connectToBroker()
Mqtt.client.shutdown()
Listen to topics
⚠️ You need the Routing plugin from ktor
routing {
topic(topic: Topic, QualityOfService) {
// some stuff, MQTT message is available within the "it" variable
}
}
Installation example that auto-connect to the broker on localhost and subscribes to the "microbit" topic
/plugins/Mqtt.kt
package com.example.plugins
import com.example.utils.mqtt.*
import io.ktor.server.application.*
import io.ktor.server.routing.*
fun Application.configureMqtt() {
// Example topic
val microbit: Topic = Topic("microbit")
val microbitTopicSubscription: TopicSubscription = TopicSubscription(microbit, AtMostOnce)
// Installs the plugin to the server so that you can use it, won't work otherwise
install(Mqtt) {
broker = "tcp://localhost:1883"
autoConnect = true
initialSubscriptions(microbitTopicSubscription)
}
// Allows to map function to different topics
routing {
topic("microbit", AtMostOnce) {
val message = it.toString()
println(message)
}
}
}
/Application.kt
package com.example
import com.example.plugins.configureHTTP
import com.example.plugins.configureRouting
import com.example.plugins.configureSecurity
import com.example.plugins.configureSerialization
import com.example.plugins.configureMqtt
import io.ktor.server.application.*
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun Application.module() {
configureSecurity()
configureHTTP()
configureSerialization()
configureMqtt()
configureRouting()
}
Publish message example
package com.example.test
import io.traxterz.ktor.mqtt.AtMostOnce
import io.traxter.ktor.mqtt.Mqtt
import io.traxter.ktor.mqtt.Topic
class ExampleClass {
suspend fun sendMessage() {
val microbit = Topic("microbit")
Mqtt.client.publishMessageTo(microbit, "TEST", AtMostOnce, false)
}
}
- @dennisschroeder Base plugin
- @julien-cpsn Migration to Ktor version 2.X