You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:14:53