最近公寓门禁系统换了,现在只要站在大门附近在APP里点一下就能解锁门禁。软件也提示了需要开启蓝牙,所以不用猜也知道是蓝牙实现得,并且没有配对过程,所以一定是蓝牙有某种广播/握手协议可以在不配对的情况下完成数据交换。 其实早在4年前,我落地新加坡安装新加坡版“健康码” Trace Together时,它也是要求手机一直开着蓝牙,从而在“擦肩”过得人某一天确诊以后,可以知道我是否接触过。
蓝牙的本质
蓝牙是什么,蓝牙实际是一种基于无线电波的数据传输方案,它运行在2.4GHz频段。这个也是WiFi,微波炉的频段,所以有时我们也会遇到设备信号干扰问题(比如蓝牙键盘点击卡顿?)。
电磁波概念
无线电波属于电磁波大家族,这个家族里还有微波,红外线,可见光,紫外线,X射线,伽马射线等。电磁波可以在真空中以光速飞行,唯一区别就是他们频率和波长不同。
这里有两个现成的公式:
c = $\lambda$ f ( 光速=波长 * 频率)
E = hf (光子能量 = 普朗克常数 * 频率)
从第一个公式可以知道波长和频率有反比关系,因此频率越高波长越短 vice versa。 而从第二个公式我们可以知道光子的能量和频率有直接关系。 所以我们可以得出结论:电磁波的频率直接决定了光子的能量,而能量的高低呈现出了不同的特性:频率越高能量越高穿透力越好,频率越低能量越低对障碍跨越能力越强。
频率
上面说了无线电波频段是2.4GHz,它在物理意义上属于高频,但在通信技术中属于中低频。2.4GHz在传播能力和穿透能力之间达到了较好的平衡。所以蓝牙选择使用这个频率来传输数据 所以要认清的一点是,是蓝牙选择在这个频段下传输和接收数据,而不是这个频段是专门给蓝牙分配的。
收发设备
涉及信号收发那么一定需要一个相应硬件,这里它叫蓝牙射频收发芯片(Bluetooth RF Transceiver),在我们手机中这个通常被封装在一个三合一芯片中(Bluetooth & WiFi & FM),而这个三合一芯片又封装在SoC中。同理在PC上由网卡提供WiFi和蓝牙支持。另外因为手机蜂窝网络和蓝牙的工作频段不同,所以要使用两根不同的天线。 尽管位于SoC中,但射频收发芯片实际相当于是一个独立的系统,对外暴露了有限的几种指令,由操作系统按需发送相关指令让它完成工作。
技术细节
频段&频谱
电磁波的频率可以从 0 直到无穷大,这个连续的频率范围就是电磁波谱/频谱。我们人为将频率分成了一块块的,这里一块就是一个频段(Band)。蓝牙使用的频谱范围是 2.400 GHz 到 2.4835 GHz,总宽度为 83.5 MHz,或者说2.4G频段。就是说,蓝牙传输的电波频率会始终在这个区间内。
信道
将频段进一步拆分后的单位(频率范围)就是信道。蓝牙根据不同版本,会将频谱分成了79或者40个信道。一个信道内的数据会被认为属于同一个类型,或者说,这个区间内频率稍高点低点都认为是同一序列的数据。
无线电频段分配由政府控制,我们在车上收听的广播电台需要先注册登记才能使用具体的频段。正因为是注册过的,所以这个频段被电台独占:它只需要一个信道就可以传输数据。
相比之下蓝牙使用的2.4G频段属于ISM(Industrial, Scientific, and Medical),是全世界范围内都无需申请授权的频段。正因为不是蓝牙独占,所以频段内可能任意时刻有其他信号出现(比如恶霸WiFi,它一个信道就有20~40MHz)。为了抵抗这种干扰,蓝牙在初期采用了一种叫 FHSS(频率跳变扩谱) 的技术来发送数据:发送者会以固定间隔切换信道,从而避免任何一个信道被长期占用的可能。简单理解就像马路上开车时一直来回变道。
蓝牙的发展
蓝牙技术最初由爱立信在1994发明,起初是作为一种“无线”数据传输方案设计的,目的是去掉电缆。 根据功能和特点它现在被分成了两个阶段:经典蓝牙和低功耗蓝牙。
经典蓝牙BR/EDR (v1 ~ v3)
v1
- 定义了蓝牙设备通信的拓扑结构,握手协议和传输协议等
v1.1
- 修复了 v1.0 中设备互连经常“打架”的 Bug,确立了 IEEE 802.15.1 标准。并引入了RSSI功能,从而可以感应信号强弱。
v1.2
- 引入AFH,在FHSS发现某个信道频繁阻塞时,就标记该信道拥堵,后面直接跳过
- 引入eSCO,专门为语音通话增加了重传机制,避免丢包导致的音频失常
v2.0
- 核心改动是修改信号调制方式,提高了传输效率3倍
v3.0
- 拧巴的版本,尝试作为WiFi近场传输的前置握手代理,企图霸占WiFi频段
低功耗蓝牙BLE (v4)BLE
并不是经典蓝牙的升级版,它其实是一套全新的协议架构 将信道数量从79改为了40,并且广播信道变成只有3个(37, 38, 39) 原来为了高质量传输,射频信号需要持续工作,现在变成只有数据需要发送时才启动,有点像事件驱动与盲目轮询的区别
- 精简协议栈
- 降低依赖硬件的规格要求
- v4中引入了两个核心概念: Broadcaster和 Observer,提供更好的抽象接口,方便监听和发送广播,不像之前要系统面向连接去做处理。
v5
2016发布5.0,广播容量提升,由31字节增加到255字节。
结语
Android中BluetoothManager提供了专用的API可以发送,这里就不贴具体代码了。 简单考虑下门禁这个场景,猜测应该是App在启动或者进入解锁页面时从服务器获取了一个token,然后通过广播发送出去,门禁系统收到后发送给服务器校验,校验成功就给大门解锁。