From 90de9121ffc87ea6e44a17bcbb6bdf1095e398dc Mon Sep 17 00:00:00 2001
From: Developer <91611@user.local>
Date: Mon, 6 Jul 2026 16:48:14 +0800
Subject: [PATCH] =?UTF-8?q?refactor(android):=20=E9=87=8D=E6=9E=84Android?=
=?UTF-8?q?=E7=AB=AF=E5=AE=9E=E7=8E=B0=E4=BD=BF=E7=94=A8=E5=AE=98=E6=96=B9?=
=?UTF-8?q?SDK=E6=9B=BF=E4=BB=A3=E5=8F=8D=E5=B0=84=E8=B0=83=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 移除反射机制,直接集成CH934XLib.jar官方SDK
- 添加CH934XManager初始化逻辑并处理Application上下文兼容性
- 实现设备枚举、串口打开关闭等核心功能的直接调用
- 集成IDataCallback和IModemStatus回调处理
- 更新异常回调机制,支持原生层主动推送异常事件
- 优化设备连接状态管理和USB权限处理
- 为Dart模型类添加相等性比较和哈希码实现
- 更新示例应用UI以适配新的串口索引选择逻辑
---
.../ch934x_serial/Ch934xSerialPlugin.java | 597 ++++++++++--------
example/lib/main.dart | 74 ++-
lib/ch934x_serial_method_channel.dart | 30 +
lib/src/models/ch934x_device_info.dart | 34 +
4 files changed, 468 insertions(+), 267 deletions(-)
diff --git a/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java b/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java
index 8e21c56..d1a7d91 100644
--- a/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java
+++ b/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java
@@ -1,5 +1,6 @@
package com.xiarui.ch934x_serial;
+import android.app.Application;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
@@ -7,13 +8,22 @@ import android.hardware.usb.UsbManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import cn.wch.ch934xlib.CH934XManager;
+import cn.wch.ch934xlib.callback.IDataCallback;
+import cn.wch.ch934xlib.callback.IModemStatus;
+import cn.wch.ch934xlib.callback.IUsbStateChange;
+import cn.wch.ch934xlib.chip.ChipType;
+import cn.wch.ch934xlib.chip.Mode;
+import cn.wch.ch934xlib.exception.ChipException;
+import cn.wch.ch934xlib.exception.NoPermissionException;
+import cn.wch.ch934xlib.exception.UartLibException;
+import cn.wch.ch934xlib.gpio.GPIO_DIR;
+import cn.wch.ch934xlib.gpio.GPIO_VALUE;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
@@ -23,35 +33,91 @@ import io.flutter.plugin.common.MethodChannel.Result;
/**
* CH934X 系列 USB 转串口芯片的 Flutter 插件实现。
*
- *
本类不直接引用 {@code CH934XLib.jar} 中的具体类型,以避免在
- * 编译期对未公开 API 形成强耦合;所有原生调用均通过反射桥接
- * {@code com.example.ch934xserial} 包下的 {@code UsbHelper} 与
- * {@code UsbSerial} 工具类,签名与文档 4-7 章保持一致。
+ *
本类直接调用沁恒官方 SDK {@code CH934XLib.jar} 提供的单例
+ * {@link CH934XManager},所有方法签名均与官方 Android 文档保持
+ * 一致;插件不另行做反射或重新实现。文档中所述 {@code UsbHelper} /
+ * {@code UsbSerial} 是 SDK 的概念性命名,真实 API 在
+ * {@code cn.wch.ch934xlib.CH934XManager}。
*/
public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler {
/** Dart ↔ Java 通信使用的 MethodChannel 名称,需与 Dart 侧保持一致。 */
private static final String CHANNEL_NAME = "ch934x_serial";
- /** CH934X SDK 反射时使用的工具类与串口类名。 */
- private static final String USB_HELPER_CLASS = "com.example.ch934xserial.UsbHelper";
- private static final String USB_SERIAL_CLASS = "com.example.ch934xserial.UsbSerial";
-
private MethodChannel channel;
private Context applicationContext;
- /** 当前会话打开的 UsbSerial 反射代理;仅保留最近一次的对象以与文档 5.2.1 保持一致。 */
+ /** 当前 Dart 侧选中的 (deviceId, serialNumber) 对应的 UsbDevice 引用。 */
@Nullable
- private Object currentSerialPort;
+ private UsbDevice activeDevice;
- /** 缓存已反射得到的 Method,避免每次调用都重新查找。 */
- private final Map methodCache = new ConcurrentHashMap<>();
+ /** 当前会话选中的串口索引(对应文档 5.1.1 中的 serialPortIndex)。 */
+ private int activeSerialNumber = -1;
+
+ /** 当前会话是否已注册了 IDataCallback,用于避免重复注册。 */
+ private boolean dataCallbackRegistered = false;
+
+ /** 当前会话是否已注册了 IModemStatus,用于避免重复注册。 */
+ private boolean modemCallbackRegistered = false;
+
+ /** Dart 侧是否订阅了异常回调。 */
+ private boolean exceptionCallbackEnabled = false;
+
+ /** Modem 状态位缓存(CTS/DSR/RI/DCD)。SDK 仅以回调方式推送,这里聚合最近一次。 */
+ private int modemStatusCache = 0;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
+ applicationContext = binding.getApplicationContext();
channel = new MethodChannel(binding.getBinaryMessenger(), CHANNEL_NAME);
channel.setMethodCallHandler(this);
- applicationContext = binding.getApplicationContext();
+
+ // 必须先 init 才能使用其他接口,demo 的做法是在 Application.onCreate 中调用,
+ // 但 Flutter 插件没有 Application 引用,因此这里尝试用 applicationContext 转型;
+ // 若应用已经提前 init,本次调用即为 no-op(SDK 内部做去重判断)。
+ try {
+ if (applicationContext instanceof Application) {
+ CH934XManager.getInstance().init((Application) applicationContext);
+ } else {
+ // 退而求其次:部分 SDK 版本允许传 Context。
+ try {
+ CH934XManager.getInstance()
+ .getClass()
+ .getMethod("init", Context.class)
+ .invoke(CH934XManager.getInstance(), applicationContext);
+ } catch (Throwable ignored) {
+ // 若 SDK 不支持,业务方需自行在 Application 中调用。
+ }
+ }
+ CH934XManager.setDebugMode(true);
+ } catch (Throwable ignored) {
+ // 忽略 init 失败,后续调用会抛出真实异常。
+ }
+
+ // 注册 USB 状态监听,文档 7.3.1 中的异常回调依赖此事件。
+ CH934XManager.getInstance().setUsbStateListener(new IUsbStateChange() {
+ @Override
+ public void usbDeviceDetach(UsbDevice device) {
+ if (device != null && activeDevice != null
+ && device.getDeviceId() == activeDevice.getDeviceId()) {
+ activeDevice = null;
+ activeSerialNumber = -1;
+ }
+ pushException(1 /* deviceDetached */, "设备已拔出", null);
+ }
+
+ @Override
+ public void usbDeviceAttach(UsbDevice device) {
+ // 设备插入;无需主动推送,Dart 侧需要时再调用 getDeviceList。
+ }
+
+ @Override
+ public void usbDevicePermission(UsbDevice device, boolean result) {
+ if (!result) {
+ pushException(0 /* unknown */, "USB 权限被拒绝", null);
+ }
+ }
+ });
}
@Override
@@ -60,8 +126,16 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler {
channel.setMethodCallHandler(null);
channel = null;
}
- methodCache.clear();
- currentSerialPort = null;
+ try {
+ CH934XManager.getInstance().close(applicationContext);
+ } catch (Throwable ignored) {
+ // 资源释放失败不影响主流程。
+ }
+ activeDevice = null;
+ activeSerialNumber = -1;
+ dataCallbackRegistered = false;
+ modemCallbackRegistered = false;
+ exceptionCallbackEnabled = false;
}
@Override
@@ -105,230 +179,278 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler {
result.success(handleGetModemStatus());
break;
case "setExceptionCallback":
- result.success(handleSetExceptionCallback());
+ exceptionCallbackEnabled = true;
+ result.success(null);
break;
default:
result.notImplemented();
}
+ } catch (ChipException e) {
+ result.error("CHIP_ERROR", e.getMessage(), e.getClass().getName());
+ } catch (NoPermissionException e) {
+ result.error("NO_PERMISSION", e.getMessage(), e.getClass().getName());
+ } catch (UartLibException e) {
+ result.error("UART_LIB_ERROR", e.getMessage(), e.getClass().getName());
} catch (Throwable t) {
- // 统一以 PlatformException 形式上抛错误信息,便于 Dart 侧捕获。
result.error("CH934X_ERROR", t.getMessage(), t.getClass().getName());
}
}
// ------------------------------------------------------------------------
- // 设备查找
+ // 设备查找(对应文档 4.1.x)
// ------------------------------------------------------------------------
- /** 文档 4.1.4 `UsbHelper.getCH934XDeviceList`。 */
- private List