閱讀761 返回首頁    go 小米 go 小米5


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 來管理資源包依賴。具體配置流程如下:

  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 工程。請根據業務需求適當修改後再用於生產環境。

最後更新:2016-11-29 17:23:28

  上一篇:go SSL 方式接入示例__Java 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
  下一篇:go MQTT 數據查詢__MQTT 接入(物聯)_消息隊列 MQ-阿裏雲