树莓派上使用低功耗蓝牙 ble功能

1、树莓派蓝牙简介

树莓派继承了蓝牙、wifi和网卡,不同树莓派的芯片类型

型号 蓝牙芯片 蓝牙版本
Raspberry Pi 3 Model A+ Broadcom BCM43438 4.1
Raspberry Pi 3 Model B Broadcom BCM43438 4.1
Raspberry Pi Model 3B+ Cypress CYW43455 4.2
Raspberry Pi 4 Model B Cypress CYW43455 5.0

树莓派4b集成了wifi和蓝牙芯片,蓝牙支持低功耗模式。树莓派采用linux系统,并使用BlueZ Bluetooth stack,但BlueZ Bluetooth stack对ble支持不够稳定,还需要更多的测试。蓝牙5在树莓派上不支持long range模式。long range模式一般没法支持wifi和蓝牙集成的芯片。

从Broadcom和现在的Cypress的角度来看,Pi从射频性能和功能角度来看具有相当不错的芯片组。 一些设备支持5GHz Wi-Fi频段,可减少BLE使用的2.4GHz频段上的干扰。 由于该系统是单芯片解决方案,因此还支持共存以减少干扰。Raspberry Pi的最大问题是天线相对较小。 该天线在某种程度上被GPIO连接器的引脚连接器围绕。 尽管RPI基础并未提供详细的天线辐射信息,但这两者都对性能产生了一些影响。

由于以下几个原因,无法在树莓派上更改天线:
•没有物理连接器,这意味着需要焊接天线或连接器
•Raspberry Pi的认证未声明外部天线。 董事会的任何修改都会使FCC和相关认证无效。
最终,Raspberry Pi设备的Bluetooth LE系列是不错的,但却是有限的,并且它无法满足使用外部天线和更复杂的系统所能提供的功能。 如果您希望在一两个房间以外的任何合理距离内控制设备,最好添加另一个无线电或找到另一个解决方案。
综上所述,它可以为设备的室内控制提供良好的解决方案。 现在,让我们开始使用Raspberry Pi控制某些设备。

树莓派安装见另外一篇文章:https://blog.csdn.net/qingfengxd1/article/details/105071360

2、Bluez安装

现在我们的Raspberry Pi已经准备好了,是时候使用BlueZ了。正如我们之前提到的,BlueZ是开源蓝牙堆栈。 Raspberry Pi基金会已经负责对Wi-Fi /蓝牙芯片组进行低级配置。如果这是一个自定义的硬件平台(就像我们过去使用的那样),则需要正确配置所有内容。

Wi-Fi和蓝牙芯片组(以及组合变体)在ROM中具有固件。 ROM固件需要使用更新和修复程序进行修补。当加载了Bluetooth / Wi-Fi驱动程序并且RPI基础已经准备好了这些补丁程序和更新时,这些补丁程序和更新程序就会被加载。我们提到它是因为在某些情况下更新它很重要。在这种情况下,我们无需执行任何操作,因为默认值已足够。

Raspbian已经带有可以下载的蓝牙程序包,但是我们将自己安装BlueZ。重要的是您可以安装并更新到最新版本,并在需要自定义功能的情况下自定义内部版本。为此,我们需要下载BlueZ发行版并安装依赖项。下载BlueZ源代码,如下所示。请注意,我们使用的是BlueZ 5.50,它是当前最新版本。

cd ~
wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.50.tar.xz
tar xvf bluez-5.50.tar.xz

上面的命令下载了BlueZ源并将其解压缩,在这种情况下,我们将使用BlueZ 5.50。 我们将在Raspberry Pi本身上编译BlueZ,因为它足够强大,并且因为建立交叉编译系统需要更多的工作且不必要。 要在RPI上进行编译,我们需要如下安装依赖项:

sudo apt-get update
sudo apt-get install -y libusb-dev libreadline-dev libglib2.0-dev libudev-dev libdbus-1-dev libical-dev 
cd bluez-5.50
.configure --enable-library
make -j4
sudo make install
pi@raspberrypi:~/bluez-5.50 $ btmon -v
5.50

BlueZ 基本命令

hciconfig:配置到无线电的HCI接口

hcitool:hci工具

gatttool:连接设备、控制GATT

pi@raspberrypi:~/bluez-5.50/tools $ hciconfig
hci0: Type: Primary Bus: UART
    BD Address: B8:27:EB:AF:2C:B0 ACL MTU: 1021:8 SCO MTU: 64:1
    UP RUNNING
    RX bytes:766 acl:0 sco:0 events:49 errors:0
    TX bytes:2504 acl:0 sco:0 commands:49 errors:0

蓝牙功能是由BT适配器通过接口提供的,并且hciconfig实用程序现在告诉我们接口是hci0。 我们将使用该界面。

要循环有时可能需要的接口,我们可以先关闭接口,然后再打开。

如果界面无法正常运行,您可能需要使用上面的重置

为了连接到BLE设备,我们需要扫描,其中一种方法是使用hcitool实用程序:

pi@raspberrypi:~/bluez-5.50/tools $ sudo hcitool -i hci0 lescan 
LE Scan ...
4F:2A:A8:AD:7E:0B (unknown)
4F:2A:A8:AD:7E:0B (unknown)
DB:F8:F9:65:59:15 SCLE-01
DB:F8:F9:65:59:15 (unknown)
78:5D:71:CE:AF:E0 (unknown)
7D:FC:BE:D1:39:F6 FitBit
7D:FC:BE:D1:39:F6 (unknown)
F5:ED:4B:A5:08:72 (unknown)
F5:ED:4B:A5:08:72 (unknown)
DF:F7:7B:74:4D:76 (unknown)
E8:3D:EF:7A:30:FD SCLE-01
E8:3D:EF:7A:30:FD (unknown)

在上面,我们将hci0称为hcitool进行扫描,并请求进行LE扫描。 这将查找附近的所有设备并提供MAC地址。

现在我们有了BLE设备的地址,让我们连接它们。 为此,我们将使用gatttool实用程序,因为我们还将操纵BLE设备的GATT。 hcitool基本上是所有HCI命令(经典蓝牙和BLE)的“瑞士刀”,但它本身不会操纵GATT工具。

gatttool可以以两种模式运行:交互和非交互。 在交互模式下,控制台提供了一个界面,使您可以发出命令并与设备进行交互。 您将需要退出以返回到终端。

执行命令时,重要的是避免让命令自行终止。 使用CTRL + C停止命令可能会导致hci接口处于未知状态。 在这种情况下,关闭接口然后再打开将有帮助

sudo gatttool -i hci0 -b DB:F8:F9:65:59:15 -I -t random

上面的代码是标准的,但是必须注意-t参数的使用,该参数指定设备使用的地址是随机的还是公共的。 公共地址是使用分配的IEEE MAC地址的地址。 随机是在大多数情况下BLE设备中随机分配MAC的地址。

如果您在连接设备时遇到问题,请根据需要使用public或random连接

读写特征

最重要的任务之一是读取和写入特征。 使用交互式gatttool

[DB:F8:F9:65:59:15][LE]> char-read-uuid f000aa11-0451-4000-b000-000000000000
handle: 0x0030 value: 00 00 00

dwad

[DB:F8:F9:65:59:15][LE]> char-write-cmd 34 07
[DB:F8:F9:65:59:15][LE]> char-read-hnd 30
handle: 0x0030 value: 00 f0 02 

从BLE设备获取通知是另一种以低功耗方式从BLE设备获取数据的机制。 当设备具有要发送的新信息(例如新数据或警报)时,可以发送通知。

要启用通知,我们需要使用正确的标志写入CCCD(客户端配置特征描述符)

[DB:F8:F9:65:59:15][LE]> char-write-cmd 34 07 

PS:有定制开发、答疑需求,可以QQ联系:2472853871

发布了96 篇原创文章 · 获赞 66 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qingfengxd1/article/details/105142193