iOS MQTT-->好用的框架MQTTKit的使用

因為公司業(yè)務(wù)需要滥崩,需要app能夠?qū)崟r監(jiān)聽服務(wù)器傳過來信息來更新UI界面闷盔,這和傳統(tǒng)app向服務(wù)器來發(fā)送請求不同,所以在后臺的建議下采用了MQTT。而MQTTKit是我找到比較輕量級消约,比較清新的框架,但是這個框架存在一些問題员帮。這篇文章就是來解決這些問題的或粮。

廢話不多說,直接進入主題集侯。

94F63320-B2C2-4D19-AD83-C62CE9D1AEA3.png

app端只需要修改這個文件,MQTTKitComeOn帜消,下面那個只是demo可以讓你看到效果棠枉,但是我們app端只需要MQTTKitComeOn就可以完成連接操作。

如果想看到效果的話泡挺,可以用手機模擬開一個客戶端MQTTKitComeOn辈讶,用模擬器開一個MQTTServer。

我們客戶端這邊需要做的是娄猫,根據(jù)設(shè)備的唯一標示UUID來創(chuàng)建MQTTClient贱除,并且通過MQTTClient來連接 服務(wù)器主機(注意:這里是主機)。

NSString *clientID = [UIDevice currentDevice].identifierForVendor.UUIDString;

self.client = [[MQTTClient alloc] initWithClientId:clientID];

這里我們需要四個參數(shù)來完成連接媳溺,name月幌,password,topic(主題)悬蔽,port(端口)扯躺。(這個也是你們后臺需要的)

ps:name + password + port是用戶在登錄后 服務(wù)器返回來的

但是在進入MQTTKit內(nèi)部代碼之后發(fā)現(xiàn),MQTTKit壓根就沒有提供這個接口蝎困,而是直接將這幾個參數(shù)封裝在.m里面并且寫死了录语。

所以這時候,我將這四個參數(shù)修改了接口禾乘。下面這兩個都需要修改成下面這樣子

MQTTKit.h

- (void)connectToHost:(NSString *)host andName:(NSString *)name andPassword:(NSString *)password andPort:(int)port completionHandler:(void (^)(MQTTConnectionReturnCode code))completionHandler;

- (void) connectWithCompletionHandler:(NSString *)name andPassword:(NSString *)password andPort:(int)port andCallBack:(void (^)(MQTTConnectionReturnCode code))completionHandler;
MQTTKit.m

- (void)connectToHost:(NSString *)host andName:(NSString *)name andPassword:(NSString *)password andPort:(int)port
    completionHandler:(void (^)(MQTTConnectionReturnCode code))completionHandler {
    self.host = host;
//    [self connectWithCompletionHandler:completionHandler];
    
    [self connectWithCompletionHandler:name andPassword:password andPort:port andCallBack:completionHandler];
}

- (void)connectWithCompletionHandler:(NSString *)name andPassword:(NSString *)password andPort:(int)port andCallBack:(void (^)(MQTTConnectionReturnCode))completionHandler{

    self.connectionCompletionHandler = completionHandler;
    
    const char *cstrHost = [self.host cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cstrUsername = NULL, *cstrPassword = NULL;
    
    self.username = name;
    //
    self.password = password;
    
    if (self.username){
        cstrUsername = [self.username cStringUsingEncoding:NSUTF8StringEncoding];
    }
    
    if (self.password){
        cstrPassword = [self.password cStringUsingEncoding:NSUTF8StringEncoding];
    }
    
    mosquitto_username_pw_set(mosq, cstrUsername, cstrPassword);
    
    //    printf("name is:%s\n,password is:%s\n",cstrUsername,cstrPassword);
    
    mosquitto_reconnect_delay_set(mosq, self.reconnectDelay, self.reconnectDelayMax, self.reconnectExponentialBackoff);
    
    mosquitto_connect(mosq, cstrHost, port, self.keepAlive);
    
    dispatch_async(self.queue, ^{
        LogDebug(@"start mosquitto loop on %@", self.queue);
        mosquitto_loop_forever(mosq, -1, 1);
        LogDebug(@"end mosquitto loop on %@", self.queue);
    });

}

代碼按照上面修改后澎埠,我們來到正式調(diào)用的地方來看看怎么使用

#pragma mark -開啟mqtt服務(wù)
- (void)MQTTClientStart{
    
    //這里只是封裝了一個單利MQTTClient
    MQTTClient * mqttManager = [WXMQTTManager sharedMQTTClientManasger];

    //userCachePath是歸檔地址
    WXUser * user = [NSKeyedUnarchiver unarchiveObjectWithFile:userCachePath];
    
    //相關(guān)數(shù)據(jù)都存在的話
    if (user && [user.mqtt_password length] > 0 && [user.mqtt_username length] > 0 && [user.mqtt_topic length]> 0) {
        
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            [mqttManager connectToHost:WX_SERVER_HOST andName:user.mqtt_username andPassword:user.mqtt_password andPort:WX_SERVER_PORT completionHandler:^(MQTTConnectionReturnCode code) {
                
                if (code == ConnectionAccepted)//連接成功
                {
                    // 訂閱
                    [mqttManager subscribe:user.mqtt_topic withCompletionHandler:^(NSArray *grantedQos) {
                        
                        NSLog(@"return:%@",grantedQos);
                    }];
                }else{   
                    DDLogInfo(@"出錯了 code-->%ld",code);
                }
            }];
         
            //監(jiān)聽接收數(shù)據(jù)   
            [mqttManager setMessageHandler:^(MQTTMessage* message)
             {
                 dispatch_async(dispatch_get_main_queue(), ^{
                     //接收到消息,更新界面時需要切換回主線程
                     //             tempShowMessage.text= message.payloadString;          
                     DDLogInfo(@"%@",message.payloadString);                     
                 });
             }];            
        });
    }
}

  • 連接操作需要放在子線程中始藕,不然會阻塞主線程
  • 因為對第三方框架進行了修改蒲稳,不要再使用pods來導(dǎo)入框架

這個是github上面地址,兄弟們以后直接在這里下載即可
https://github.com/knightSaber/MQTTServer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伍派,一起剝皮案震驚了整個濱河市弟塞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拙已,老刑警劉巖决记,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倍踪,居然都是意外死亡系宫,警方通過查閱死者的電腦和手機索昂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扩借,“玉大人椒惨,你說我怎么就攤上這事〕弊铮” “怎么了康谆?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫉到。 經(jīng)常有香客問我沃暗,道長,這世上最難降的妖魔是什么何恶? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任孽锥,我火速辦了婚禮,結(jié)果婚禮上细层,老公的妹妹穿的比我還像新娘惜辑。我一直安慰自己,他們只是感情好疫赎,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布盛撑。 她就那樣靜靜地躺著,像睡著了一般捧搞。 火紅的嫁衣襯著肌膚如雪撵彻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天实牡,我揣著相機與錄音陌僵,去河邊找鬼。 笑死创坞,一個胖子當著我的面吹牛碗短,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播题涨,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼偎谁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纲堵?” 一聲冷哼從身側(cè)響起巡雨,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎席函,沒想到半個月后铐望,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年正蛙,在試婚紗的時候發(fā)現(xiàn)自己被綠了督弓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡乒验,死狀恐怖愚隧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锻全,我是刑警寧澤狂塘,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鳄厌,受9級特大地震影響荞胡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜部翘,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一硝训、第九天 我趴在偏房一處隱蔽的房頂上張望响委。 院中可真熱鬧新思,春花似錦、人聲如沸赘风。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邀窃。三九已至荸哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞬捕,已是汗流浹背鞍历。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肪虎,地道東北人劣砍。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像扇救,于是被迫代替她去往敵國和親刑枝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理迅腔,服務(wù)發(fā)現(xiàn)装畅,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用沧烈,...
    LZM輪回閱讀 3,284評論 0 6
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,962評論 0 7
  • 多線程掠兄、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,004評論 0 12