# Mini7-One Android Pad 本目录是 Mini7-One 上位机的 Capacitor Android Pad 工程,直接复用桌面端 `src/renderer` 下的 React 页面、路由、国际化和样式。 ## 架构 - React 页面:继续使用桌面端 renderer,不复制页面代码。 - 移动端适配:`src/bridge.ts` 提供兼容的 `window.api` 和 `window.electron`。 - Android 容器:`android-capacitor`。 - 仪器通信:`Mini7Plugin.java` 监听 UDP `9090`,TCP 从 `8001` 开始占用可用端口,并向 React 发送设备事件。 - 本地设置:业务设置写入 SQLite;仅登录记忆等临时设置使用 Capacitor Preferences。 - 数据库:使用 `@capacitor-community/sqlite`,任务、用户、医生、项目参数、结果、设备档案和计时器均读写 Pad 本地数据库。 ## 构建网页资源 ```powershell cd mobile-app npm install npm run build:web npm run build:web:oem ``` - `build:web`:构建普通版网页资源。 - `build:web:oem`:构建 OEM 版网页资源。 ## Android Studio 调试 普通版与 OEM 版由打开 Android Studio 前最后一次同步的网页资源决定。 在项目根目录 `D:\workspace\Mini7-PC-eTrust-desktop` 执行: ```powershell # 普通版 npm --prefix mobile-app run sync # OEM 版 npm --prefix mobile-app run sync:oem # 打开 Android Studio npm --prefix mobile-app run open ``` 如果终端当前位于 `mobile-app\android-capacitor`,应使用父目录作为 npm 项目: ```powershell # 普通版 npm --prefix .. run sync # OEM 版 npm --prefix .. run sync:oem ``` 不要在 `android-capacitor` 目录执行 `npm --prefix mobile-app ...`,否则 npm 会错误查找 `android-capacitor\mobile-app\package.json`。 同步完成后,在 Android Studio 中选择 `app`、已连接的 Android Pad,然后点击 **Run**。Android Studio 会编译并安装最后同步的普通版或 OEM 版。两版使用同一个 Android 包名,安装时会互相覆盖。Pad 与仪器必须处于同一局域网。 ## 构建 APK ```powershell cd mobile-app npm run build:apk npm run build:apk:oem ``` 也可以在项目根目录执行: ```powershell npm run build:pad npm run build:pad:oem ``` APK 输出到 `mobile-app/dist`: ```text Mini7-One-Pad-1.6.21.1-standard-debug.apk Mini7-One-Pad-1.6.21.1-oem-debug.apk ``` 普通版与 OEM 版使用同一个 Android 包名,安装时会互相覆盖;OEM 标识在构建阶段写入网页资源,不依赖运行时设置。 首次构建会下载 Gradle `8.14.3`、Android NDK `27.0.12077973` 和 CMake `3.22.1`,网络较慢时耗时较长。 ## 当前迁移状态 已完成: - Capacitor Android 容器。 - 现有 React renderer 完整构建。 - `window.api` 移动端兼容层。 - 默认管理员登录和设置持久化。 - UDP/TCP 原生监听。 - Mini7 帧校验、帧序号保留、设备信息及模块状态上报。 - 扫码开始、采样数据、检测结果和报警帧的协议回复、幂等处理及 SQLite 落库。 - 扫码项目参数校验、旧任务收尾、样本信息确认和检测参数下发。 - 当前 WiFi 自动读取、周边 WiFi 扫描及 Android 运行时权限申请。 - WiFi 参数通过已连接的 TCP 仪器下发,协议按仪器固件版本选择 64/96 字节格式。 - 用户、医生、任务、采样、检测结果、报警历史、阈值结果、项目参数、设备档案、计时器和算法结果的 SQLite 接口。 - 报告预览、Android 打印服务、CSV/JSON 导入导出。 - Pad 内置 PCR 4.1 原生算法:C++/MINPACK 完成曲线拟合和指标计算,ONNX Runtime Android 完成 RF/LSTM 推理,无需 Windows `pcr.exe` 或网络服务。 Android 平台明确不提供: - Windows 安装包更新和串口固件升级;Pad 软件使用独立 APK 在线更新。 - Electron 主进程日志上传;Pad 端需要独立日志采集格式后再接服务器接口。 - Windows CH340 串口设置;Pad 当前通过局域网 TCP 与仪器通信,因此界面不显示串口设置入口。 未支持的 Android API 会返回明确错误,不再伪造空结果或成功状态。 ## Pad 软件在线更新 Pad 启动后默认检查以下地址: ```text 普通版:http://onechip-mini7.com/mini7-one-mobile/standard/latest.json OEM 版:http://onechip-mini7.com/mini7-one-mobile/oem/latest.json ``` 生成普通版或 OEM 版更新文件: ```powershell cd mobile-app npm run prepare:update npm run prepare:update:oem ``` 生成结果位于: ```text mobile-app/dist/update/standard/ mobile-app/dist/update/oem/ ``` 每个目录都包含 `latest.json`、APK 和 SHA256 文件。将目录内的全部文件上传到服务器对应目录,不要只上传 APK。 Windows Nginx 示例: ```nginx location ^~ /mini7-one-mobile/ { alias D:/mini7/mini7-one-mobile/; autoindex off; add_header Cache-Control "no-cache" always; } ``` 服务器目录结构: ```text D:/mini7/mini7-one-mobile/ ├── standard/ │ ├── latest.json │ ├── Mini7-One-Pad-1.6.21.2-standard.apk │ └── Mini7-One-Pad-1.6.21.2-standard.apk.sha256 └── oem/ ├── latest.json ├── Mini7-One-Pad-1.6.21.2-oem.apk └── Mini7-One-Pad-1.6.21.2-oem.apk.sha256 ``` 发布新版本时必须同时递增 `android-capacitor/app/build.gradle` 中的 `versionCode`,并修改 `versionName` 及 `mobile-app/package.json` 的显示版本。例如 `1.6.21.2` 使用 `mobile-app/package.json` 的 `1.6.21-2`、`versionName "1.6.21.2"` 和大于旧版的 `versionCode 1062102`。新旧 APK 必须使用相同的 `applicationId` 和签名证书。首次安装更新时,Android 会要求用户允许 Mini7-One 安装未知应用。 当前构建脚本生成 debug 签名 APK,适合连接的测试 Pad。正式发布前应配置固定的 release keystore;已经安装 debug 版的 Pad 不能直接覆盖为另一证书签名的 release 版,需要先卸载 debug 版再安装正式版。 ## 第三方算法依赖 原生拟合使用 CMinpack(MINPACK 的 C/C++ 实现),其许可证随源码保存在 `android-capacitor/app/src/main/cpp/third_party/cminpack/CopyrightMINPACK.txt`。本产品包含由芝加哥大学作为阿贡国家实验室运营方开发的软件。