全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
消息队列 MQ

MQTT iOS 接入示例

更新时间:2017-06-07 13:26:11

本文主要介绍如何使用 iOS 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考,包括资源申请、环境准备、示例代码、注意事项等。

注意:

本文给出的实例均基于第三方框架 MQTT-Client-Framework 实现,SDK 下载请参见 MQTT 接入准备。如使用其他第三方的客户端,请自行修改。

资源申请

使用 MQ 提供的 MQTT 服务,首先需要核实应用中使用的 Topic 资源是否已经申请。如果没有,请先去控制台申请 Topic,Group ID 等资源。

申请资源时需要根据需求选择对应的 Region,例如 MQTT 需要使用华北2的接入点,那么 Topic 等资源就在华北2 申请,资源申请具体请参见申请 MQ 资源

注意:MQTT 使用的多级子 Topic 不需要申请,代码里直接使用即可,没有限制。

环境准备

iOS 环境下开发 MQTT 客户端程序,一般依赖稳定的第三方 FrameWork,由于涉及网络数据传输,建议选择 Object-c 原生的框架,比如 MQTT-Client-Framework 。

第三方 FrameWork 一般可以用 CocoaPods 来管理资源包依赖。具体配置流程如下:

  1. CocoaPods 安装配置

    CocoaPods 依赖 Ruby 等基础环境。请确保安装过 Ruby,然后将国内的镜像源更新为淘宝源,提高资源包下载速度。

    1. //查看软件源
    2. gem sources -l
    3. //清理掉默认的软件源
    4. gem sources --remove https://rubygems.org/
    5. //加入淘宝的源
    6. gem sources -a https://ruby.taobao.org/

    更新完地址后,运行以下命令,等待一段时间后即可运行 pod 工具:

    sudo gem install cocoapods

  2. 更新项目依赖

    MQTT-Client-FrameWork 第三方框架支持 pod 管理方式,因此添加依赖只需要在项目根目录的 Podfile 中加入依赖即可,内容如下:

    1. pod 'MQTTClient'
    2. target '${yourprojectname}' do
    3. end

    其中 target 填入项目的名称,然后在 Podfile 目录下运行以下命令,更新依赖即可。

    pod install

主要代码示例

初始化客户端

MQTT-Client-FrameWork 包提供的客户端类有 MQTTSession 和 MQTTSessionManager,建议使用后者维持静态资源,而且已经封装好自动重连等逻辑。初始化时需要传入相关的网络参数。具体如下:

  1. self.manager = [[MQTTSessionManager alloc] init];
  2. self.manager.delegate = self;
  3. self.manager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:self.qos]
  4. forKey:[NSString stringWithFormat:@"%@/#", self.rootTopic]];
  5. //password的计算方式是,使用secretkey对groupId做hmac签名算法,具体实现参考macSignWithText方法
  6. NSString *passWord = [[self class] macSignWithText:self.groupId secretKey:self.secretKey];
  7. [self.manager connectTo:self.mqttSettings[@"host"]
  8. port:[self.mqttSettings[@"port"] intValue]
  9. tls:[self.mqttSettings[@"tls"] boolValue]
  10. keepalive:60 //心跳间隔不得大于120s
  11. clean:true
  12. auth:true
  13. user:self.accessKey
  14. pass:passWord
  15. will:false
  16. willTopic:nil
  17. willMsg:nil
  18. willQos:0
  19. willRetainFlag:FALSE
  20. withClientId:self.clientId];

添加回调接口

针对连接当前状态,添加对应的回调接口,可以进行相关的业务逻辑处理。

  1. [self.manager addObserver:self
  2. forKeyPath:@"state"
  3. options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
  4. context:nil];
  1. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  2. switch (self.manager.state) {
  3. case MQTTSessionManagerStateClosed:
  4. break;
  5. case MQTTSessionManagerStateClosing:
  6. break;
  7. case MQTTSessionManagerStateConnected:
  8. break;
  9. case MQTTSessionManagerStateConnecting:
  10. break;
  11. case MQTTSessionManagerStateError:
  12. break;
  13. case MQTTSessionManagerStateStarting:
  14. default:
  15. break;
  16. }
  17. }

userName 和 passWord 的设置

由于服务端需要对客户端进行鉴权,因此需要传入合法的 userName 和 passWord。userName 设置为当前用户的 AccessKey,password 则设置为 MQTT 客户端 GroupID 的签名字符串,签名计算方式是使用 SecretKey 对 GroupID 做 HmacSHA1 散列加密。具体方法请参考 Demo 中的 macSignWithText 函数。

  1. + (NSString *)macSignWithText:(NSString *)text secretKey:(NSString *)secretKey
  2. {
  3. NSData *saltData = [secretKey dataUsingEncoding:NSUTF8StringEncoding];
  4. NSData *paramData = [text dataUsingEncoding:NSUTF8StringEncoding];
  5. NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH ];
  6. CCHmac(kCCHmacAlgSHA1, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
  7. NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
  8. return base64Hash;
  9. }

Demo 工程下载

上文描述的客户端代码具体实现请参考Demo 工程。请根据业务需求适当修改后再用于生产环境。

本文导读目录