关于MQTT 使用遇到问题

2,144 阅读1分钟

问题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/