公司动态
推荐一款IOS端的mqtt测试工具
苹果应用市场搜索MQTT工具MQTT for iOS一款基于 SwiftUI 的轻量级 MQTT 客户端关键词iOS、SwiftUI、MQTT、物联网、SwiftData、Network.framework、StoreKit 2、Keychain一款面向开发者、物联网调试和家庭自动化场景的原生 iOS MQTT 客户端。它把服务器连接、主题订阅、消息收发和关键字提醒集中到一个简洁的界面中适合在手机上快速观察和验证 MQTT 数据流。一、为什么做这个项目在物联网开发中MQTT Broker 往往运行在云服务器、局域网设备或家庭实验环境中。桌面工具功能丰富但临时查看一条消息、确认主题是否在线、验证 QoS 行为时手机端工具更加方便。这个项目的目标不是做一个复杂的运维平台而是提供一条短而完整的操作路径保存一个 MQTT 服务器连接添加需要关注的主题建立连接并自动订阅实时查看、搜索和清理消息必要时向指定主题发布测试消息。二、主要功能1. 多服务器连接管理首页以列表形式展示已保存的 MQTT 连接显示连接名称、服务器地址、端口和认证标识。用户可以新增、编辑和删除连接也可以在详情页查看当前连接状态。连接配置包含连接名称服务器地址端口号默认使用 MQTT 常见端口1883可选用户名和密码。应用会在保存前校验名称、主机和端口减少因为配置错误导致的连接失败。2. 主题订阅与自动恢复进入连接详情页后可以添加多个订阅主题并为每个主题选择 MQTT QoSQoS 0最多一次可能丢失QoS 1至少一次可能重复QoS 2仅一次可靠性最高。连接成功后应用会自动重新订阅该连接下已经保存的主题。这样在重新打开页面或重建连接后不需要逐个重复配置。主题既支持普通路径也支持 MQTT 通配符例如sensor/temperature home/# device//statusCopy3. 发布消息客户端不仅可以接收消息也可以向任意主题发布测试数据。发布页面支持设置目标主题文本消息内容QoS 0/1/2Retain 保留消息标志。发送后界面会反馈发布请求的提交状态。对于 QoS 1 和 QoS 2底层服务还会跟踪对应回执并在超时或失败时把错误反馈到界面。4. 实时消息列表与搜索收到的消息会按最新时间排在前面消息条目包含主题、Payload、接收时间和 QoS。消息列表提供主题和内容搜索适合从大量测试数据中快速定位目标消息。用户可以点击消息查看详情也可以一键清空当前连接的消息缓存。当前实现最多在内存中保留 1000 条消息避免长时间运行造成无限增长。5. 关键字本地提醒在消息列表中可以设置关键字和检查间隔。当新消息的主题或内容包含关键字时应用会发送 iOS 本地通知在列表中高亮匹配消息将匹配消息置顶便于快速处理。提醒服务会记录最近已经提醒过的消息 ID避免同一条消息被重复通知。检查间隔可以按秒设置默认值为 5 秒。6. Pro 解锁策略当前版本对免费用户开放第一个连接更多服务器连接需要解锁 MQTT Pro。项目使用 StoreKit 2 管理两种商品月度自动续订一次性终身买断。应用启动时会异步加载商品并监听交易更新购买完成、恢复购买、退款或订阅过期都会重新计算权益状态。支付页面同时提供隐私政策和最终用户许可协议入口。三、技术架构项目采用接近 MVVM 的分层结构目录职责比较明确mqtt/ ├── Models/ 连接、订阅、消息和状态模型 ├── Views/ SwiftUI 页面与表单 ├── ViewModels/ 连接列表和 MQTT 业务协调 └── Services/ 网络、持久化、钥匙串、通知和内购服务Copy1. SwiftUI 负责界面ConnectionListView是入口页面ConnectionDetailView负责单个 Broker 的连接状态、订阅列表和消息操作MessageListView负责搜索、详情和提醒设置。新增连接、添加订阅和发布消息都使用独立的表单页面便于维护和测试。2. SwiftData 保存业务配置Connection和Subscription使用Model定义并通过一对多关系关联。删除连接时会级联删除其订阅配置。应用入口在创建ModelContainer失败时会先备份疑似损坏的本地存储再重建容器如果仍然失败则降级到内存容器避免因为本地数据库问题直接启动崩溃。3. Network.framework 实现 MQTT 通信MQTTService通过NWConnection建立 TCP 连接在专用串行队列中执行网络操作并手动构造和解析 MQTT 3.1.1 报文。服务层通过 Combine Publisher 向MQTTViewModel发布连接状态收到的消息发布回执订阅和取消订阅回执。连接成功后会启动 Keep Alive发布和订阅分别有回执超时监控默认连接超时时间为 12 秒回执超时时间为 15 秒。UI 状态统一在主线程更新避免网络线程直接修改界面状态。核心接口如下protocol MQTTServiceProtocol { var statusPublisher: AnyPublisherConnectionStatus, Never { get } var messagePublisher: AnyPublisherMessage, Never { get } func connect(host: String, port: UInt16, clientId: String, username: String?, password: String?) func subscribe(topic: String, qos: Int) func unsubscribe(topic: String) func publish(topic: String, payload: String, qos: Int, retain: Bool) }Copy4. Keychain 保存密码连接模型只保存连接元数据密码由KeychainService按连接 ID 存储。对于旧版本可能存在的明文密码ConnectionViewModel在加载时会尝试迁移到系统钥匙串并清除模型中的明文值。删除连接时也会同步删除对应的钥匙串密码。四、一次典型使用流程以查看温度传感器为例点击首页右上角的加号填写 Broker 地址和端口在连接详情页添加sensor/temperature选择 QoS 1点击“连接”等待状态变为“已连接”打开消息列表实时查看传感器 Payload使用搜索框定位某个设备或数值设置关键字alarm当告警消息到达时接收本地提醒需要验证下行控制时打开“发送消息”设置主题、内容、QoS 和 Retain 后发布。五、测试与工程质量仓库包含独立的单元测试和 UI 测试。当前测试覆盖了连接参数校验SwiftData 持久化Keychain 密码迁移和安全存储MQTT ViewModel 的发布、订阅回执处理QoS 与消息格式化本地通知相关逻辑StoreKit 法律链接和购买相关状态。项目还使用PublishAckTracker和SubscriptionAckTracker管理异步回执避免把“请求已提交”和“服务器已确认”混为一谈。六、如何运行项目开发环境要求iOS 17.0 或更高版本Xcode 15.0 或更高版本Swift 5.9 或更高版本。打开mqtt.xcodeproj后运行mqttScheme。项目仓库包含 CocoaMQTT 目录和相关配置说明当前主应用的 MQTT 服务实现位于mqtt/Services/MQTTService.swift使用 AppleNetwork.framework处理 TCP 和 MQTT 报文。命令行构建示例xcodebuild -scheme mqtt -configuration Debug buildCopy运行模拟器测试xcodebuild test \ -scheme mqtt \ -destination platformiOS Simulator,nameiPhone 15Copy七、当前版本的边界为了让介绍准确下面几点需要在使用或发布时说明当前连接实现基于 TCP 和 MQTT 3.1.1 报文代码中没有把 TLS、WebSocket 或 MQTT 5 特性作为主流程暴露消息主要保存在运行时内存中清空或重新启动后不会作为历史消息库长期保存本地通知依赖用户授予通知权限发布和订阅的最终结果仍取决于网络质量和 Broker 的实际配置多连接属于 Pro 能力免费用户默认只能使用最早创建的连接。八、总结这个项目适合希望在 iOS 设备上快速连接 MQTT Broker 的开发者也适合作为学习 SwiftUI、SwiftData、Combine、Network.framework 和 StoreKit 2 的完整练习案例。它的价值在于把 MQTT 客户端最常用的几个动作做成了清晰的移动端闭环配置一次、自动订阅、实时观察、按需发布、关键字提醒。对于物联网调试、家庭自动化监控和教学演示等场景这样的轻量工具足够直接也方便继续扩展 TLS、WebSocket、MQTT 5 属性和历史消息持久化等能力。项目关键词SwiftUI、SwiftData、Combine、Network.framework、MQTT、物联网、iOS、StoreKit 2、Keychain、实时消息