当前位置: 首页 > java >正文

欢乐熊大话蓝牙知识16:蓝牙是怎么找设备的?扫描与广播的“对话内幕”

蓝牙是怎么找设备的?扫描与广播的“对话内幕”

📡「Hi,有人在吗?」
🔍「我听见你啦,这不是来了吗!」

这是 BLE 世界里,设备们每天都在上演的“对话”。今天,我们就来扒一扒这个过程背后的秘密 —— 蓝牙设备到底是怎么“找到彼此”的?


在这里插入图片描述

一、角色扮演:广播的设备 vs 扫描的设备

在 BLE 世界中,有两个主角:

  • 广播者(Broadcaster / Peripheral)
    “我不说话我难受,我得把我自己‘广播’出去,告诉别人我是谁,我干嘛的。”

  • 扫描者(Scanner / Central)
    “我啥都不说,我就在这‘听’。看看附近有没有值得我理的设备。”

简而言之:
广播设备就像在马路边举着牌子招呼:“我是 BLE 温度计,来连我吧!”
扫描设备就像路人甲在街上溜达,听听谁在喊:“哦?温度计?我正需要!”


二、广播包:一切信息的开端

蓝牙广播包就像是设备发出的简历,自我介绍里可能包含:

字段名用处
Flags支持哪些功能,是否可连接等
Local Name设备名称
Services UUID支持哪些 GATT 服务
Manufacturer Data自定义内容,可包含版本、MAC 地址等

一个设备可以以 Advertising Interval 的频率,不停地丢广播包(默认 100ms ~ 1s,越短越费电)。

// 设置广播包的例子(伪代码)
uint8_t adv_data[] = {0x02, 0x01, 0x06,             // Flags0x0A, 0x09, 'T','e','m','p','S','e','n','s','o','r', // Local Name0x03, 0x03, 0x09, 0x18        // UUID: Health Thermometer
};

在这里插入图片描述

三、扫描器:蓝牙界的“天线宝宝”

扫描设备会打开接收器监听广播通道(37、38、39),方式有两种:

  1. 被动扫描(Passive Scanning)
    安静听广播,啥也不说。适合省电或不打扰别人。

  2. 主动扫描(Active Scanning)
    听见后主动回一个“Scan Request”,广播者收到后再发一个“Scan Response”包,增加信息交互。

 广播者:我是 LED 灯泡,UUID 是 0x1820扫描者:Scan Request(嘿,还有更多信息吗?)广播者:Scan Response(我还支持OTA更新哦!)

四、广播通道是怎么安排的?

蓝牙有 40 个频道(0~39):

  • 广播专用通道:37、38、39
  • 数据通信用的:0~36

每发一次广播包,设备会换一个通道发,增加被发现的机会。

想象你在商场喊话,不只在电梯口,还在收银台和门口轮流喊,总有人会听到你!


五、从“被发现”到“连接”的下一步

扫描设备一旦发现符合条件的广播者(比如设备名匹配、UUID匹配等),就会发起连接请求,正式建立 BLE 通信链路。

// 主设备发起连接(伪代码)
connect_to_device(mac_address, conn_interval, slave_latency);

这之后,蓝牙就从广播阶段转入了“GATT 服务交互阶段”(那又是另一篇大戏了~)。


六、调试技巧 & Tips

问题排查方向
广播设备搜不到?检查广播间隔、发射功率、广播通道配置
扫描到设备但无法连接?可能广播包没开启 connectable 标志
扫描不到 scan response?看是否用了 passive scan
广播包内容不完整?BLE 广播包最大只有 31 字节,控制内容

七、总结:蓝牙设备如何找到彼此?

一句话总结:

一个喊,一个听,频道合适了,信息就传达到了。

BLE 广播与扫描是一套高效、省电的“相亲机制”,帮设备们快速认识、建立关系,而背后这一整套流程,是蓝牙通信的基石。


在这里插入图片描述

📎 延伸阅读推荐

  • 《GATT 协议全解:蓝牙传数据到底怎么传?》
  • 《BLE 是怎么省电的?核心机制全解析》
  • 《经典蓝牙 vs BLE:你该选哪个做项目?》

http://www.xdnf.cn/news/12643.html

相关文章:

  • Shell编程精髓:表达式与数组实战指南
  • DbServer链接KingBase8(人大)数据库
  • Android座舱系统Agent改造方案
  • day 47
  • 微前端架构下的B端页面设计:模块化与跨团队协作的终极方案
  • Python爬虫-爬取各省份各年份高考分数线数据,进行数据分析
  • 国产pcie switch,支持PCIE 3.0/4.0/5.0,支持昇腾310/910 GPU,支持龙芯、海光、飞腾
  • 小白成长之路-Linux Shell脚本练习
  • 2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
  • Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读(仅 Native R
  • 前端开发面试题总结-JavaScript篇(二)
  • .Net Framework 4/C# 泛型的使用、迭代器和分部类
  • 本地windows服务器部署私有云网盘Nextcloud并无公网IP实现外部访问
  • 多线程中的泛型应用深度解析:类型安全与并发编程的完美融合
  • Java方法引用深度解析:从匿名内部类到函数式编程的演进
  • 算法训练第十天
  • 分享5个免费5个在线工具网站:Docsmall、UIED Tool在线工具箱、草料二维码、图片在线压缩、表情符号
  • 【嵌入式设备】使用PICO7抓取CH341A读写EEPROM的IIC波形
  • 视频字幕质量评估的大规模细粒度基准
  • 使用cd4060倒计时控制继电器,防止摩托车漏电
  • day 27 装饰器函数
  • SQL进阶之旅 Day 20:锁与并发控制技巧
  • C#:发送一封带有附件的邮件
  • Android实现点击Notification通知栏,跳转指定activity页面
  • 华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手
  • MATLAB-电偶极子所产出的电磁场仿真
  • 黑马点评【基于redis实现共享session登录】
  • 六、Sqoop 导出
  • 自适应长度惩罚强化学习的高效推理
  • [学习]扩频码测距原理、实现与精度分析(仿真代码)