概要

在工业物联网(IoT)场景中,移动端 App 与硬件设备通过 Modbus 协议进行通信是常见需求。近期因公司项目需要,我开发了一款支持 Android 和 iOS 双平台 的 Modbus 通信原生插件,用于 UniApp 应用通过 UTS 调用底层能力,实现与 WiFi 或串口设备的数据交互。

作为多年全栈开发者,Android 端开发较为顺利,而 iOS 端则需从零学习 Swift 与 Objective-C 混编、Framework 打包等知识。本文将重点记录开发过程中使用的核心开源库、关键配置、踩坑经验及最终解决方案,并分享完整插件实现思路,为后续类似项目提供参考。


整体架构流程

本插件采用 “UniApp + UTS + 原生桥接” 的三层架构:

  1. 上层应用层:使用 UniApp 编写业务逻辑,通过 uts 插件调用底层通信能力;
  2. 中间桥接层(UTS)
    • 定义统一接口(如 initModbus, readHoldingRegisters 等);
    • 分别对接 Android 的 Java/Kotlin 实现与 iOS 的 Swift 实现;
  3. 底层原生实现层
    • 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 通信。
@objcSwift 中用于暴露方法给 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

希望本文能帮助同样在工业通信、跨端原生插件开发路上探索的开发者少走弯路!


下面是一些关键项的截图,当做记录。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐