背景介绍
最近在IoT蓝牙开发,项目内容大概是以树莓派作为网关,通过蓝牙控制设备。然而,因为开发使用的是树莓派3,性能非常有限,使用VSCode远程连接,并且开启Jupyter Notebook进行开发、测试经常会出现断联和死机,因此考虑需要在另外的机器先开发好,再进行移植到树莓派上。
然而,在Window上的蓝牙BLE完全是不一样的世界,并没有现成的GATTTool和hcitool使用,macOS情况也类似。虽然可以在Window下使用C#实现BLE连接以及macOS也有相应的库,但是这样又离项目原本的目标遥远了(完成后不能移植,树莓派上是基于linux及gatttool和hcitool基础的程序)。
同样的,我尝试了在开发机上安装Ubuntu,然后进行开发,这样是可行的。在Linux系统下,无论是x86还是arm,都支持gatttool和hcitool,所以在x86下完成的代码移植到树莓派上还是比较方便的。到这里,我突然想到,如果能把插在开发机上的USB蓝牙适配器转移到服务器上,然后在服务器上创建一个虚拟机,把USB蓝牙适配器直通给虚拟机,在虚拟机上进行开发,这样就更加方便了,无论使用原来的Window开发及还是macOS,都可以无缝连接。
PVE配置蓝牙直通
这里,以服务器安装好PVE系统,并且以USB蓝牙适配器CSR8510 A10为例介绍如何配置。
首先,我们需要进入PVE系统的,然后使用 qm
命令:
qm monitor 101 # 101 为VM id
接下来会进入qm
交互模式,然后我们使用 info usbhost
查看当前连接的蓝牙设备:
qm > info usbhost
Bus 5, Addr 2, Port 2, Speed 12 Mb/s
Class 00: USB device 0624:0248, USB Composite Device-0
Bus 1, Addr 5, Port 3.1, Speed 12 Mb/s
Class e0: USB device 0a12:0001, CSR8510 A10
可以看到,我们的蓝牙USB适配器在BUS 1,Port 3.1,这里我们需要记住这个位置,如我这里的位置,在配置中将写为 host=1-3.1
接下来,我们就修改配置文件,配置文件的位置在 /etc/pve/qemu-server/<VM_ID>.conf
其中 <VM_ID> 为虚拟机的编号
# 备份
cp /etc/pve/qemu-server/101.conf /etc/pve/qemu-server/101.conf_bak
vim /etc/pve/qemu-server/101.conf
在配置文件的最后添加一行:
usb0: host=1-3.1
完成后保存文件,接下来需要先关闭(重启未必成功,最后先关闭再启动)虚拟机,如果成功,我们就可以在pve管理界面上看到我们的usb设备:
完成后,我们可以进入系统安装蓝牙驱动:
sudo apt install bluetooth
安装完成后,重启虚拟机,可以使用 hciconfig
查看蓝牙是否可以成功杯识别:
hciconfig -a
hci0: Type: Primary Bus: USB
BD Address: xx:xx:xx:xx:xx:xx ACL MTU: 310:10 SCO MTU: 64:8
UP RUNNING
RX bytes:1641 acl:3 sco:0 events:88 errors:0
TX bytes:2890 acl:2 sco:0 commands:82 errors:0
Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'vm-dev'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.0 (0x6) Revision: 0x22bb
LMP Version: 4.0 (0x6) Subversion: 0x22bb
Manufacturer: Cambridge Silicon Radio (10)
到这里,我们就已经完成好PVE蓝牙的直通配置了。