更新记录

1.0.0(2026-07-28)

  • 首次发布
  • 支持 TCP/UART 硬件通信
  • 支持长连接、断线重连、心跳保活
  • 支持粘包分包、Modbus TCP、USB 转串口

平台兼容性

uni-app(3.8.1)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - 5.0 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(3.8.1)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

uni-hardware-connect

UniApp 硬件通信 UTS 原生插件。提供 TCP 长连接Modbus TCPUSB 转串口 能力,专为工控平板、PDA、物联网设备设计。

特性

  • TCP 二进制长连接(子线程非阻塞读写)
  • 断线自动重连(指数退避,可设最大次数)
  • 心跳保活 + 超时检测
  • 可配置的粘包分包处理器(帧头 + 长度域)
  • Modbus TCP 协议封装(Promise API)
  • USB 转串口 RS232/RS485/TTL(via usb-serial-for-android)
  • 单例多连接管理,页面销毁自动释放

环境要求

项目 要求
HBuilderX ^4.0.0
平台 Android 5.0+
项目类型 uni-app (Vue2/Vue3)

快速开始

1. 安装

uni-hardware-connect 复制到项目 uni_modules/ 目录。

2. 基础 TCP 通信

import { HardwareTcpClient } from '@/uni_modules/uni-hardware-connect/utssdk/app-android/index'

const client = new HardwareTcpClient({
    host: "192.168.1.100",
    port: 8899,
    reconnect: true,
    reconnectInterval: 3000,
    heartbeatInterval: 5000,
    heartbeatData: HardwareTcpClient.hex2buf("AA BB 00 00")
})

client.onStatus((status) => {
    console.log("连接状态:", status)
})

client.onData((buffer) => {
    const hex = HardwareTcpClient.buf2hex(buffer)
    console.log("收到:", hex)
})

client.onError((msg, code) => {
    console.error("错误:", code, msg)
})

client.connect()

// 发送报文
const buf = HardwareTcpClient.hex2buf("AA BB 00 02 01 02 00 00")
client.send(buf)

// 页面销毁时
// client.destroy()

3. Modbus TCP

import { ModbusTcpClient } from '@/uni_modules/uni-hardware-connect/utssdk/modbus-tcp'

const modbus = new ModbusTcpClient({
    host: "192.168.1.50",
    port: 502,
    unitId: 1
})

modbus.onStatus((s) => console.log(s))
modbus.connect()

// 读取保持寄存器(Promise API)
const values = await modbus.readHoldingRegisters(0, 10)
console.log("寄存器值:", values)

// 写单个寄存器
await modbus.writeSingleRegister(0, 1234)

4. USB 转串口

import { HardwareSerialClient } from '@/uni_modules/uni-hardware-connect/utssdk/app-android/serial-bridge'

const serial = new HardwareSerialClient({
    baudRate: 9600,
    dataBits: 8,
    vendorId: 0x1A86,  // CH340 示例
    productId: 0x7523
})

const devices = serial.listDevices()
console.log("检测到设备:", devices)

serial.onData((buf) => {
    console.log("串口收到:", HardwareTcpClient.buf2hex(buf))
})

serial.connect()
serial.send(new Uint8Array([0xAA, 0xBB, 0x00, 0x01]).buffer as ArrayBuffer)

API 参考

HardwareTcpClient

构造参数

参数 类型 默认值 说明
host string - 服务器 IP
port number - 服务器端口
reconnect boolean true 是否自动重连
reconnectInterval number 3000 重连间隔 (ms)
maxReconnectAttempts number 0 最大重连次数 (0=不限)
heartbeatInterval number 5000 心跳间隔 (ms)
heartbeatData ArrayBuffer null 心跳报文,null=禁用心跳
heartbeatTimeout number 15000 心跳超时 (ms)
disablePacketHandler boolean false 禁用粘包解析,直出 TCP 流

方法

方法 说明
connect() 建立连接
send(buffer: ArrayBuffer) 发送二进制数据
disconnect() 断开(可重连)
destroy() 销毁实例(不可再重连)
onStatus(cb) 监听连接状态变化
onData(cb) 监听数据接收(完整帧)
onError(cb) 监听错误
static buf2hex(buf): string ArrayBuffer → 16进制字符串
static hex2buf(hex): ArrayBuffer 16进制字符串 → ArrayBuffer

ModbusTcpClient

构造参数(继承 HardwareTcpClient 参数 +)

参数 类型 默认值 说明
unitId number 1 从站地址
responseTimeout number 5000 响应超时 (ms)

方法

方法 返回 说明
readCoils(start, count) Promise\<boolean[]> FC01
readDiscreteInputs(start, count) Promise\<boolean[]> FC02
readHoldingRegisters(start, count) Promise\<number[]> FC03
readInputRegisters(start, count) Promise\<number[]> FC04
writeSingleCoil(addr, value) Promise\<void> FC05
writeSingleRegister(addr, value) Promise\<void> FC06
writeMultipleRegisters(start, values) Promise\<void> FC10

配置粘包分包

编辑 utssdk/app-android/index.uts 中的 handlePacket() 方法:

const HEADER: number[] = [0xAA, 0xBB]          // ← 改你的帧头
const bodyLen = view.getUint16(2, false)        // ← 改长度域位置/字节序
const totalFrameLen = 4 + bodyLen + 2            // ← 改帧结构

示例:三菱 MC 协议(帧头 0x50 0xFF)

const HEADER = [0x50, 0xFF]
// 长度域在第 3-4 字节,小端
const bodyLen = view.getUint16(2, true)
// 固定头 4 字节 + 数据 + 尾 2 字节
const totalFrameLen = 4 + bodyLen + 2

注意事项

  1. 页面卸载(onUnload/onHide)必须调用 client.destroy(),否则线程泄漏、后台持续连接
  2. TCP 粘包解析代码是示例协议,对接硬件时必须修改帧头、长度解析规则
  3. USB 串口需要 Android USB Host 支持,且需用户授权(调用 requestPermission()
  4. 模拟器网络行为与真机有差异,建议使用真实 Android 工控平板/PDA 调试

开发计划

  • [x] TCP 长连接基座
  • [x] 指数退避重连
  • [x] 心跳保活 + 超时检测
  • [x] 粘包分包处理器
  • [x] Modbus TCP 协议封装
  • [x] USB 转串口(基础框架)
  • [ ] iOS 平台支持
  • [ ] WebSocket 支持
  • [ ] 多连接管理器
  • [ ] 串口 DTR/RTS 控制

License

Apache-2.0

隐私、权限声明

1. 本插件需要申请的系统权限列表:

INTERNET — TCP 网络通信 ACCESS_NETWORK_STATE — 检测网络状态 ACCESS_WIFI_STATE — WiFi 相关硬件通信 WAKE_LOCK — 长连接时保持设备唤醒 USB_PERMISSION(通过 Intent Filter 处理)— USB 转串口

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。