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

使用CocoaMQTT开发命令行客户端无法完成MQTT 3.1.1 Broker连接的问题求助

CocoaMQTT开发命令行客户端无法完成MQTT 3.1.1 Broker连接的问题求助

各位好,我现在用CocoaMQTT开发一个命令行客户端,连接MQTT 3.1.1协议的Broker时遇到了棘手的问题,想请大家帮忙排查下。

环境信息

  • 系统:macOS 15.5
  • Xcode版本:16.2
  • CocoaMQTT版本:2.1.19
  • Broker:Mosquitto 2.0.21

问题现象

我调用connect()方法时返回了true,但实际连接状态始终是断开的。Broker的日志里能检测到新连接建立,但客户端一直显示为<unknown>,直到我关闭App,Broker才会记录连接关闭的日志。比如Broker的关键日志片段:

1748772860: New connection from 127.0.0.1:53415 on port 1883.
1748772873: Client <unknown> closed its connection.
1748772894: New connection from 127.0.0.1:53416 on port 1883.
1748772904: Client <unknown> closed its connection.

同时,Delegate类里的didConnectAck回调从来没有触发过,命令行的输出如下:

Status is disconnected
CocoaMQTT(error): socket connect error: Error Domain=MGCDAsyncSocketErrorDomain Code=1 "Attempting to connect while connected or accepting connections. Disconnect first." UserInfo={NSLocalizedDescription=Attempting to connect while connected or accepting connections. Disconnect first.}
Program ended with exit code: 0

另外我做了一个带UI的测试App,里面有连接、断开、订阅按钮,这个版本是完全正常的——我猜是因为UI程序自带主RunLoop处理异步事件,但命令行程序不知道该怎么处理这种异步逻辑。

我的代码

主程序代码:

import Foundation
import CocoaMQTT

let delegate = Delegate()
let defaultHost = "localhost"
let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
let mqtt = CocoaMQTT(clientID: clientID, host: defaultHost, port: 1883)
mqtt.logLevel = .debug
mqtt.username = ""
mqtt.password = ""
mqtt.willMessage = CocoaMQTTMessage(topic: "/will", string: "dieout")
mqtt.keepAlive = 60
mqtt.delegate = delegate

var state = mqtt.connect()
while state {
    print("Status is \(mqtt.connState)")
    sleep(5)
    if mqtt.connState == .connected {
        mqtt.subscribe("test/#")
    } else {
        state = mqtt.connect()
    }
}

Delegate类代码:

import Foundation
import CocoaMQTT

class Delegate: CocoaMQTTDelegate {
    func mqtt(_ mqtt: CocoaMQTT, didConnectAck ack: CocoaMQTTConnAck) {
        print("didConnectAck: \(ack)")
    }
    
    func mqtt(_ mqtt: CocoaMQTT, didPublishMessage message: CocoaMQTTMessage, id: UInt16) {
        print("didPublishMessage: \(message)")
    }
    
    func mqtt(_ mqtt: CocoaMQTT, didPublishAck id: UInt16) {
        print("didPublishAck: \(id)")
    }
    
    func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16) {
        print("didReceiveMessage: \(message)")
    }
    
    func mqtt(_ mqtt: CocoaMQTT, didSubscribeTopics success: NSDictionary, failed: [String]) {
        print("didSubscribeTopics: \(success), \(failed)")
    }
    
    func mqtt(_ mqtt: CocoaMQTT, didUnsubscribeTopics topics: [String]) {
        print("didUnsubscribeTopics: \(topics)")
    }
    
    func mqttDidPing(_ mqtt: CocoaMQTT) {
        print("didPing")
    }
    
    func mqttDidReceivePong(_ mqtt: CocoaMQTT) {
        print("didReceivePong")
    }
    
    func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: (any Error)?) {
        print("didDisconnect: \(err)")
    }
}

我想请教的问题

有没有大佬能告诉我,命令行程序里该怎么处理CocoaMQTT的异步连接逻辑?怎样才能让连接流程正常走完,触发Delegate的回调,并且让Broker正确识别我的客户端ID?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:03:07