基于 Modbus 协议的跨平台原生插件开发实践:Android 与 iOS 双端支持
·
概要
在工业物联网(IoT)场景中,移动端 App 与硬件设备通过 Modbus 协议进行通信是常见需求。近期因公司项目需要,我开发了一款支持 Android 和 iOS 双平台 的 Modbus 通信原生插件,用于 UniApp 应用通过 UTS 调用底层能力,实现与 WiFi 或串口设备的数据交互。
作为多年全栈开发者,Android 端开发较为顺利,而 iOS 端则需从零学习 Swift 与 Objective-C 混编、Framework 打包等知识。本文将重点记录开发过程中使用的核心开源库、关键配置、踩坑经验及最终解决方案,并分享完整插件实现思路,为后续类似项目提供参考。
整体架构流程
本插件采用 “UniApp + UTS + 原生桥接” 的三层架构:
- 上层应用层:使用 UniApp 编写业务逻辑,通过
uts插件调用底层通信能力; - 中间桥接层(UTS):
- 定义统一接口(如
initModbus,readHoldingRegisters等); - 分别对接 Android 的 Java/Kotlin 实现与 iOS 的 Swift 实现;
- 定义统一接口(如
- 底层原生实现层:
- Android 端:基于 Modbus4Android(modbus4j 移植版),支持 TCP 与 RTU;
- iOS 端:基于 SwiftLibModbus(libmodbus 的 Swift 封装),目前仅支持 TCP。
架构图示意(可配图):
UniApp (JS/TS) ↓ UTS 插件接口(index.uts) ↓ ├─ Android: Modbus4Android → Serial/TCP └─ iOS: SwiftLibModbus → TCP only
技术名词解释
| 名词 | 说明 |
|---|---|
| Modbus | 一种串行通信协议,广泛用于工业设备间数据交换,支持 RTU(串口)和 TCP(以太网)两种传输模式。 |
| UTS(UniApp TypeScript) | DCloud 推出的跨端原生插件开发语言,允许在 UniApp 中调用平台原生能力,语法接近 TypeScript,但需严格遵循平台约束。 |
| SwiftLibModbus | 基于 C 语言 libmodbus 库的 Swift 封装,提供 iOS 平台 Modbus TCP 通信能力。 |
| Modbus4Android | 基于 modbus4j 的 Android 移植版本,支持串口(RTU)和 TCP,适配 Android USB/Serial 通信。 |
| @objc | Swift 中用于暴露方法给 Objective-C(及上层桥接层)的关键字,UTS 调用 iOS 原生方法必须依赖此机制。 |
技术细节
1. Android 端开发要点
- 使用开源库:licheedev/Modbus4Android
- 关键修改:原项目使用的串口 so 库体积小于 16KB,不符合 Google Play 的 Native Library 最小尺寸要求(防止被误判为恶意代码)。
解决方案:下载源码,升级串口依赖库(com.licheedev:android-serialport:2.1.5 最新版),重新编译生成合规 so 文件。 - 在
config.json中正确声明第三方依赖,确保打包时包含 Modbus 相关类。
2. iOS 端开发难点
- 使用开源库:ktsakaguchi/SwiftLibModbus
- 核心挑战:
- 需将
libmodbus(C 语言)与 Swift 混编,并打包为.framework; - 配置 Bridging Header,确保 Swift 能调用 C 函数;
- 所有需被 UTS 调用的方法必须添加
@objc前缀,否则无法暴露给上层。
- 需将
- 示例方法暴露:
@objc public func initDevModbus(ip: String, port: Int32, timeout: Double, isRtu: Bool, ...) -> Int32 { // 初始化逻辑 }
3. UTS 插件规范与约束
- 目录结构严格固定(可配图):
plugins/ └─ MsqModbusTcp/ ├── android/ ├── ios/ └── index.uts - iOS 端 UTS 调用方式:
import { MsqModbusTcpBridge } from 'MsqModbusTcp' const bridge = new MsqModbusTcpBridge() - 参数类型必须严格匹配:UTS 调用时传入的参数类型(如
NSString,Int,Double)必须与 Swift 方法签名完全一致,否则编译报错。export function initModbus( ip: NSString, port: number, timeout: number, isRtu: boolean, byteTimeout: number, retryInterval: number, maxRetryAttempts: number ): Int { return bridge.initDevModbus( ip = ip, port = Int(port), timeout = Double(timeout), isRtu = isRtu, byteTimeout = Double(byteTimeout), retryInterval = Double(retryInterval), maxRetryAttempts = Int(maxRetryAttempts) ) } - config.json 配置至关重要:需分别配置 Android 的 AAR/Maven 依赖与 iOS 的 Framework 引用路径,缺失将导致运行时崩溃。
小结
本次跨平台 Modbus 插件开发,不仅解决了公司项目中 Android 与 iOS 双端与硬件通信的实际问题,也让我深入理解了:
- iOS 原生开发中 Swift 与 C 混编的机制;
- UniApp UTS 插件的严格类型系统与桥接规范;
- 开源社区对工业协议支持的价值。
目前插件已支持:
- ✅ Android:Modbus TCP + RTU(串口)
- ✅ iOS:Modbus TCP(RTU 后续补充)
特别说明:市面上 UniApp 插件市场中 Modbus 插件多为收费,这里我免费提供有需要的人使用。
下载地址:https://download.csdn.net/download/qq_23063179/92631322
希望本文能帮助同样在工业通信、跨端原生插件开发路上探索的开发者少走弯路!
下面是一些关键项的截图,当做记录。







更多推荐

所有评论(0)