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