BLE(低功耗蓝牙),是蓝牙4.0规范的一部分,其区别于经典蓝牙BT,因两者工作的方式和协议已经完全不同,(当然物理层相同,均使用GFSK对数据进行调制发射),通常所说的双模蓝牙BT/BLE,即为同时支持BT和BLE。BLE的优势在于以更低的功耗进行通信,号称可使用纽扣电池工作数年,另一方面,SIG最新推出的BLE mesh则继续对ble大力加持,相信物联网领域将来必然有BLE的一席之地。当然,ble适合用来做小数据量的通信,因其物理层的带宽仅为1Mbps。

由于BLE工作在ISM 2.4G频段,而这个频段充斥着大量其他设备产生的电磁波信号,包括wifi,无线鼠标/键盘,各种无线遥控器等。各种2.4G频段内的信号势必会互相干扰而导致无法正常通信,BLE采用了跳频的技术来最大程度降低其他信号的干扰,每在一个频段完成一次通信之后,BLE会根据跳频算法计算出下一个频段进行通信,对于一般的点对点通信,双端都需要根据同样的跳频表计算出相同的频段并选择发送/监听。

BLE在2.4G频段中以2Mhz为间隔,定义了40个信道,如下图所示,其中37、38、39信道用于广播,即2402Mhz,2428Mhz,2480Mhz。从图中可以看出,广播信道特意避开了wifi的三个常用信道(wifi使用扩频技术传输数据,一个信道会占用较大的频段带宽)。

最简单的BLE通信为广播,设备会轮流在37,38,39信道发送广播帧,在广播信道监听的设备可以在监听窗口中收到广播帧并获取到设备的相关信息,进而可选择是否与此设备建立连接。

nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片,使用GFSK调制,由于功能丰富,价格也较为低廉,模块的价格大概在¥5左右,市场应用比较广泛。若增加PA和LNA,通信距离最远可达至1KM,通常使用在遥控器、无线灯控、无线数传等场景。

NRF24L01模块
另一种贴片形式的模块

由于蓝牙和nRF24L01均使用GFSK进行调制,实际上通过适当的软件配置,可将nRF24L01变为一个最廉价的蓝牙广播设备,通常称为beacon,以下是具体的技术细节。

BLE广播帧
nRF24L01数据帧

二者在格式上极为相似,以下是细节说明

  1. preamble为前导码,为01010101 或者 10101010,具体选择哪个根据access address的第一个bit而定,由硬件自动添加生成。
  2. access address为接入地址,即本数据帧的目标地址,对于BLE广播,固定为0x8E89BED6。
  3. header为蓝牙广播帧的头,用于指示本广播包的内容类型。
  4. length指示payload的长度。
  5. payload为实际的数据。
  6. 帧尾为CRC校验和,nRF24L01硬件会自动计算出CRC并附加在帧尾,然而蓝牙需要的是使用LFSR生成的24-bit CRC值,nRF24L01使用的则是多项式的CRC算法如下
nRF24L01的CRC算法

故需要禁止掉nRF24L01的硬件自动CRC算法,使用软件的方式生成蓝牙的3-bytes CRC。

理解以上的说明,构造ble广播帧就很简单了,代码见github,以下分别是使用arduino和stm32通过spi配置nRF24L01测试通过。

Arduino-uno测试
stm32测试,正好可以使用上一个项目留下的开发板

Android或者iphone均可在应用市场搜索nrf connect安装app进行测试,简单测试了一下,都可以发现这个ble广播设备。

Android 测试

github:https://github.com/wuxx/nrf24-ble

参考资料:

  1. http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery
  2. https://d.lij.uno/misc-nrf24-ble.html