首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
微信小程序BLE开发踩坑记02|系统蓝牙可见却搜不到?
📅 2026/10/21 21:04:10
✍️ 爱科研究院
👁 阅读 3,247
背景上一篇刚把安卓搜不到设备那事摆平我还挺得意以为扫描这块算是摸清了。结果一接血压计又懵了同一台手机、同一套扫描代码血氧仪一搜就出来血压计扫半天页面干干净净。更邪门的是这台血压计在手机自带的蓝牙设置里明明看得到点配对也没问题。先说结论不是所有 BLE 设备都会在广播里带名字。我那台血压计的广播包里压根没有设备名字段而我的扫描层写了一句名字为空就丢弃——于是它被我自己筛掉了。一句话记住扫描层的活儿是上报设备认不认得出目标是识别层的事。现象血氧仪扫描页 1~2 秒就列出来了。血压计页面毫无反应等再久也不出来。手机系统蓝牙里这台血压计可见、可配对。两条信息又打架了。不过这回我没慌——上次刚学会对照实验直接套用。排查先看日志。把设备发现回调里的原始数据整条打出来name、localName、advertisData全打。可一开始什么都印不出来。我反应过来是我那句丢弃执行在打印之前设备根本没机会出现在日志里。于是我把丢弃那行先注释掉、只留打印才第一次看到这台设备的广播原貌——name: 、localName: 但advertisData里带着一串非空数据。再用 BLE 调试 App比如 nRF Connect 这类连上它看原始广播确认它广播的只有 Flags、服务 UUID、制造商数据三块没有设备名字段。回头翻协议文档广播包格式那节也对上了——它就是设计成这样。根因BLE 扫描时周围会扫到一堆没名字的杂散设备邻居的耳机、手环、电视。所以很多示例代码里都有一句没名字的丢掉我的扫描层也照抄了// 【踩坑写法】扫描层里名字为空就丢弃if(!device.name!device.localName)return;// 血压计天生无名 → 直接被筛掉所有 BLE 设备都有广播名这个前提本身就不成立。血氧仪的广播里带名字所以一直正常血压计天生无名于是全灭。代码一个字没改变量是设备。解决扫描层只上报识别交给上层扫描层不再做任何认设备的判断来者一律上报是不是目标设备交给设备识别模块综合判断型号码 名字关键词 服务 UUID 一起看// 【修复】扫描层不做识别无名设备也一律上报wx.onBluetoothDeviceFound(function(res){res.devices.forEach(function(device){// 不再按 name 是否为空丢弃直接交给上层识别reportToDeviceManager(device);});});顺带在扫描层开了一条广播 hex 诊断日志无名设备从此有据可查// 把广播原始数据打成 hex形如 AA 4C 41 ...无名设备也能排查if(device.advertisData){console.log([扫描] 无名设备广播:,hexDump(device.advertisData),device.deviceId);}hexDump就是把ArrayBuffer逐字节转成大写十六进制字符串调 BLE 这活儿离不了它。改完把手机拿来再跑一遍血压计和血氧仪都稳稳地出来了。预防 / 复盘要点对接新硬件前先抓一遍它的原始广播包拿工具看一眼别用别的设备都这样去假设它。扫描层负责上报识别层负责过滤。过滤逻辑要放在掌握完整判据名字 / 型号码 / 服务 UUID的那一层扫描层越单纯越好。出现别的设备都正常唯独这台不正常先怀疑这台设备的广播格式特殊而不是扫描代码有 bug。常见问题Q1蓝牙设备在系统设置里能看到小程序就是搜不到一般是什么原因最常见两类一是本文这种设备广播里没有名字字段被无名即丢弃的过滤逻辑筛掉了二是安卓定位权限没给全扫描根本起不来。区分方法很简单——把扫描回调的原始日志打开看有没有这台设备的记录。有记录 被自己筛了没记录 扫描压根没起来。Q2怎么知道我的设备广播里到底有没有名字用 BLE 调试 App 看一眼原始广播最快没有的话就在小程序里把advertisData打成 hex 打出来看。别猜看一眼就有答案。Q3无名设备该怎么确认它是我要连的那台看广播里的其他东西——制造商数据、服务 UUID、广播内容的特征都能当判据。我后面会专门写一篇名字没有、型号也不对时怎么认出设备。最后扫描层和识别层这层分工我后来整理成了那套开源 BLE SDK 的一部分——设备发现一律上报认不认得出来交给识别模块接入方不用自己写过滤逻辑Giteehttps://gitee.com/wanrendi75/jingjin-ble-sdk这个连载我才写到第二篇踩的坑一个比一个刁钻后面接着记。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/21 20:59:10
设计细节打磨讨论稿
2026/10/21 20:59:10
数据结构:双向链表,队列,栈,树形结构,哈希表
2026/10/21 20:59:10
大数据分析与应用——“兼容 Oracle“这四个字,快成国产数据库最大的文字游戏了
2026/10/21 22:05:06
轻量级地理语义映射框架:边缘设备上的离线空间指令解析
2026/10/21 22:05:06
轻量级实时事件分析器:Go语言边缘设备实践
2026/10/21 22:05:06
RK3588平台MIPI摄像头驱动实战:从OV13855到设备树调试全解析
2026/10/21 22:05:06
Kafka集群运维:从命令执行到系统性状态管理
2026/10/21 22:05:06
Kubernetes Pod 完全解读:从 YAML 到探针、资源与调度
2026/10/21 21:54:33
从零手写最小LLM Agent:模型、工具、记忆与循环实战指南
2026/10/21 0:01:44
ClickHouse实战:从列式存储到亿级数据秒级查询
2026/10/21 0:01:44
高效筛选arXiv机器学习论文:四步法实战指南
2026/10/21 0:01:44
Python爬取百度迁徙数据:接口签名、反爬与SQLite存储实战
2026/10/21 19:05:16
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/21 14:47:26
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/21 19:05:04
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/20 2:24:03
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/20 2:23:57
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/21 19:01:08
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)