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