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
原文地址:https://www.cnblogs.com/douniwanxia/p/6580175.html