MQTTNIO

基于 SwiftNIO 构建的 MQTT (5.03.1.1) 的非阻塞、事件驱动的 Swift 客户端。

此库支持 WebSocket 连接和 TLS。它可以在 Swift NIO 运行的所有平台上运行(例如 macOS、iOS、Linux 等)。

Tests Swift 5.7 Release

安装

使用 SPM 字符串可以轻松地将依赖项包含在您的 Package.swift 文件中。

.package(url: "https://github.com/sroebert/mqtt-nio.git", from: "2.0.0")

支持的平台

MQTTNIO 支持以下平台

依赖项

此软件包有四个依赖项

此软件包没有额外的系统依赖项。

用法

创建客户端并连接

let client = MQTTClient(
    configuration: .init(
        target: .host("127.0.0.1", port: 1883)
    ),
    eventLoopGroupProvider: .createNew
)
client.connect()

当连接失败或与 Broker 断开连接时,客户端会自动重新连接。

连接到 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()

使用 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()

订阅

client.subscribe(to: "some/topic")

取消订阅

client.unsubscribe(from: "some/topic")

发布

client.publish("Hello World!", to: "some/topic", qos: .exactlyOnce)
client.publish("Hello World!", "some/topic")
client.publish("Hello World!", to: "some/topic", retain: true)

接收回调以了解客户端何时连接/断开连接以及接收消息。

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)")
}

对于 Combine 框架可用的平台,也可以订阅发布者。

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

在支持 async/await 的平台上,可以在 MQTTClient 上使用异步函数。

try await client.publish("Hello World!", "some/topic")
for await message in client.messages {
    print("Received: \(message)")
}

单元测试

为了在本地轻松运行测试,请首先生成自签名证书,然后运行 docker-compose 来设置所需的 MQTT Broker 容器。

./mosquitto/certs/generate.sh
docker compose up