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

