4.0 KiB
4.0 KiB
修改记录 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/*:机械移植,去.utsimport 后缀;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 行为一致,未劣化);如不可用,改用应用私有目录或加文件选择器。