▍连接 MQTT 服务
我们看到 MQTT5.0 增加了许多的属性,其中 Property
字段可以让使用者根据自己的情况,更加细致化去完成需求。
///MQTT 5.0
let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
let mqtt5 = CocoaMQTT5(clientID: clientID, host: "broker-cn.emqx.io", port: 1883)
let cOnnectProperties= MqttConnectProperties()
connectProperties.topicAliasMaximum = 0
connectProperties.sessiOnExpiryInterval= 0
connectProperties.receiveMaximum = 100
connectProperties.maximumPacketSize = 500
mqtt5.cOnnectProperties= connectProperties
mqtt5.username = "test"
mqtt5.password = "public"
mqtt5.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout")
mqtt5.keepAlive = 60
mqtt5.delegate = self
mqtt5.connect()
///MQTT 3.1.1
let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
let mqtt = CocoaMQTT(clientID: clientID, host: "broker-cn.emqx.io", port: 1883)
mqtt.username = "test"
mqtt.password = "public"
mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout")
mqtt.keepAlive = 60
mqtt.delegate = self
mqtt.connect()
MQTT 5.0 在 MQTT 3.1.1 上面多了订阅选项等操作。
///MQTT 5.0
mqtt5.subscribe("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1)
//or
//let subscriptions : [MqttSubscription] = [MqttSubscription(topic: "chat/room/animals/client/+"),MqttSubscription(topic: "chat/room/foods/client/+"),MqttSubscription(topic: "chat/room/trees/client/+")]
//mqtt.subscribe(subscriptions)
///MQTT 3.1.1
mqtt.subscribe("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1)
//or
//let subscriptions : [(String, CocoaMQTTQoS)] = [("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1),("chat/room/foods/client/+", qos: CocoaMQTTQoS.qos1),("chat/room/trees/client/+", qos: CocoaMQTTQoS.qos1)]
//mqtt.subscribe(subscriptions)
///MQTT 5.0
mqtt5!.publish("chat/room/animals/client/" + animal!, withString: message!, qos: .qos1, DUP: false, retained: false, properties: publishProperties)
///MQTT 3.1.1
mqtt!.publish("chat/room/animals/client/" + animal!, withString: message!, qos: .qos1)
▍自动重连
MQTT 是基于 TCP 长连接的协议,在实际使用的场景中,由于网络故障或信号问题导致连接中断是经常出现的问题。许多开发者会希望 SDK 能够提供方便的自动重连方式。
///MQTT 5.0
mqtt5!.autoRecOnnect= true
///MQTT 3.1.1
mqtt!.autoRecOnnect= true
///MQTT 5.0
mqtt5!.enableSSL = true
///MQTT 3.1.1
mqtt!.enableSSL = true
let clientCertArray = getClientCertFromP12File(certName: "client-keycert", certPassword: "MySecretPassword")
var sslSettings: [String: NSObject] = [:]
sslSettings[kCFStreamSSLCertificates as String] = clientCertArray
///MQTT 5.0
mqtt5!.sslSettings = sslSettings
///MQTT 3.1.1
mqtt!.sslSettings = sslSettings
如果需要 .p12 文件可以在终端使用以下语句生成:
openssl pkcs12 -export -clcerts -in client-cert.pem -inkey client-key.pem -out client.p12
▍设置保留消息和遗嘱消息
MQTT 5.0 与 MQTT 3.1.1 比,多了更多的属性设置可供用户使用。
///MQTT 5.0
let lastWillMessage = CocoaMQTTMessage(topic: "/chat/room/animals/client/Sheep", string: "dieout")
lastWillMessage.retained = true
lastWillMessage.qos = .qos1
mqtt5!.willMessage = lastWillMessage
///MQTT 3.1.1
mqtt!.willMessage = CocoaMQTTMessage(topic: "/will", string: "dieout")
▍AUTH 报文
MQTT 单纯通过 CONNECT
可能无法提供足够的信息给 Server 进行身份认证,所以 MQTT 5.0 新增此功能。用于客户端和服务器之间的加强认证。
let authProperties = MqttAuthProperties()
mqtt5!.auth(reasonCode: CocoaMQTTAUTHReasonCode.continueAuthentication, authProperties: authProperties)
▍iOS 应用后台运行
推荐使用 「Background fetch“」模式或 IOS13 新增的「Background processing」模式。
如果使用 beginBackgroundTaskWithName 和 endBackgroundTask 相关的 API,可以保持 APP 在后台运行 30 秒。
至此,我们完成了使用 CocoaMQTT 客户端连接到公共 MQTT 服务器,并实现了客户端与 MQTT 服务器的连接、消息发布和订阅。
EMQ 致力于帮助用户轻松便捷地使用 MQTT 开展物联网业务,我们的一系列客户端 SDK 均在持续开发中,敬请关注。
We are hiring! Join us and Code the Future together.
► EMQ 2021 全球招聘季
简历投递邮箱:hr@emqx.io
EMQ HR
点击"阅读原文" ,了解 CocoaMQTT
↓↓↓