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