KMQTT is a Kotlin Multiplatform MQTT 3.1.1/5.0 Broker, with the objective of targeting the most possible build targets.
✖️ = TODO ✔️ = Supported ➕ = Experimental
| Platform | MQTT 3.1.1 | MQTT 5.0 | Clustering | TCP | TLS | UDP | Websocket |
|---|---|---|---|---|---|---|---|
| JVM | ✔️ | ✔️ | ➕ | ✔️ | ✔️ | ➕ | ✖️ |
| Windows X64 | ✔️ | ✔️ | ➕ | ✔️ | ✔️ | ➕ | ✖️ |
| Linux X64 | ✔️ | ✔️ | ➕ | ✔️ | ✔️ | ➕ | ✖️ |
| Linux ARM32 | ✔️ | ✔️ | ➕ | ✔️ | ✔️ | ➕ | ✖️ |
You can download the executables for your platform under the release tab
| Argument | Default Value | Description |
|---|---|---|
| -h | 127.0.0.1 | Interface address to bind the server to |
| -p | 1883 | Server port to listen to |
| --max-connections | 128 | The maximum number of TCP connections to support |
| --key-store | null | The path to the PKCS12 keystore containing the private key and the certificate for TLS, if null TLS is disabled |
| --key-store-psw | null | The password of the PKCS12 keystore indicated in --key-store, if the keystore has no password set, don't set the option |
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
dependencies {
implementation 'com.github.davidepianca98:KMQTT:0.2.3'
}On the Kotlin Multiplatform plugin you only need to require the dependency on the common source set and the platform specific parts will automatically be required
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
kotlin {
jvm()
mingwX64("mingw")
sourceSets {
commonMain {
dependencies {
implementation 'com.github.davidepianca98:KMQTT:0.2.3'
}
}
}
}This code starts the MQTT broker on port 1883 without TLS encryption. You can play with Broker() constructor parameters to set the various settings
fun main() {
Broker().listen()
}The keystore must be in PKCS12 format, the keystore password can be null
fun main() {
val broker = Broker(
tlsSettings = TLSSettings(keyStoreFilePath = "keyStore.p12", keyStorePassword = "password"),
port = 8883
).listen()
broker.listen()
}fun main() {
val broker = Broker(authentication = object : Authentication {
override fun authenticate(username: String?, password: UByteArray?): Boolean {
// TODO Implement your authentication method
return username == "user" && password?.toByteArray()?.decodeToString() == "pass"
}
})
broker.listen()
}fun main() {
val broker = Broker(packetInterceptor = object : PacketInterceptor {
override fun packetReceived(packet: MQTTPacket) {
when(packet) {
is MQTTConnect -> println(packet.protocolName)
is MQTTPublish -> println(packet.topicName)
}
}
})
broker.listen()
}fun main() {
val broker = Broker()
broker.publish(
retain = false,
topicName = "test/",
qos = Qos.AT_MOST_ONCE,
properties = MQTTProperties(),
"testPayload".toByteArray().toUByteArray()
)
broker.listen()
}