基于 2026-04-27 体验版联调实战沉淀。每条都标注"现象 / 根因 / 解决",让下次同样问题 1 分钟解决。
现象:bleConnection
页面进入后一直显示"正在搜索附近的设备…",列表里啥都没有。vConsole 里
adapterState available:true discovering:true
但没有任何 [BLE scan] 或
[BLE raw found] 日志。
根因(按概率排):
解决:
⚠️ Veepoo 设计上不需要走 iOS 系统配对,全程靠 BLE 广播 + App 层连接。一旦系统配对就会卡死。
现象:扫到设备 → 点击 → loading 转圈不停 → 30 秒后 scan timer 弹"附近无设备"。
vConsole 看到 getBLEMTU:ok mtu:512 但
deviceChipStatus===>
永远没值,VPDevice ==> null。
根因:BLE 物理通道建立了(MTU 协商成功),但 Veepoo
SDK 的密钥核准链路断了,type=1
回调没到达,deviceChipStatus 没被 SDK 写入 → bleConnection
的 setInterval 永等。
解决(不是代码问题,是手表/系统状态):
代码位置:pages/bleConnection/index.ts
的 connectBle setInterval 段。
现象:小程序切后台再回前台,首页能看到「设备名称:S101」,但 MAC、固件版本、电池电量、实时步数四行全是空。
根因:app.ts onShow 调了
BleReconnectDeviceManager 让 BLE
物理通道恢复,但没调
veepooBlePasswordCheckManager()。Veepoo SDK
强制要求 "BLE 连接 → 密钥核准 → 才推 type=1 (含 VPDeviceMAC/版本)
等回调",bleConnection 首次连接走全了,onShow 漏一半。
解决:已在 v4+ 修复(commit
a218c17)。onShow 重连成功后 500ms 补调
veepooBlePasswordCheckManager,pullHistory 顺延到
2500ms。
代码位置:app.ts onShow 中的密钥核准 setTimeout。
现象:首页点「断开连接」→ 进设备扫描 → 列表空白。
根因:旧版 closeBluetoothAdapterManager
只调了 jieli SDK 断开 + 置 UI 灰,没真断 Veepoo BLE
通道。手表协议层认为还连着 → 不再广播 → 微信
onBluetoothDeviceFound 拿不到回调。
解决:已在 v4+ 修复(commit a218c17 +
35c5c43):
wx.closeBLEConnection 真断通道dataStorage deviceId 缓存现象:vConsole 红字
TypeError: null is not an object (evaluating 'wx.getStorageSync("bleInfo").deviceId')
,整个 onShow 抛异常 → 首页布局全崩。
根因:曾经的"主动断开后清
bleInfo=null"设计,但项目里 7
处代码(index/getConnectedBleDevice、otaNavite、dial、networkDial、ota、bleConnection
等)直接读 bleInfo.deviceId 没做 null 防御。
解决:已在 v4 修复(commit
35c5c43):
bleInfo,bleInfo 始终保留bleInfo 也是 null,必须保留 null 防御
if (bleInfo && bleInfo.deviceId)现象:手表上点开始测,数值正常出来,但
curl https://dc.ncrc.org.cn/api2/api/data
看不到新数据。
根因(按概率排):
universalBlood),SDK
默认不主动推(已在 v3+ 修复,bleHub 全局自动同步)解决:
代码位置:services/bleHub.ts
pullHistoryFromWatch()。
wearable_device 表里出现多行(dev_id
飘逸)现象:SELECT * FROM wearable_device WHERE device_sign LIKE 'S101_%'
返回多条记录,每条 device_sign 不一样(一条是 MAC,一条是
UUID)。
根因:
device_sign = "S101_${bleInfo.deviceId}"bleInfo.deviceId 是系统代理
UUID(如
7AD4A474-9CBD-...),每次重装小程序甚至每次重连都可能变FA:BA:94:8A:70:75)解决:已在 v3+ 修复(commit
a456775):
type=1 回调里的
VPDeviceMAC(手表真 MAC,跨平台一致)写到
bleInfo.macdataStorage.resolveDeviceId() 优先用
bleInfo.mac 当 sign,降级才用
bleInfo.deviceId清理脏数据:
# 找出该手表所有飘逸行
curl "https://dc.ncrc.org.cn/api2/api/device/by-sign?sign=S101_FA:BA:94:8A:70:75"
# 调 DELETE 清理(联动删 wearable_device + wearable_device_data)
curl -X DELETE https://dc.ncrc.org.cn/api2/api/device/<id>不会。每只手表的
device_sign = "S101_<真MAC>" 唯一映射
wearable_device 一行。多手机连同一手表(不同时)都命中同一
deviceId;多手机各连各的手表,每只手表唯一 deviceId。
需要患者绑定身份的场景,靠 patientId 字段(当前默认
1,等医生端集成时由六元 patients 表分配)。
[1/5] 备份现有 health_server.py现象:在 WSL 里跑
bash scripts/redeploy.sh 几分钟没动静,按 Ctrl+C
才能停。
根因:
mirrored 网络模式,也不继承第三方
SSL VPN 的 TUN 路由 —— 这是已知限制不是 bugping 192.168.4.104 在 WSL 不通、在 Windows
PowerShell 通解决:所有公司内网部署操作走 Windows PowerShell,不要在 WSL 里跑 SSH 到 192.168.4.x。
参考 Q11 部署模板。
cp: cannot create regular file ...: Not a directory现象:
wsl -e cp /home/qq/suifang/.../health_server.py "C:\Users\xxx\Temp\..."
# cp: cannot create regular file 'C:\...': Not a directory根因:WSL 里的 cp 不认识 Windows
反斜杠路径。
解决(两种):
A. WSL 里用 Linux 风格路径(Windows 盘符在 WSL 是
/mnt/c/):
wsl bash -c "cp /home/qq/suifang/.../health_server.py /mnt/c/Users/xxx/Temp/"B. PowerShell 通过 \\wsl$\ UNC 路径直接读 WSL
文件(推荐,无需 wsl 命令):
$distro = "Ubuntu" # wsl -l -q 第一行的名字
Copy-Item "\\wsl$\$distro\home\qq\suifang\WeChat_Mini_Program_Ble_SDK\scripts\health_server.py" $env:TEMP\$tmp = "$env:TEMP\suifang-deploy"
mkdir $tmp -Force | Out-Null
# 1. WSL 文件 → Windows 临时目录
$distro = (wsl -l -q | Select-Object -First 1).Trim()
Copy-Item "\\wsl$\$distro\home\qq\suifang\WeChat_Mini_Program_Ble_SDK\scripts\health_server.py" $tmp\
Copy-Item "\\wsl$\$distro\home\qq\suifang\WeChat_Mini_Program_Ble_SDK\scripts\suifang.service" $tmp\
# 2. scp 上传 + 重启服务(DPtech VPN 连着的状态下)
scp $tmp\health_server.py root@192.168.4.104:/opt/suifang/
scp $tmp\suifang.service root@192.168.4.104:/etc/systemd/system/
ssh root@192.168.4.104 "systemctl daemon-reload && systemctl restart suifang && sleep 1 && curl -s http://localhost:3000/"
# 3. 外网验证
curl https://dc.ncrc.org.cn/api2/api/status最后 curl 应返回
{"status":"running","mysql":"connected",...},且 endpoints
列表里包含 DELETE /api/device/:id。
stopBluetoothDevicesDiscovery:fail现象:模拟器里蓝牙相关 API 报错,红字一片。
根因:微信开发者工具明确告知蓝牙调试只支持 Mac,Windows/Linux 模拟器没有真蓝牙。
解决:忽略,所有 BLE 相关测试必须用真机:
最常见的认知误区。 链路有三段,git push 只完成第一段:
WSL 改代码 → git push → GitHub
↓ 还要做
微信开发者工具 编译 → 上传 → mp.weixin 选为体验版
↓
手机扫体验版二维码
判断手机上是不是新版:进首页 → 看右上角橙色角标
BUILD_TAG。
| 角标 | 含义 |
|---|---|
test-2026.04.27-v3 |
含 MAC 优先、自动同步 |
test-2026.04.27-v4 |
含 v3 + 重连密钥核准 + 真断 BLE + null 防御 |
test-2026.04.27-v5 |
含 v4 + 连接超时 10s 模态引导 |
每次有改动 push 后必做:
1. 改 services/env.ts 里的 BUILD_TAG(v5→v6 等)
2. 微信开发者工具 Ctrl+B 编译
3. 工具栏「上传」填新版本号(如 0.2.4)
4. mp.weixin.qq.com → 管理 → 版本管理 → 开发版本 → 找新版 → 选为体验版
5. 手机扫体验版二维码 → 看角标确认
取决于导入项目时的路径:
| 导入路径 | 同步情况 |
|---|---|
\\wsl$\Ubuntu\home\qq\suifang\... |
✅ 同步。WSL 改文件,开发者工具立刻看到(点编译刷新即可) |
C:\xxx\suifang\...(git clone 到 Windows 盘) |
❌ 不同步。WSL push 后 Windows 那边要 git pull |
推荐:从 \\wsl$\
导入更省事,不用维护两份。代价:编译稍慢(WSL FS IO)。
根因:扫码者的微信号没在体验成员列表。
解决:mp.weixin.qq.com → 成员管理 → 体验成员 → 添加微信号。每个小程序默认上限 90 个体验成员。
| 错误 | 修法 |
|---|---|
find module 'xxx' |
详情→项目设置 开 ✅ 使用 npm 模块;工具栏「工具→构建 npm」 |
| 上传体积超 2MB | 检查 dist / node_modules
没打进包;miniprogram 目录别引用 node_modules
里的东西 |
| AppID 报错 | 必须用注册了该 AppID 的微信号扫码登录开发者工具 |
# 服务存活 + MySQL 连接
curl https://dc.ncrc.org.cn/api2/api/status
# 列出所有设备数据
curl https://dc.ncrc.org.cn/api2/api/data | python3 -m json.tool
# 看现存 deviceId
curl -s https://dc.ncrc.org.cn/api2/api/data | python3 -c "
import json,sys
d=json.load(sys.stdin)
print('deviceId 列表:', sorted({r['deviceId'] for r in d.get('records',[])}))
"
# 按 sign 查设备元数据
curl "https://dc.ncrc.org.cn/api2/api/device/by-sign?sign=S101_FA:BA:94:8A:70:75"
# 删脏设备(含历史数据)
curl -X DELETE https://dc.ncrc.org.cn/api2/api/device/<id># Windows PowerShell(DPtech VPN 连着)
ssh root@192.168.4.104 "systemctl status suifang --no-pager | head -10"
ssh root@192.168.4.104 "journalctl -u suifang -n 50 --no-pager"| 关键字 | 含义 |
|---|---|
[BleHub] 全局事件中心已初始化 |
bleHub 启动成功 |
[BleHub] 捕获手表 MAC=... |
type=1 密钥核准成功,MAC 已写入 bleInfo |
[BleHub] 触发拉历史 day=0/1/2 |
拉手表本地缓存 3 天数据 |
[BleHub] 自动同步 type=18 -> bloodPressure |
血压自动 saveData |
[App.onShow] 自动重连=> {connection: true} |
后台返回前台自动重连成功 |
[DataStorage] HTTP同步xxx成功 (deviceId=N) |
数据上传到生产 MySQL 成功 |
[DataStorage] HTTP同步xxx失败入队待补传 |
上传失败,进 pending 队列下次补传 |
curl /api/data 看到新血压数据任意一条失败 → 看本 FAQ 对应章节。
最后更新:2026-04-27 v5 联调完成
当前生产服务端:192.168.4.104:3000 (六元)
→ MySQL 192.168.4.174 / h6dp_suifang 当前
GitHub:https://github.com/qqyjx/suifang
main 分支