關於MQTT 使用遇到問題

weixin_34290352發表於2018-04-28

問題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/


相關文章