问题1:域名没法解析html
当报{_kCFStreamErrorCodeKey=1, _kCFStreamErrorDomainKey=12}错误时 意味着DNS没法解析域名,这时候你跑去问安卓的,然而他们那边又是正常的,为何呢?关键在于MQTTWebsocketTransport.m 52行,git
- (NSURL*) endpointURL { NSString *protocol = (self.tls) ? @"wss" : @"ws"; NSString *portString = (self.port == 0) ? @"" : [NSString stringWithFormat:@":%d",(unsigned int)self.port]; NSString *path = self.path; NSString *urlString = [NSString stringWithFormat:@"%@://%@%@%@", protocol, self.host, portString, path]; NSURL *url = [NSURL URLWithString:urlString]; return url;}复制代码
缘由是库默认你传的host 不带wss:// 或 ws:// 因此源码给拼上了。全部致使库抛出异常,Error Domain=kCFErrorDomainCFNetwork Code=1 "(null)" UserInfo={_kCFStreamErrorCodeKey=1, _kCFStreamErrorDomainKey=12}web
问题2:因服务端mqtt 默认的protocol 和你本地的protocol可能会不同,这个问题只要你又实现代理方法,或者经过wireshark 抓包对比就能看出protocol差别。bash
- (void)protocolError:(LDSMQTTSession *)session error:(NSError *)error;复制代码
问题3:关于在子线程调一下接口时publishHandler的回调有可能比一下接口的回复更慢!!!为何呢?session
- (UInt16)publishData:(NSData *)data onTopic:(NSString *)topic retain:(BOOL)retainFlag qos:(MQTTQosLevel)qos publishHandler:(MQTTPublishHandler)publishHandler;复制代码
- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid复制代码
由于代理所在线程为主线程,那么又是为何不能放子线程呢?由于mqtt init时会获取当前线程的runloop 用于开启checkdup等定时器,以及 encoder,decoder 代理的runloop .若是放在子线程,encoder,decoder 代理方法并不执行!!! (暂时不知道缘由,但愿大神指点)socket
问题3:关于mqtt创建链接以及证书验证流程,下次补充!ide
MQTT中文站点:www.gitbook.com/book/mcxiao…oop