欢乐熊大话蓝牙知识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),方式有两种:
-
被动扫描(Passive Scanning):
安静听广播,啥也不说。适合省电或不打扰别人。 -
主动扫描(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:你该选哪个做项目?》