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-阿裏雲