如何使用Swift通过MQTT向Azure IoT Hub发送遥测消息
Swift实现Azure IoT Hub MQTT遥测消息发送
前置准备
- 添加MQTT依赖:通过Swift Package Manager引入
MQTTClient(仓库地址:https://github.com/ibm-messaging/mqtt-ios.git),或使用CocoaPods集成 - 根证书配置:将Digicert根证书(
digicert.cer)添加到Swift项目,并确保在Build Phases的Copy Bundle Resources中包含该文件
核心代码实现
主逻辑代码
import Foundation import MQTTClient // 替换为你的实际配置参数 let pathToRootCert = Bundle.main.path(forResource: "digicert", ofType: "cer")! let deviceId = "<设备注册表中的设备ID>" let sasToken = "<生成的SAS令牌>" let iotHubName = "<IoT Hub名称>" let mqttHost = "\(iotHubName).azure-devices.net" let mqttPort = 8883 // 创建MQTT客户端实例 let client = MQTTClient(clientId: deviceId, host: mqttHost, port: UInt16(mqttPort)) client.delegate = self // 设置用户名和密码(与Python逻辑完全对齐) let username = "\(iotHubName).azure-devices.net/\(deviceId)/?api-version=2021-04-12" client.username = username client.password = sasToken // TLS安全配置 let tlsSettings = MQTTSettings() tlsSettings.enableSSL = true tlsSettings.caCertificatePath = pathToRootCert tlsSettings.tlsVersion = .tlsv1_2 tlsSettings.verifyHostname = true // 对应Python的tls_insecure_set(false) client.settings = tlsSettings // 发起连接并发布消息 client.connect { [weak self] success, error in guard let self = self else { return } if success { print("设备连接成功") // 构造遥测消息主题和内容 let topic = "devices/\(deviceId)/messages/events/" let payload = "{\"id\":123}".data(using: .utf8)! // 发布消息(QoS 1,对应Python的qos=1) self.client.publish(payload, topic: topic, qos: .atLeastOnce, retain: false) { mid in print("设备已发送消息,消息ID:\(mid)") } } else { print("设备连接失败:\(error?.localizedDescription ?? "未知错误")") } } // 维持客户端运行 RunLoop.main.run(until: Date.distantFuture)
MQTT回调实现
// 扩展实现MQTTClientDelegate协议,处理连接、断开、发布事件 extension YourViewController: MQTTClientDelegate { func mqttClient(_ client: MQTTClient, didConnectWithReturnCode returnCode: MQTTConnectReturnCode) { print("设备连接结果码:\(returnCode.rawValue)") } func mqttClient(_ client: MQTTClient, didDisconnectWithError error: Error?) { if let error = error { print("设备断开连接:\(error.localizedDescription)") } else { print("设备正常断开连接") } } func mqttClient(_ client: MQTTClient, didPublishMessage messageID: UInt16) { print("消息发布成功,消息ID:\(messageID)") } }
关键逻辑说明
- 用户名格式:严格遵循Azure IoT Hub要求,包含IoT Hub域名、设备ID及API版本参数
- TLS版本:强制使用TLS 1.2,开启主机名验证确保连接安全性
- QoS级别:示例使用QoS 1(
atLeastOnce),保证消息至少被送达一次 - 客户端生命周期:通过
RunLoop维持客户端运行,避免程序提前退出
内容的提问来源于stack exchange,提问作者user26952423
相关产品推荐
相关产品推荐

