sroebert/mqtt-nio
Non-blocking, event-driven Swift client for MQTT ([5.0](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html) and [3.1.1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html)) build on [SwiftNIO](https://github.com/apple/swift-nio).
Installation
Use the SPM string to easily include the dependendency in your Package.swift file.
.package(url: "https://github.com/sroebert/mqtt-nio.git", from: "2.0.0")Supported Platforms
MQTTNIO supports the following platforms:
- Ubuntu 18.04+
- macOS 10.9+, iOS 7+, tvOS 12+ or watchOS 6+
Dependencies
This package has four dependencies:
apple/swift-niofor IO.apple/swift-nio-sslfor TLS.apple/swift-nio-transport-servicesto support Apple platforms as first-class citizens.apple/swift-logfor logging.
This package has no additional system dependencies.
Usage
Create Client and Connect
let client = MQTTClient(
configuration: .init(
target: .host("127.0.0.1", port: 1883)
),
eventLoopGroupProvider: .createNew
)
client.connect()The client automatically reconnects when failing to connect or when disconnected from the broker.
Connect to an MQTT 3.1.1 broker
let client = MQTTClient(
configuration: .init(
target: .host("127.0.0.1", port: 1883),
protocolVersion: .version3_1_1
),
eventLoopGroupProvider: .createNew
)
client.connect()Connect using a URL
let client = MQTTClient(configuration: .init(url: URL(string: "mqtts://test.mosquitto.org")!))
client.connect()let client = MQTTClient(configuration: .init(url: URL(string: "wss://test.mosquitto.org:8081")!))
client.connect()Subscribe
client.subscribe(to: "some/topic")Unsubscribe
client.unsubscribe(from: "some/topic")Publish
client.publish("Hello World!", to: "some/topic", qos: .exactlyOnce)client.publish("Hello World!", "some/topic")client.publish("Hello World!", to: "some/topic", retain: true)Receive callbacks to know when the client connects/disconnects and receives messages.
client.whenConnected { response in
print("Connected, is session present: \(response.isSessionPresent)")
}client.whenDisconnected { reason in
print("Disconnected: \(reason)")
}client.whenMessage { message in
print("Received: \(message)")
}For platforms where the Combine framework is available, it is also possible to subscribe to publishers.
let cancellable = client.connectPublisher
.sink { response in
print("Connected, is session present: \(response.isSessionPresent)")
}let cancellable = client.disconnectPublisher
.sink { reason in
print("Disconnected: \(reason)")
}let cancellable1 = client.messagePublisher
.sink { message in
print("Received: \(message)")
}
let cancellable2 = client.messagePublisher(forTopic: "some/topic")
.sink { message in
print("Received: \(message)")
}async/await
On platforms where async await is supported, it is possible to use async functions on MQTTClient.
try await client.publish("Hello World!", "some/topic")for await message in client.messages {
print("Received: \(message)")
}Unit Tests
To easily run the tests locally, first generate self signed certificates followed by running docker-compose to setup the needed MQTT broker containers.
./mosquitto/certs/generate.sh
docker compose upPackage Metadata
Repository: sroebert/mqtt-nio
Default branch: main
README: README.md