热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发者福音:iOS项目也能支持MQTT5.0啦!

首个支持MQTT5.0的iO






2017 年 8 月,OASIS MQTT Technical Committee 正式发布了用于 Public Review 的 MQTT 5.0 草案。2018 年,MQTT 5.0 正式发布。

然而到目前为止,苹果生态里仍没有完整支持 MQTT 5.0 的客户端 SDK。


CocoaMQTT (https://github.com/emqx/CocoaMQTT/tree/master)是 EMQ 团队为 iOS 开发者提供的 MQTT 客户端 SDK,目前在 iOS 开发者中有着较为广泛的使用。

为弥补苹果生态中对 MQTT 5.0 支持方面的空白,EMQ 团队于近日正式发布了 CocoaMQTT 全新版本 v2.0。CocoaMQTT v2.0 支持 MQTT 5.0,同时兼容 3.1.1 版本,支持 iOS、tvOS 与 OSX 操作系统。用户现已可通过 CocoaMQTT 实现 iOS 系统设备连接 MQTT 5.0 云服务,享受 MQTT 5.0 带来的强大功能加成。

CocoaMQTT 使用 Swift 语言开发,而非 Objective-C。这是因为 Swift 是一门类型安全的语言,对协议的支持更加丰富,配合扩展(extension)、泛型、关联类型等可以实现面向协议编程,从而大大提高代码的灵活性。

此外,在 WWDC 2021 大会上,苹果宣布了 Swift 语言中并发模型的重大更新:通过编译器实现的 Actor 并发模型,新增 Actor 引用类型帮助开发者避免数据竞争问题。

因此,我们相信在 MQTT 相关的 I/O 密集型并发应用中,相较于Objective-C,Swift 的表现将更值得期待。


MQTT 5.0 vs MQTT 3.1.1


MQTT 3.1.1 仍然有很多不完善的地方,例如连接异常断开时无法通知原因到对端。MQTT 5.0 在 MQTT 3.1.1 的基础上做了很多改变,但并不是向下兼容的。

MQTT 协议 5.0 版本新增了会话/消息延时功能、原因码、主题别名、in-flight 流控、用户属性、共享订阅等功能,以及用于增强认证安全的 AUTH 报文。

其中,原因码和用户属性 Property
字段使得 MQTT 5.0 能够携带更多上下文信息,从而解决在 3.1.1 版本因协议不完整而较难处理的问题。

MQTT5.0 的主要功能优势有:

  • 进一步支持更大规模的可扩展系

  • 更加详细的错误报告和处理机制

  • 容量探索和请求响应等通用模式的规范化操作

  • 可扩展的用户属性(User Property)

  • 改进性能并支持小型客户端

  • 会话保持和消息超时设置

  • 新增支持 Req/Rsp 消息模式


CocoaMQTT 使用


本文将使用 EMQ 提供的 免费公共 MQTT 服务器 EMQ X 进行 CocoaMQTT 功能使用介绍,该服务基于 EMQ X 的 MQTT 云服务 EMQ X Cloud 创建。

服务器接入信息如下:

  • Broker: broker-cn.emqx.io

  • TCP Port: 1883

  • Websocket Port: 8083

  • TCP/TLS 端口: 8883

  • Websocket/TLS 端口:8084


连接 MQTT 服务

我们看到 MQTT5.0 增加了许多的属性,其中 Property
段可以让使用者根据自己的情况,更加细致化去完成需求。

///MQTT 5.0
let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
let mqtt5 = CocoaMQTT5(clientID: clientID, host: "broker-cn.emqx.io", port: 1883)


let cOnnectProperties= MqttConnectProperties()
connectProperties.topicAliasMaximum = 0
connectProperties.sessiOnExpiryInterval= 0
connectProperties.receiveMaximum = 100
connectProperties.maximumPacketSize = 500
mqtt5.cOnnectProperties= connectProperties


mqtt5.username = "test"
mqtt5.password = "public"
mqtt5.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout")
mqtt5.keepAlive = 60
mqtt5.delegate = self
mqtt5.connect()


///MQTT 3.1.1
let clientID = "CocoaMQTT-" + String(ProcessInfo().processIdentifier)
let mqtt = CocoaMQTT(clientID: clientID, host: "broker-cn.emqx.io", port: 1883)
mqtt.username = "test"
mqtt.password = "public"
mqtt.willMessage = CocoaMQTTWill(topic: "/will", message: "dieout")
mqtt.keepAlive = 60
mqtt.delegate = self
mqtt.connect()



订阅主题

MQTT 5.0 在 MQTT 3.1.1 上面多了订阅选项等操作。

///MQTT 5.0
mqtt5.subscribe("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1)
//or
//let subscriptions : [MqttSubscription] = [MqttSubscription(topic: "chat/room/animals/client/+"),MqttSubscription(topic: "chat/room/foods/client/+"),MqttSubscription(topic: "chat/room/trees/client/+")]
//mqtt.subscribe(subscriptions)


///MQTT 3.1.1
mqtt.subscribe("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1)
//or
//let subscriptions : [(String, CocoaMQTTQoS)] = [("chat/room/animals/client/+", qos: CocoaMQTTQoS.qos1),("chat/room/foods/client/+", qos: CocoaMQTTQoS.qos1),("chat/room/trees/client/+", qos: CocoaMQTTQoS.qos1)]
//mqtt.subscribe(subscriptions)



发布主题


///MQTT 5.0
mqtt5!.publish("chat/room/animals/client/" + animal!, withString: message!, qos: .qos1, DUP: false, retained: false, properties: publishProperties)


///MQTT 3.1.1
mqtt!.publish("chat/room/animals/client/" + animal!, withString: message!, qos: .qos1)



自动重连

MQTT 是基于 TCP 长连接的协议,在实际使用的场景中,由于网络故障或信号问题导致连接中断是经常出现的问题。许多开发者会希望 SDK 能够提供方便的自动重连方式。

///MQTT 5.0
mqtt5!.autoRecOnnect= true


///MQTT 3.1.1
mqtt!.autoRecOnnect= true



单双向 SSL 连接


///MQTT 5.0
mqtt5!.enableSSL = true


///MQTT 3.1.1
mqtt!.enableSSL = true


let clientCertArray = getClientCertFromP12File(certName: "client-keycert", certPassword: "MySecretPassword")
var sslSettings: [String: NSObject] = [:]
sslSettings[kCFStreamSSLCertificates as String] = clientCertArray


///MQTT 5.0
mqtt5!.sslSettings = sslSettings


///MQTT 3.1.1
mqtt!.sslSettings = sslSettings


如果需要 .p12 文件可以在终端使用以下语句生成:

openssl pkcs12 -export -clcerts -in client-cert.pem -inkey client-key.pem -out client.p12


设置保留消息和遗嘱消息

MQTT 5.0 与 MQTT 3.1.1 比,多了更多的属性设置可供用户使用。

///MQTT 5.0
let lastWillMessage = CocoaMQTTMessage(topic: "/chat/room/animals/client/Sheep", string: "dieout")
lastWillMessage.retained = true
lastWillMessage.qos = .qos1
mqtt5!.willMessage = lastWillMessage


///MQTT 3.1.1
mqtt!.willMessage = CocoaMQTTMessage(topic: "/will", string: "dieout")



AUTH 报文

MQTT 单纯通过 CONNECT
可能无法提供足够的信息给 Server 进行身份认证,所以 MQTT 5.0 新增此功能。用于客户端和服务器之间的加强认证。

 let authProperties = MqttAuthProperties()
       mqtt5!.auth(reasonCode: CocoaMQTTAUTHReasonCode.continueAuthentication, authProperties: authProperties)



iOS 应用后台运行

推荐使用 「Background fetch“」模式或 IOS13 新增的「Background processing」模式。

如果使用 beginBackgroundTaskWithName 和 endBackgroundTask 相关的 API,可以保持 APP 在后台运行 30 秒。


总结

至此,我们完成了使用 CocoaMQTT 客户端连接到公共 MQTT 服务器,并实现了客户端与 MQTT 服务器的连接、消息发布和订阅。

EMQ 致力于帮助用户轻松便捷地使用 MQTT 开展物联网业务,我们的一系列客户端 SDK 均在持续开发中,敬请关注


We are hiring! Join us and Code the Future together.

► EMQ 2021 全球招聘季

简历投递邮箱:hr@emqx.io

EMQ HR


点击"阅读原文" ,了解 CocoaMQTT

↓↓↓



推荐阅读
  • 一.什么是垃圾回收曾几何时,内存管理是程序员开发应用的一大难题。传统的系统级编程语言(主要指CC++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 寻求更强大的身份和访问管理(IAM)平台的企业正在转向云,并接受身份即服务(IDaaS)的灵活性。要为IAM选择正确的场外解决方案,业务管理人员和IT专业人员必须在实施之前评估安全 ... [详细]
  • 参考资料:cocoachina的zys475481075的文章几个单词Regular[regjʊlə]adj.定期的;有规律的Expression[ɪkspreʃ(ə)n;ek-]n. ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • 我的iOS开发入门自学路径
    我有一个清单,列着希望在大学里完成的事。比如,学一门乐器,和朋友去旅游,搭建自己的博客,去滑翔,看各主题的书籍。其中一项是,写自己的App并且上架。去年开始,我准备完成这一项,所以 ... [详细]
  • 【全网首发】鸿蒙开源三方组件跨平台自适应布局yoga组件
    全网,首,发,鸿,蒙,开源,三,方,组件,跨,平台,自,适应, ... [详细]
  • ios原生骨架库,网络过渡动画封装
    最新版2.0.5,release版本目录关于TABAnimated实现原理优点演变过程效果图安装使用Cocoapods手动导入使用步骤扩展回调Tips属性相关强调最后关于TABAn ... [详细]
  • 开发笔记:一派胡言!Swift 不是多范式函数式编程语言
    “一种世界观。”是的,这就是它的本质所在。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 苹果新手机必须需要设置什么软件?
    第一、设置iCloud账户,这会非常重要,很多服务和资料同步都依赖你设置的这个iCloud账户,而且请一定是要你自己可以控制的iCloud账户,并且也只有你才能控制;第二、在iCl ... [详细]
  • iOS FMDB库详解
    更新时间:2018-11-22新增了插入修改数据的注意事项(空值问题)更新时间:2018-11-06新增了修改(更新)数据时的多字段修改更新时间:2018-07-13修改了推荐的S ... [详细]
author-avatar
mobiledu2502887897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有