9、树莓派 蓝牙

树莓派软件更新

依次执行如下命令:

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y

以上指令如不成功,在指令后添加--fix -mising

安装蓝牙

sudo apt-get install pi-bluetooth bluez bluez-firmware blueman

系统默认安装的是pi-bluetooth bluez bluezfirmware.
如果安装blueman,界面上会出现两个蓝牙程序,新出现的是用来辅助蓝牙操作的。

添加pi用户到蓝牙组

sudo usermod -G bluetooth -a pi,重启sudo reboot

卸载蓝牙

sudo apt autoremove bluez bluez-firmware blueman

和串口通讯会出现冲突

详见串口开发,因为更改了树莓派硬件上的串口映射关系。

Bluez

首先要在树莓派上安装必要的工具。BlueZ是Linux官方的蓝牙协议栈。你可以通过BlueZ提供的接口,进行丰富的蓝牙操作。Raspbian中已经安装了BlueZ。我使用的版本是5.43.
bluetoothd -v

用下面的命令检查BlueZ的运行状态:
systemctl status bluetooth
结果:

● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled)
   Active: active (running) since Sun 2017-04-23 19:03:08 CST; 1 day 6h ago
     Docs: man:bluetoothd(8)
 Main PID: 709 (bluetoothd)
   Status: "Running"
   CGroup: /system.slice/bluetooth.service
           └─709 /usr/lib/bluetooth/bluetoothd -C

用下面命令手动启动或关闭蓝牙服务:

sudo systemctl start bluetooth
sudo systemctl stop bluetooth

让蓝牙服务随系统启动:
sudo systemctl enable bluetooth

树莓派上的蓝牙

Raspbian中:

  1. 基本的蓝牙操作可以通过bluez中的bluetoothctl命令进行。
  2. 该命令运行后,将进入到一个新的Shell。在这个shell中输入:list
    将显示树莓派上可用的蓝牙模块:
    Controller B8:27:EB:72:47:5E raspberrypi [default].
  3. 运行scan命令,开启扫描:
    scan on
  4. 扫描启动后,用devices命令,可以打印扫描到蓝牙设备的MAC地址和名称,例如:
    Device 00:9E:C8:62:AF:55 MiBOX3
    Device 4D:CE:7A:1D:B8:6A vamei
    
  5. 此外,你还可以用help命令获得帮助。
  6. 使用结束后,你可以用exit命令推出bluetoothctl

除了bluetoothctl,在Raspbianshell中可以通过hciconfig来控制蓝牙模块。比如开关蓝牙模块:

sudo hciconfig hci0 up   #启动hci设备
sudo hciconfig hci0 down #关闭hci设备

命令中的hci0指的是0号HCI设备,即树莓派的蓝牙适配器。

与此同时,你可以用下面命令来查看蓝牙设备的工作日志: hcidump
bluez本身还提供了连接和读写工具。但不同版本的bluez相关功能的差异比较大,而且使用起来不太方便,所以我下面使用Node.js的工具来实现相关功能。

树莓派作为BLE外设

把一个树莓派改造成BLE外设,同时它也将充当连接建立后的服务器。这个过程较为复杂。可以借用Node.js下的bleno库。

  1. 安装Node.js
curl -sL https://deb.nodesource.com/setup_5.x | sudo bash -
sudo apt-get install nodejs

第一行的命令是为了确保安装高版本的Node.js

  1. 安装bleno:
mkdir ble-test-peripheral
cd ble-test-peripheral
npm install bleno
  1. 运行pizza的例子
    sudo node node_modules/bleno/examples/pizza/peripheral
    可以在node_modules/bleno/examples/pizza/看到源代码,或者到github查看。这个例子提供了一个Service,它的UUID是1333-3333-3333-3333-3333-333333333337。Service中包含了三个Characteristics,分别是用于披萨饼参数、配料参数和烤披萨。
树莓派作为BLE中心设备

用另一个作为BLE的中心设备进行扫描,并发起连接请求。连接建立后,该服务器将充当客户。和bleno对应,Node.js下有一个叫noble的项目,可以便捷地完成这一任务。首先,安装noble:

mkdir ble-test-central
cd ble-test-central
npm install noble

noble中有一个同样名为pizza的例子,不过这个例子实现的是客户端。运行该例子:

sudo node node_modules/noble/examples/pizza/peripheral
这个例子将自动执行扫描、连接、服务发现、数据传输的全过程。如果你把blenonoble部署到两个树莓派上,就可以在这两个树莓派之间进行蓝牙通信了。如果你想自定义开发,那么可以在node_modules/noble/examples/pizza/参考源代码,或者到github查看。

树莓派作为Beacon

苹果在BLE的基础上推出了iBeacon协议。iBeacon使用了BLE的广播部分,但不建立连接。一个遵守iBeacon协议的外设称为BeaconBeacon会广播自己的身份信息和发射信号的强度。中心设备接收到广播之后,除了可以获知Beacon的身份之外,还能通过信号的衰减算出自己与Beacon的距离。
在一个典型的超市应用场景中,每件商品可以带上一个Beacon。消费者可以用手机看到自己周围有哪些商品,工作人员也可以用手机来清点货物。商家还可以在服务器上提供商品相关的质保、促销等信息。用户可以根据Beacon的编号,获得这些附加信息。

我们把配备了蓝牙模块的树莓派改造成一个Beacon。既然Beacon只使用了蓝牙中的广播,那么应该关闭树莓派的扫描,打开广播,并且不接受蓝牙连接:

sudo hciconfig hci0 noscan    # 不再扫描
sudo hciconfig hci0 leadv 3   # 开始广播,并且不接受连接

下一步,把广播信息改为符合iBeacon协议的内容:
sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5 00 01 00 02 C5
上面的命令附加了一串16进制信息。其中0x08说明了整条信息是蓝牙命令,0x0008说明后面的内容将作为广播信息。

1E是广播信息开始的标志。按照蓝牙通信的规定,广播信息最多有31个字节。1E后面的广播信息分为两组:

02 01 1A

1A FF 4C 00 02 15 63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5 00 01 00 02 C5

每一组一开始的一个字节说明了该组信息的长度。02说明了2个字节,1A说明是26个字节。随后一个字节说明了改组信息的类型。
第一组的01说明了该组信息是蓝牙控制标志,第二组的FF说明了该组是蓝牙制造商相关信息。

我们来看第二组信息的细节:

  • 4C 00是制造商信息,即苹果。
  • 02 15iBeacon协议标识。
  • 63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5部分是设备的UUID,通常是用户编号。
  • UUID后面的00 01是主编号(Major)。
  • 再往后的00 02是次编号(Minor)。通过UUID、主编号、次编号的组合,我们可以唯一地确定iBeacon设备。
  • 最后的C5说明了蓝牙信号强度,即在1米处测得的该BeaconRSSI值。
  • 中心设备把接收到的信号强度和该信号强度对比,就可以知道信号衰减了多少,从而推算出自己与Beacon的距离。由于我这里写入的C5没有经过校准,所以距离测量很可能不准确。

使用结束后,可以用下面命令来恢复扫描和停止广播:

sudo hciconfig hci0 piscan   # 恢复扫描
sudo hciconfig hci0 noleadv  # 停止广播

参考原文

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
树莓派蓝牙图标不见了可能是由于蓝牙服务未启动或出现了问题造成的。你可以按照以下步骤尝试解决这个问题: 1. 首先,确保蓝牙服务已经启动。运行以下命令以启动蓝牙服务: ``` sudo systemctl start bluetooth ``` 2. 检查蓝牙服务的状态,以确认是否成功启动。运行以下命令查看蓝牙服务的状态: ``` systemctl status bluetooth ``` 如果看到类似于"Condition check resulted in Bluetooth service being skipped."的信息,说明蓝牙服务已被跳过。这可能是因为蓝牙硬件未连接或未正确设置。 3. 如果蓝牙服务已启动但图标仍然不可见,你可以尝试按照以下步骤重新安装和配置蓝牙: - 运行以下命令以更新包管理器: ``` sudo apt-get update ``` - 安装蓝牙相关软件包。运行以下命令以安装蓝牙服务和管理工具: ``` sudo apt-get install bluetooth sudo apt-get install blueman sudo apt-get install raspberrypi-sys-mods sudo apt-get install --reinstall pi-bluetooth ``` - 执行以下命令以重新连接蓝牙硬件: ``` sudo hciattach /dev/ttyAMA0 bcm43xx 921600 ``` - 将当前用户添加到蓝牙用户组。运行以下命令以将当前用户(用你自己的用户名替换"pi")添加到蓝牙用户组中: ``` sudo usermod -G bluetooth -a pi ``` 以上是解决树莓派蓝牙图标不见的一些可能方法。如果问题仍然存在,你可以尝试重新安装树莓派系统或寻求更深入的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值