问题1:域名无法解析
当报{_kCFStreamErrorCodeKey=1, _kCFStreamErrorDomainKey=12}错误时 意味着DNS无法解析域名,这时候你跑去问安卓的,然而他们那边又是正常的,为什么呢?关键在于MQTTWebsocketTransport.m 52行,
- (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}
问题2:因服务端mqtt 默认的protocol 和你本地的protocol可能会不一样,这个问题只要你又实现代理方法,或者通过wireshark 抓包对比就能看出protocol差异。
- (void)protocolError:(LDSMQTTSession *)session error:(NSError *)error;
问题3:关于在子线程调一下接口时publishHandler的回调有可能比一下接口的回复更慢!!!为什么呢?
- (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 代理方法并不执行!!! (暂时不知道原因,希望大神指点)
问题3:关于mqtt建立连接以及证书验证流程,下次补充!
MQTT中文站点:www.gitbook.com/book/mcxiao…
MQTT英文站点:public.dhe.ibm.com/software/dw…
MQTT博客站点:www.steves-internet-guide.com/mqtt/