SmartAssiter-Discard/docs/修改记录_2026-09-03_迁移uni-app-vue3与蓝牙去插件.md
evan.liu 07509a2387 迁移uni-app x到uni-app vue3,蓝牙去第三方插件改uni内置BLE API
- uni-app x官方无内置蓝牙API(文档明确见插件市场),为实现去插件化,工程整体迁移为uni-app vue3(vue/ts),App端内置完整BLE API,标准基座即可运行
- 新建src/BluetoothManager.ts:基于uni内置BLE API(createBLEConnection/notifyBLECharacteristicValueChange/writeBLECharacteristicValue(writeNoResponse)/setBLEMTU/getBLEDeviceRSSI等),保持原插件type约定,页面业务逻辑不变
- 删除uni_modules/android-ble及未使用的lime-*、uni-wifi;保留uni-icons、uni-scss
- uts模块全部移植为ts(src/mcm、api、common):UTSJSONObject改Record<string,any>,适配vue3 getStorageSync空值返回空串的差异
- 7个页面uvue转vue:模板不变,显式import ref与生命周期钩子;OTA固件读取由java.io改为plus.io+uni.base64ToArrayBuffer
- manifest.json去uni-app-x改app-plus结构,补Android 12+蓝牙权限;删除platformConfig.json;运行改用标准基座
2026-09-04 06:02:29 +08:00

4.0 KiB
Raw Permalink Blame History

修改记录 2026-09-03:迁移 uni-app vue3,蓝牙去第三方插件改 uni 内置 API

背景

  • 原工程为 uni-app x(uvue/uts),蓝牙依赖第三方插件 uni_modules/android-ble。
  • 先尝试过"uni-app x 下去插件改 uni 内置 BLE API":不可行——uni-app x 官方未内置 蓝牙 API(官方文档明确"蓝牙:见插件市场"),全量编译确认 createBLEConnection 等接口在 app-android 平台不存在。
  • 因对渲染性能要求不高,改为整体迁移到 uni-app vue3(vue/ts): vue3 App 端内置完整 BLE API,蓝牙彻底去插件化;且标准基座即可运行,无需自定义基座。

工程骨架

  • main.uts → main.js;App.uvue → App.vue(onLastPageBackPress 中 uni.exit() 改 plus.runtime.quit();globalData 保留 setBleNotity/ConnectBle, 改走新 src/BluetoothManager.ts,流程不变:connect → scanServices → 订阅 notify)。
  • manifest.json:删除 "uni-app-x": {};app-android/app-ios 合并为 vue3 的 app-plus 结构;Android permissions 补 BLUETOOTH/BLUETOOTH_ADMIN/ BLUETOOTH_SCAN(neverForLocation)/BLUETOOTH_CONNECT;iOS 蓝牙隐私描述并入 app-plus.distribute.ios.privacyDescription。
  • pages.json 内容不变(globalStyle 标题改为 smartAssister)。
  • 删除 platformConfig.json(uni-app x 专用)。
  • uni_modules:删除 android-ble、lime-*(8 个,页面未使用且为 uts 组件)、 uni-wifi(未使用);保留 uni-icons(自带 vue 版本组件)、uni-scss。

蓝牙:src/BluetoothManager.ts(替代插件)

  • 基于 uni 内置 BLE API:openBluetoothAdapter / startBluetoothDevicesDiscovery / createBLEConnection / getBLEDeviceServices / getBLEDeviceCharacteristics / notifyBLECharacteristicValueChange / writeBLECharacteristicValue / setBLEMTU / getBLEDeviceRSSI / closeBLEConnection。
  • 保持原插件的对外约定:MyApiResult.type==0 成功;1000=订阅成功 1001=订阅失败; 10000=连接失败 10001=已断开 10002=蓝牙未开 10003=无权限; notify 数据包装为 {type:0, data:{data:number[], mac}} 经 uni.$emit("bleData") 分发; 意外断开经 uni.$emit("bleState", 10001) 广播(主动断开不广播)。
  • sendDataBytes 用 writeType:"writeNoResponse"(下行特征仅支持无响应写)。
  • 自动重连未实现(业务恒传 false),setBtAutoConnectTime/cancelAutoConnectBt 为空实现。

uts → ts 移植

  • src/commonFunctions、src/mcm/*(Crc/FrameCodec/McmChannel/McmCommands/McmInfo/ OtaManager)、api/*、common/*:机械移植,去 .uts import 后缀; UTSJSONObject → Record<string, any>(httpInstance 统一定义 JSONObject)。
  • vue3 的 uni.getStorageSync 无 key 返回 "" 而非 null:common/auth.ts、 common/bleInfo.ts 统一经 getStorageStr() 读取(空串转 null)。

页面 .uvue → .vue(7 个)

  • template 不动;script setup lang="ts";显式 import { ref } from 'vue'、 生命周期钩子 import { onLoad, onShow, ... } from '@dcloudio/uni-app'。
  • pages/tabbar/ota.vue 固件读取由 java.io 改为 plus.io(FileReader.readAsDataURL → base64 → uni.base64ToArrayBuffer → number[]),#ifdef APP-PLUS 包裹。
  • getApp().globalData.ConnectBle 调用处加 as any 断言。

验证与注意事项

  • HBuilderX CLI launch app-android --compile true 编译通过(编译器识别为 vue3 工程)。
  • 运行用标准基座即可(vue3 基座内置 BLE);原自定义基座配置不再适用。
  • 真机回归重点:扫描/连接/notify/MTU 247、home 轮询与设备信息、CLI 收发与 rssi、 OTA 全流程(高频无响应写,丢包风险最高)。
  • OTA 固件路径 /sdcard/Download/embeddedSrc.bin 在 Android 11+ 分区存储下可能读不到 (与原 java.io 行为一致,未劣化);如不可用,改用应用私有目录或加文件选择器。