MQTT 5 for Kotlin Multiplatform, split into:
mktt-core: protocol types, properties, packets, codecsmktt-client: coroutine and Flow based client built on top ofmktt-core
dependencies {
implementation("io.github.nicolasfara:mktt-core:<version>")
implementation("io.github.nicolasfara:mktt-client:<version>")
}import io.github.nicolasfara.mktt.client.MqttClient
import io.github.nicolasfara.mktt.client.PublishRequest
import io.github.nicolasfara.mktt.core.QoS
import io.github.nicolasfara.mktt.core.Topic
import io.github.nicolasfara.mktt.core.TopicFilter
import kotlinx.coroutines.flow.first
suspend fun sample() {
val client = MqttClient("localhost", 1883) {
clientId = "mktt-sample"
}
client.connect()
client.subscribe(listOf(TopicFilter(Topic("sample/topic"))))
client.publish(
PublishRequest("sample/topic") {
desiredQoS = QoS.AT_LEAST_ONCE
payload("hello")
},
)
val message = client.messages(TopicFilter(Topic("sample/topic"))).first()
println(message.payloadAsString())
client.disconnect()
client.close()
}mktt-core exposes:
- MQTT 5 reason codes and properties
- topic and subscription models
- packet definitions for CONNECT, CONNACK, PUBLISH, PUBACK/PUBREC/PUBREL/PUBCOMP, SUBSCRIBE, UNSUBSCRIBE, PING and DISCONNECT
- packet encode/decode utilities over Ktor channels and
kotlinx-io
mktt-client exposes:
MqttClientStateFlow<MqttConnectionState>SharedFlow<MqttPublishMessage>messages(filter)local filtering helper- coroutine-based
connect,publish,subscribe,unsubscribe, anddisconnect
mktt-coreis covered by deterministic packet/property round-trip tests.mktt-clientkeeps fast unit tests incommonTest/jvmTestand runs broker-based checks injvmIntegrationTest.
Run unit tests:
./gradlew unitTestRun integration tests against the local Mosquitto container scaffold (mktt-client/src/jvmIntegrationTest/resources):
MKTT_RUN_INTEGRATION_TESTS=true ./gradlew integrationTestOptional public broker test (opt-in only):
MKTT_RUN_INTEGRATION_TESTS=true MKTT_RUN_REMOTE_BROKER_TESTS=true ./gradlew integrationTest