iOS MQTT使用案例 (断线重连)
参考了 iOS MQTT—-MQTTClient实战-看这篇的就够了 大神写的这篇
介绍啥的看百度,上面大神写的就行了,直接上干货。
安装:
pod 'MQTTClient'
创建一个单例管理类来处理MQTT有关操作
导入:
#import<MQTTClient/MQTTClient>
MQTTSession初始化:
- (MQTTSession *)session {
if (_session == nil) {
MQTTCFSocketTransport *transport = [MQTTCFSocketTransport new];
transport.host = kMQTTHost;
transport.port = kMQTTPort;
_session = [MQTTSession new];
_session.transport = transport;
_session.delegate = self;
_session.userName = kMQTTUserName;
_session.password = kMQTTPsw;
// _session.willQoS = 1;
_session.clientId = [NSUUID UUID].UUIDString; // 唯一标识
}
return _session;
}
管理类API:
- (void)connect;
- (void)subscribeTopic:(NSString *)topicUrl;
- (void)unsubscribeTopic:(NSString *)topicUrl;
- (void)logoutAction;
- connect
- (void)connect {
// 是否需要断开连接标识
_shouldCloseConnection = NO;
[self.session connectAndWaitTimeout:1]; // 似乎不是异步执行
}
- subscribeTopic && unsubscribeTopic
- (void)subscribeTopic:(NSString *)topicUrl {
/* 存储toppicUrl 用于重连 */
...
[MQTTHelper subscribeTopicWithSesion:self.session topic:topicUrl];
}
- (void)unsubscribeTopic:(NSString *)topicUrl {
/* 删除存储的 toppicUrl */
...
[MQTTHelper unsubscribeTopicWithSesion:self.session topic:topicUrl];
}
- logoutAction
取消所有订阅,关闭连接(我这里是退出登录时用到)
- (void)logoutAction {
_shouldCloseConnection = YES; // 不需要断线重连
[self.session unsubscribeTopics:self.topicUrls unsubscribeHandler:^(NSError *error) {
[self.topicUrls removeAllObjects];
}]; // 取消订阅所有topic
[self.session disconnect];
[self.session close];
self.session = nil;
}
订阅 及 取消订阅 类方法
+ (void)subscribeTopicWithSesion:(MQTTSession *)session topic:(NSString *)topicUrl {
dispatch_async(dispatch_get_main_queue(), ^{
[session subscribeToTopic:topicUrl atLevel:MQTTQosLevelAtLeastOnce subscribeHandler:^(NSError *error, NSArray<NSNumber *> *gQoss) {
if (error) {
DLog(@"=*=*=*=*=*= Subscribe to topic fail =*=*=*=*=*=");
} else {
DLog(@"=*=*=*=*=*= Subscribe to topic success=*=*=*=*=*=\nGranted Qoss:\n%@", gQoss);
}
}];
});
}
+ (void)unsubscribeTopicWithSesion:(MQTTSession *)session topic:(NSString *)topicUrl {
[session unsubscribeTopic:topicUrl unsubscribeHandler:^(NSError *error) {
if (error) {
DLog(@"=*=*=*=*=*= Unsubscribe topic fail =*=*=*=*=*=");
} else {
DLog(@"=*=*=*=*=*= Unsubscribe topic success=*=*=*=*=*=");
}
}];
}
MQTTSessionDelegate
// 订阅消息数据回调
- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid {
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
MQTTEventModel *model = [MQTTEventModel mj_objectWithKeyValues:data]; // MJExtension解析
/* 该干嘛干嘛 */
}
// 连接成功
- (void)connected:(MQTTSession *)session {
if (_shouldConnct == YES) { // 需要断线重连
[MQTTHelper subscribeTopicWithSesion:session topic:self.topicUrls.lastObject];
_shouldConnct = NO;
}
}
// 连接断开
- (void)connectionClosed:(MQTTSession *)session {
if ( _shouldCloseConnection == NO) { // 如果是断线的情况
_shouldConnct = YES; // 则需要重连
[session connect];
}
}