快速使用MQTT iOS版 SDK实现消息收发

本文介绍快速使用 MQTT iOS版SDK 实现MQTT客户端消息的自收自发。

1.1 部署iOS开发环境

  • 下载安装xcode
  • 下载安装cocoapods,本文以cocoapods为例。

1.2 导入项目依赖

在项目的podfile文件中设置如下:

source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '10.0'
    pod 'MQTTClient'
    pod 'AFNetworking'
    pod 'MBProgressHUD'
    pod 'Masonry'
    pod 'MJRefresh'
    pod 'YYModel'
    
    target 'MQTTChat' do
    end

2.1 获取鉴权

为保障客户安全性需求,环信MQTT云服务为客户提供token鉴权认证,获取token流程包含:创建用户ID获取token URL

2.1.1 创建用户ID

首先需要登录环信云console控制台,点击左侧菜单栏【应用概览】→【用户认证】页面,点击【创建IM用户】按钮,增添新的账户信息(包括用户名及密码)。

2.1.2 获取token URL

点击左侧菜单栏【即时通讯】→【服务概览】页面,查看下图中token域名、org_name、app_name。
获取token URL格式为:https:/ /{token域名}/{org_name}/{app_name}/token。

客户端获取token代码示例如下:

- (void)getTokenWithUsername:(NSString *)username password:(NSString *)password completion:(void (^)(NSString *token))response {
    
       NSString *urlString = getToken_url;
       //初始化一个AFHTTPSessionManager
       AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
       //设置请求体数据为json类型
       manager.requestSerializer = [AFJSONRequestSerializer serializer];
       //设置响应体数据为json类型
       manager.responseSerializer = [AFJSONResponseSerializer serializer];
       //请求体,参数(NSDictionary 类型)
   
       NSDictionary *parameters = @{@"grant_type":@"password",
                                    @"username":username,
                                    @"password":password
                                    };
    __block NSString *token  = @"";
    
    [manager POST:urlString
       parameters:parameters
          headers:@{}
         progress:nil
          success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSError *error = nil;
            NSData *jsonData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:&error];
            NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
            NSLog(@"%s jsonDic:%@",__func__,jsonDic);
            token = jsonDic[@"access_token"];
            response(token);
        }
          failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%s error:%@",__func__,error.debugDescription);
            response(token);
        }];
   }

2.2 获取连接信息

登录console后台,点击左侧菜单栏【MQTT】→【服务概览】,在下图红色方框内获取连接地址、端口以及AppID等信息。
注:clientID由两部分组成,组织形式为“deviceID@AppID”,deviceID由用户自定义,AppID见【服务配置】。
示例:正确的clientID格式为:“device001@aitbj0”;

2.3 初始化

NSString *deviceID = [UIDevice currentDevice].identifierForVendor.UUIDString;
    self.clientId = [NSString stringWithFormat:@"%@@%@",deviceID,self.appId];
    
   //初始化manager 
    self.manager = [[MQTTSessionManager alloc] init];
    self.manager.delegate = self;
        
   //订阅的主题 格式为 xxx/xxx/xxx 可以为多级话题
        self.manager.subscriptions = @{[NSString stringWithFormat:@"%@/IOS", self.rootTopic]:@(self.qos),[NSString stringWithFormat:@"%@/IOS_TestToic", self.rootTopic]:@(1)};
        

2.4 连接服务器

配置连接密码、cleansession标志、心跳间隔、超时时间等信息,调用connect()函数连接至环信MQTT消息云。

// 从console管理平台获取连接地址
           [self.manager connectTo:self.host
                               port:self.port
                                tls:self.tls
                          keepalive:60
                              clean:true
                               auth:true
                               user:userName
                               pass:token
                               will:false
                          willTopic:nil
                            willMsg:nil
                            willQos:MQTTQosLevelAtMostOnce
                     willRetainFlag:false
                       withClientId:self.clientId
                     securityPolicy:nil
                       certificates:nil
                      protocolLevel:MQTTProtocolVersion50
                     connectHandler:^(NSError *error) {
                            
            }];

2.5 订阅(subscribe)

2.5.1 订阅主题&取消订阅主题

当客户端成功连接环信MQTT消息云后,通过设置subscriptions参数值实现订阅主题与取消订阅主题 。当subscriptions非空时,订阅主题;当subscriptions为空时,取消订阅主题;

/**
   订阅主题
   格式为 xxx/xxx/xxx 可以为多级话题 @{@"xxx/xxx/xxx...":@(1)}
   qos定义{ 0: 最多一次,1:至少一次 2:仅一次}
  */
   self.manager.subscriptions = @{[NSString stringWithFormat:@"%@/IOS", self.rootTopic]:@(self.qos),[NSString stringWithFormat:@"%@/IOS_TestToic", self.rootTopic]:@(1)};
   
   /**
    取消订阅主题
   */
   self.manager.subscriptions = @{};

2.5.2 接收消息

接收从服务器接受订阅消息。

/*
     * MQTTSessionManagerDelegate
    */
   - (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained {
     /*
      * MQTTClient: process received message
      */
    
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [self.receiveMsgs insertObject:[NSString stringWithFormat:@"RecvMsg from Topic: %@ Body: %@", topic, dataString] atIndex:0];
    [self.tableView reloadData];
    
  }
  

2.6 发布消息(publish)

向指定topic发送消息

- (void)send {
    /*
     * MQTTClient: send data to broker
     */
    
    [self.manager sendData:[self.messageTextField.text dataUsingEncoding:NSUTF8StringEncoding]
                     topic:[NSString stringWithFormat:@"%@/%@",
                            self.rootTopic,
                            @"IOS"]//此处设置多级子topic
                       qos:self.qos
                    retain:FALSE];
  }

2.7 断开连接

MQTT client发送断开连接请求。

/*
     * 断开连接
    */
   - (void)disConnect {
      [self.manager disconnectWithDisconnectHandler:^(NSError *error) {
       }];
      self.manager.subscriptions = @{};
   }
   

2.8 重新连接

MQTT client发送重新连接请求。

/*
   * 重新连接
  */
  - (void)connect {
    [self.manager connectToLast:^(NSError *error) {
            
    }];
  }
  • 完整demo示例,请参见demo下载
  • 目前MQTT客户端支持多种语言,请参见 SDK下载
  • 如果您在使用MQTT服务中,有任何疑问和建议,欢迎您联系我们