我正在做一个项目,我需要使用C ++代码通过回调功能以无线方式在两个Raspberry Pi 3之间建立通信(RPi)。第一个应该发送数据到第二个。我决定使用板载蓝牙芯片在两者之间建立蓝牙连接。
因此,我首先决定在源代码均为5.50的两个RPi上编译Linux Bluetooth Stack:Bluez。遵循本教程:https://learn.adafruit.com/install-bluez-on-the-raspberry-pi/installation关于Adafruit。我设法使用以下代码从一个pi向另一个pi发送消息:https://people.csail.mit.edu/albert/bluez-intro/x502.html。但是要读取客户端发送的消息,我必须调用函数“ read(client,buf,sizeof(buf))”,这在服务器代码中有一定限制。我希望在收到消息时得到通知,以便可以调用回调函数。我看到可以通过启用用于通信的GATT特性的通知来完成此操作。
我从https://people.csail.mit.edu/albert/bluez-intro/x502.html获得的C ++代码中并未真正显示出该级别的规范。使用https://www.novelbits.io/bluetooth-gatt-services-characteristics/提高了我对GATT的了解后,我决定按照Tony D的youtube教程,了解如何使用Bluez APi https://www.youtube.com/watch?v=5fQR2PHMDWE。
为了简化操作,我决定留一个RPi并尝试连接使用蓝牙4.0的蓝牙音频耳机JBL T450BT,因此应该支持低功耗蓝牙。
在bluetoothctl上,这是问题所在,我设法打开控制器的电源,扫描并检测耳机。然后,我信任,配对并连接。在GATT菜单中,输入命令:list-attributes [dev address]。 Bluetoothctl不打印错误,但不返回任何内容,可以接收其他命令行。
sudo bluetoothctl
[bluetooth]# show
Controller XX:XX:XX:XX:XX:XX (public)
Name: VoitureRPi
Alias: VoitureRPi
Class: 0x004c0000
Powered: yes
Discoverable: no
Pairable: yes
UUID: Headset AG (00001112-0000-1000-8000-00805f9b34fb)
UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)
UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: Handsfree Audio Gateway (0000111f-0000-1000-8000-00805f9b34fb)
Modalias: usb:v1D6Bp0246d0532
Discovering: no
[bluetooth]# scan on
Device 78:44:05:BC:12:0C JBL T450BT
[bluetooth]# trust 78:44:05:BC:12:0C
[CHG] Device 78:44:05:BC:12:0C Trusted: yes
Changing 78:44:05:BC:12:0C trust succeeded
[bluetooth]# pair 78:44:05:BC:12:0C
Attempting to pair with 78:44:05:BC:12:0C
[CHG] Device 78:44:05:BC:12:0C Connected: yes
[CHG] Device 78:44:05:BC:12:0C UUIDs: 00001108-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: yes
[CHG] Device 78:44:05:BC:12:0C Paired: yes
Pairing successful
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: no
[CHG] Device 78:44:05:BC:12:0C Connected: no
[bluetooth]# connect 78:44:05:BC:12:0C
Attempting to connect to 78:44:05:BC:12:0C
[CHG] Device 78:44:05:BC:12:0C Connected: yes
Connection successful
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: yes
[JBL T450BT]# menu gatt
[JBL T450BT]# list-attributes 78:44:05:BC:12:0C
[JBL T450BT]#
从那里我没有从bluetoothctl得到任何答案,但是也没有错误,正如我告诉你的那样。我无法发现服务/特征。 我遵循的youtube tuto上被告知,GATT服务和“特性”发现是在配对/首次连接期间完成的。我认为Pi打算这样做,但失败了。这就是为什么我得到序列: 已连接:是,ServicesResolved:是已成功配对,然后已完成ServicesResolved:否,已连接否。不会显示:[NEW] XXX服务或特征。 我不认为问题出在耳机上,因为它在我连接的其他设备上执行相同的操作。我在RPi上同时安装了pulseaudio和bluealsa软件包。
如本教程中所述
这里的蓝牙状态:
systemctl status bluetooth
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-11-08 11:29:38 CET; 27min ago
Docs: man:bluetoothd(8)
Main PID: 2646 (bluetoothd)
Status: "Running"
CGroup: /system.slice/bluetooth.service
└─2646 /usr/local/libexec/bluetooth/bluetoothd --experimental
这是hciconfig提供的内容:
hciconfig -a
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:A8:0C:20 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:11205 acl:76 sco:0 events:520 errors:0
TX bytes:219869 acl:433 sco:0 commands:150 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'VoitureRPi'
Class: 0x4c0000
Service Classes: Rendering, Capturing, Telephony
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x168
LMP Version: 4.1 (0x7) Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)
这也是D-Bus自省工具返回的内容:
busctl tree org.bluez
└─/org
└─/org/bluez
└─/org/bluez/hci0
└─/org/bluez/hci0/dev_78_44_05_BC_12_0C
├─/org/bluez/hci0/dev_78_44_05_BC_12_0C/fd1
└─/org/bluez/hci0/dev_78_44_05_BC_12_0C/player0
对于那些在配对和连接方面遇到问题的人来说,此资源提供了巨大的帮助:https://www.sigmdel.ca/michel/ha/rpi/bluetooth_02_en.html
无论如何,这就是我的问题。我想访问特征及其UUID,以便能够修改其许可权或创建具有适合我的项目的具有其自身特征的新服务。 至此,我认为这是在蓝牙通信中实现带有回调的通知程序的唯一方法。也许我错了。你有什么线索吗? :)
答案 0 :(得分:1)
感谢A.Baur,“-experimental”选项是最后一个缺少的东西。
我的系统:Debian 10 + KDE
已安装:
-bluez- *
-蓝牙
-pulseaudio-module-bluetooth
步骤:
1.停止蓝牙服务:>sudo systemctl stop bluetooth
2.修改:/etc/init.d/bluetooth;通过添加以下行:
SSD_OPTIONS="**--experimental** --oknodo --quiet --exec $DAEMON -- $NOPLUGIN_OPTION"
3。启动蓝牙服务:>sudo systemctl start bluetooth
4.通过bluetoothctl
或其他GUI工具连接到Bose QC35 II。
答案 1 :(得分:0)
我用bluez-5.50的python广告和gatt服务器示例在RPi中使用它。我用nRF工具进行了测试。