iOS 关于CocoMQTT单向认证问题

我们这边使用CocoMQTT5.0 实现单向认证需求,服务端给我提供了pem证书,参考资料目前我已经能连接上MQTT broker ,此时我在MQTTX client 订阅topic A,在App上订阅topic B。在App上给topic A 发送消息 MQTTX client 可以正常收到消息 ,但在MQTTX client 上给topic B 发消息却没有任何响应,调试接口,可以确认在App 上topic B 订阅成功的,且在服务端可以看到订阅记录,但为什么却收不到消息呢?

目前我暂时用的over websocket 的库
这里是MQTT 初始化的代码:
let websocket = CocoaMQTTWebSocket(uri: “/mqtt”)
mqtt5 = CocoaMQTT5(clientID: clientId, host: defaultHost, port: UInt16(port),socket: websocket)
mqtt5?.logLevel = .debug
mqtt5?.password = password
mqtt5?.keepAlive = 60
mqtt5?.delegate = self
mqtt5?.autoReconnect = true
mqtt5?.cleanSession = true
mqtt5?.delegateQueue = .global(qos:.utility)
mqtt5?.backgroundOnSocket = true
mqtt5?.enableSSL = true
mqtt5?.allowUntrustCACertificate = true

等待MQTT 初始化时候触发mqtt5UrlSession:didReceiveTrust 方法,如下:
func mqtt5UrlSession(_ mqtt: CocoaMQTT5, didReceiveTrust trust: SecTrust, didReceiveChallenge challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) → Void) {
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
let myCert = “”
let url = Bundle.main.url(forResource: “bundle”, withExtension: “der”)!
let certData = try! Data.init(contentsOf: url)
if let trust = challenge.protectionSpace.serverTrust,
let cert = SecCertificateCreateWithData(nil, certData as CFData) {
SecTrustSetAnchorCertificates(trust, [cert] as CFArray)
completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: trust))
return
}
}
completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil)
}

可以连接MQTT broker ,能订阅topic,能发消息,就是无法收到消息

先跳过客户端程序, 使用工具进行测试 用MQTTX工具测试看一下, 如果工具测试是没有问题的, 那就要检查你的代码了

另外检查是不是配置了权限, 是否允许订阅
访问控制->客户端授权 排查一下

你可以追踪下 topic,看看发生了什么

你好,感谢您的回复:
您说的第一步先验证broker 的连通性,我用MQTTX 分别模拟server端和client 端,可以相互发消息且收到消息, 第二部访问控制授权这个我还没去看过