iOS,MQTTClient使用
2017-03-19 13:02 帅不过三秒 阅读(13430) 评论(42) 编辑 收藏 举报下载地址: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
还是要微笑^_^
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架