iOS MQTT使用案例 (断线重连)

iOS MQTT使用案例 (断线重连)

参考了 iOS MQTT—-MQTTClient实战-看这篇的就够了 大神写的这篇

git: MQTT-Client-Framework

介绍啥的看百度,上面大神写的就行了,直接上干货。

安装:

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];
    }
}

猜你喜欢

转载自blog.csdn.net/imhwn/article/details/77508821