zoukankan      html  css  js  c++  java
  • iOS,MQTTClient使用

    1.简介

    2.使用

    简介

          下载地址:https://github.com/ckrey/MQTT-Client-Framework(使用MQTTClientSDK,使用时候删除无用的提示文件,MQTTClient.h文件导入的报错修改下)

          MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。非常适合在低带宽、不可靠网络、嵌入式设备上应用。该协议支持所有平台,也就是说不论什么平台都可以使用集成此协议,网上大多说该协议用于物联网,有可能成为物联网的重要组成部分。是一个即时通讯协议

    使用

    自己构建

    //MQTTStatus.h文件

    //
    //  MQTTStatus.h
    //  MQTTSDKLearn
    //
    //  Created by Vie on 2017/3/3.
    //  Copyright © 2017年 Vie. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "MQTTClient.h"
    @interface MQTTStatus : NSObject
    //状态
    @property(nonatomic,assign) MQTTSessionEvent statusCode;
    //状态信息
    @property(nonatomic,copy)  NSString *statusInfo;
    @end

    //MQTTStatus.m文件

    //
    //  MQTTStatus.m
    //  MQTTSDKLearn
    //
    //  Created by Vie on 2017/3/3.
    //  Copyright © 2017年 Vie. All rights reserved.
    //
    
    #import "MQTTStatus.h"
    
    @implementation MQTTStatus
    
    @end

    //MQTTClientManagerDelegate.h文件

    //
    //  MQTTClientManagerDelegate.h
    //  MQTTSDKLearn
    //
    //  Created by Vie on 2017/3/3.
    //  Copyright © 2017年 Vie. All rights reserved.
    //
    
    
    
    /**
     MQTTClientManager委托事件
     */
    #import "MQTTStatus.h"
    
    @protocol MQTTClientManagerDelegate <NSObject>
    @optional
    /**
     连接状态返回
    
     @param status 错误码和错误info
     */
    -(void)didMQTTReceiveServerStatus:(MQTTStatus *)status;
    
    /**
     服务器推送消息返回
    
     @param topic 消息主题
     @param dic 消息内容,JSON转字典
     */
    -(void)messageTopic:(NSString *)topic data:(NSDictionary *)dic;
    
    
    /**
     服务器推送消息返回
    
     @param topic 消息主题
     @param jsonStr 消息内容,JSON字符串
     */
    -(void)messageTopic:(NSString *)topic jsonStr:(NSString *)jsonStr;
    @end

    //MQTTClientManager.h文件

    //
    //  MQTTClientManager.h
    //  MQTTSDKLearn
    //
    //  Created by Vie on 2017/3/3.
    //  Copyright © 2017年 Vie. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface MQTTClientManager : NSObject
    
    /**
     单例
    
     @return self
     */
    +(MQTTClientManager *)shareInstance;
    
    /**
     MQTT登陆,订阅单个主题
    
     @param ip 服务器ip
     @param port 服务器端口
     @param userName 用户名
     @param password 密码
     @param topic 订阅的主题,可以订阅的主题与账户是相关联的,例:@"mqtt/test"
     */
    -(void)loginWithIp:(NSString *)ip port:(UInt16)port userName:(NSString *)userName password:(NSString *)password topic:(NSString *)topic;
    
    /**
     MQTT登陆,订阅多个主题
     
     @param ip 服务器ip
     @param port 服务器端口
     @param userName 用户名
     @param password 密码
     @param topics 订阅的主题,可以订阅的主题与账户是相关联的,例:@{@"mqtt/test":@"mqtt/test",@"mqtt/test1":@"mqtt/test1"}
     */
    -(void)loginWithIp:(NSString *)ip port:(UInt16)port userName:(NSString *)userName password:(NSString *)password topics:(NSDictionary *)topics;
    
    
    
    /**
     断开连接,清空数据
     */
    -(void)close;
    
    /**
     注册代理
    
     @param obj 需要实现代理的对象
     */
    -(void)registerDelegate:(id)obj;
    
    
    /**
      解除代理
    
     @param obj 需要接触代理的对象
     */
    -(void)unRegisterDelegate:(id)obj;
    @end

    //MQTTClientManager.m文件

    //
    //  MQTTClientManager.m
    //  MQTTSDKLearn
    //
    //  Created by Vie on 2017/3/3.
    //  Copyright © 2017年 Vie. All rights reserved.
    //
    
    #import "MQTTClientManager.h"
    #import "MQTTClientManagerDelegate.h"
    #import "MQTTClient.h"
    #import <UIKit/UIDevice.h>
    #import "MQTTStatus.h"
    
    @interface MQTTClientManager ()<MQTTSessionDelegate>
    @property(nonatomic, weak)      id<MQTTClientManagerDelegate> delegate;//代理
    @property(nonatomic, strong)    MQTTSession *mqttSession;
    @property(nonatomic, strong)    MQTTCFSocketTransport *transport;//连接服务器属性
    @property(nonatomic, strong)    NSString *ip;//服务器ip地址
    @property(nonatomic)            UInt16 port;//服务器ip地址
    @property(nonatomic, strong)    NSString *userName;//用户名
    @property(nonatomic, strong)    NSString *password;//密码
    @property(nonatomic, strong)    NSString *topic;//单个主题订阅
    @property(nonatomic, strong)    NSDictionary *topics;//多个主题订阅
    @property(nonatomic, strong)    MQTTStatus *mqttStatus;//连接服务器状态
    @end
    
    @implementation MQTTClientManager
    
    #pragma mark 懒加载
    -(MQTTSession *)mqttSession{
        if (!_mqttSession) {
            /*app包名+|iOS|+设备信息作为连接id确保唯一性*/
            NSString *clientID=[NSString stringWithFormat:@"%@|iOS|%@",[[NSBundle mainBundle] bundleIdentifier],[UIDevice currentDevice].identifierForVendor.UUIDString];
            NSLog(@"-----------------MQTT连接的ClientID-----------------%@",clientID);
            _mqttSession=[[MQTTSession alloc] initWithClientId:clientID];
        }
        return _mqttSession;
    }
    
    -(MQTTCFSocketTransport *)transport{
        if (!_transport) {
            _transport=[[MQTTCFSocketTransport alloc] init];
        }
        return _transport;
    }
    -(MQTTStatus *)mqttStatus{
        if (!_mqttStatus) {
            _mqttStatus=[[MQTTStatus alloc] init];
        }
        return _mqttStatus;
    }
    #pragma mark 对外方法
    /**
     单例
     
     @return self
     */
    +(MQTTClientManager *)shareInstance{
        static id instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance=[[self alloc] init];
        });
        return instance;
    }
    
    /**
     MQTT登陆,订阅单个主题
     
     @param ip 服务器ip
     @param port 服务器端口
     @param userName 用户名
     @param password 密码
     @param topic 订阅的主题,可以订阅的主题与账户是相关联的,例:@"mqtt/test"
     */
    -(void)loginWithIp:(NSString *)ip port:(UInt16)port userName:(NSString *)userName password:(NSString *)password topic:(NSString *)topic{
        self.topic=topic;
        [self loginWithIp:ip port:port userName:userName password:password];
    }
    
    /**
     MQTT登陆,订阅多个主题
     
     @param ip 服务器ip
     @param port 服务器端口
     @param userName 用户名
     @param password 密码
     @param topics 订阅的主题,可以订阅的主题与账户是相关联的,例:@{@"mqtt/test":@"mqtt/test",@"mqtt/test1":@"mqtt/test1"}
     */
    -(void)loginWithIp:(NSString *)ip port:(UInt16)port userName:(NSString *)userName password:(NSString *)password topics:(NSDictionary *)topics{
        self.topics=topics;
        [self loginWithIp:ip port:port userName:userName password:password];
    }
    -(void)loginWithIp:(NSString *)ip port:(UInt16)port userName:(NSString *)userName password:(NSString *)password {
        self.ip=ip;
        self.port=port;
        self.userName=userName;
        self.password=password;
        
        [self loginMQTT];
    
    }
    /*实际登陆处理*/
    -(void)loginMQTT{
        /*设置ip和端口号*/
        self.transport.host=_ip;
        self.transport.port=_port;
        
        /*设置MQTT账号和密码*/
        self.mqttSession.transport=self.transport;//给MQTTSession对象设置基本信息
        self.mqttSession.delegate=self;//设置代理
        [self.mqttSession setUserName:_userName];
        [self.mqttSession setPassword:_password];
        
        //会话链接并设置超时时间
        [self.mqttSession connectAndWaitTimeout:20];
    }
    /**
     断开连接,清空数据
     */
    -(void)close{
        [_mqttSession close];
        _delegate=nil;//代理
        _mqttSession=nil;
        _transport=nil;//连接服务器属性
        _ip=nil;//服务器ip地址
        _port=0;//服务器ip地址
        _userName=nil;//用户名
        _password=nil;//密码
        _topic=nil;//单个主题订阅
        _topics=nil;//多个主题订阅
    }
    
    /**
     注册代理
     
     @param obj 需要实现代理的对象
     */
    -(void)registerDelegate:(id)obj{
        self.delegate=obj;
    }
    
    
    /**
     解除代理
     
     @param obj 需要接触代理的对象
     */
    -(void)unRegisterDelegate:(id)obj{
        self.delegate=nil;
    }
    
    #pragma mark MQTTClientManagerDelegate
    /*连接成功回调*/
    -(void)connected:(MQTTSession *)session{
        NSLog(@"-----------------MQTT成功建立连接-----------------");
        if (_topic) {
            NSLog(@"-----------------MQTT订阅单个主题-----------------");
            [self.mqttSession subscribeTopic:_topic];
        }else if(_topics){
            NSLog(@"-----------------MQTT订阅多个个主题-----------------");
            [self.mqttSession subscribeToTopics:_topics];
        }
    }
    /*连接状态回调*/
    -(void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error{
        NSDictionary *events = @{
                                 @(MQTTSessionEventConnected): @"connected",
                                 @(MQTTSessionEventConnectionRefused): @"connection refused",
                                 @(MQTTSessionEventConnectionClosed): @"connection closed",
                                 @(MQTTSessionEventConnectionError): @"connection error",
                                 @(MQTTSessionEventProtocolError): @"protocoll error",
                                 @(MQTTSessionEventConnectionClosedByBroker): @"connection closed by broker"
                                 };
        [self.mqttStatus setStatusCode:eventCode];
        [self.mqttStatus setStatusInfo:[events objectForKey:@(eventCode)]];
        if (self.delegate&&[self.delegate respondsToSelector:@selector(didMQTTReceiveServerStatus:)]) {
            [self.delegate didMQTTReceiveServerStatus:self.mqttStatus];
        }
        NSLog(@"-----------------MQTT连接状态%@-----------------",[events objectForKey:@(eventCode)]);
    }
    /*收到消息*/
    -(void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid{
        NSString *jsonStr=[NSString stringWithUTF8String:data.bytes];
         NSLog(@"-----------------MQTT收到消息主题:%@内容:%@",topic,jsonStr);
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        
        if (self.delegate&&[self.delegate respondsToSelector:@selector(messageTopic:data:)]) {
            [self.delegate messageTopic:topic data:dic];
        }
        if (self.delegate&&[self.delegate respondsToSelector:@selector(messageTopic:jsonStr:)]) {
            [self.delegate messageTopic:topic jsonStr:jsonStr];
        }
    }
    
    
    @end
  • 相关阅读:
    JS权威指南读书笔记(二)
    JS权威指南读书笔记(一)
    NodeList和HTMLCollection区别
    2016年前端技术展望
    Label标签for属性
    JavaScript Array vs new Array区别
    禁止滚动事件方法
    shim和polyfill 区别解释
    Html5知识精粹纪录
    前端url 相关设置获取总结
  • 原文地址:https://www.cnblogs.com/douniwanxia/p/6580175.html
Copyright © 2011-2022 走看看