761
iPhone_iPad_Mac_手机_平板_苹果apple
MQTT iOS 接入示例__iOS 接入示例_MQTT 接入(物联)_消息队列 MQ-阿里云
本文主要介绍如何使用 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 来管理资源包依赖。具体配置流程如下:
CocoaPods 安装配置
CocoaPods 依赖 Ruby 等基础环境。请确保安装过 Ruby,然后将国内的镜像源更新为淘宝源,提高资源包下载速度。
//查看软件源
gem sources -l
//清理掉默认的软件源
gem sources --remove https://rubygems.org/
//加入淘宝的源
gem sources -a https://ruby.taobao.org/
更新完地址后,运行以下命令,等待一段时间后即可运行 pod 工具:
sudo gem install cocoapods
更新项目依赖
MQTT-Client-FrameWork 第三方框架支持 pod 管理方式,因此添加依赖只需要在项目根目录的 Podfile 中加入依赖即可,内容如下:
pod 'MQTTClient'
target '${yourprojectname}' do
end
其中 target 填入项目的名称,然后在 Podfile 目录下运行以下命令,更新依赖即可。
pod install
主要代码示例
初始化客户端
MQTT-Client-FrameWork 包提供的客户端类有 MQTTSession 和 MQTTSessionManager,建议使用后者维持静态资源,而且已经封装好自动重连等逻辑。初始化时需要传入相关的网络参数。具体如下:
self.manager = [[MQTTSessionManager alloc] init];
self.manager.delegate = self;
self.manager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:self.qos]
forKey:[NSString stringWithFormat:@"%@/#", self.rootTopic]];
//password的计算方式是,使用secretkey对groupId做hmac签名算法,具体实现参考macSignWithText方法
NSString *passWord = [[self class] macSignWithText:self.groupId secretKey:self.secretKey];
[self.manager connectTo:self.mqttSettings[@"host"]
port:[self.mqttSettings[@"port"] intValue]
tls:[self.mqttSettings[@"tls"] boolValue]
keepalive:60 //心跳间隔不得大于120s
clean:true
auth:true
user:self.accessKey
pass:passWord
will:false
willTopic:nil
willMsg:nil
willQos:0
willRetainFlag:FALSE
withClientId:self.clientId];
添加回调接口
针对连接当前状态,添加对应的回调接口,可以进行相关的业务逻辑处理。
[self.manager addObserver:self
forKeyPath:@"state"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
switch (self.manager.state) {
case MQTTSessionManagerStateClosed:
break;
case MQTTSessionManagerStateClosing:
break;
case MQTTSessionManagerStateConnected:
break;
case MQTTSessionManagerStateConnecting:
break;
case MQTTSessionManagerStateError:
break;
case MQTTSessionManagerStateStarting:
default:
break;
}
}
userName 和 passWord 的设置
由于服务端需要对客户端进行鉴权,因此需要传入合法的 userName 和 passWord。userName 设置为当前用户的 AccessKey,password 则设置为 MQTT 客户端 GroupID 的签名字符串,签名计算方式是使用 SecretKey 对 GroupID 做 HmacSHA1 散列加密。具体方法请参考 Demo 中的 macSignWithText 函数。
+ (NSString *)macSignWithText:(NSString *)text secretKey:(NSString *)secretKey
{
NSData *saltData = [secretKey dataUsingEncoding:NSUTF8StringEncoding];
NSData *paramData = [text dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH ];
CCHmac(kCCHmacAlgSHA1, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
return base64Hash;
}
Demo 工程下载
上文描述的客户端代码具体实现请参考 Demo 工程。请根据业务需求适当修改后再用于生产环境。
最后更新:2016-11-29 17:23:28
上一篇:
SSL 方式接入示例__Java 接入示例_MQTT 接入(物联)_消息队列 MQ-阿里云
下一篇:
MQTT 数据查询__MQTT 接入(物联)_消息队列 MQ-阿里云
新网接入__CNAME绑定教程_用户指南_CDN-阿里云
创建备份__备份恢复_API 参考_云数据库 RDS 版-阿里云
查询请求缓存命中率__资源监控接口_API 手册_CDN-阿里云
查询RDS地域和可用区信息__实例管理_API 参考_云数据库 RDS 版-阿里云
快速搭建移动应用直传服务__移动应用端直传实践_最佳实践_对象存储 OSS-阿里云
Dashboard概览__Dashboard_用户指南_云监控-阿里云
DTS服务账号角色授权__访问控制_用户指南_数据传输-阿里云
怎样为一个子用户授予只读访问SLB的权限___负载均衡(SLB)授权问题_授权常见问题_访问控制-阿里云
HaVipSetType__数据类型_API 参考_云服务器 ECS-阿里云
删除所有特殊流控__流量控制相关接口_API_API 网关-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云