关于MQTT 使用遇到问题

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

MQTT英文站点public.dhe.ibm.com/software/dw…ui

MQTT博客站点www.steves-internet-guide.com/mqtt/url

相关文章
相关标签/搜索