Ubuntu 20.04编译安装BlueZ-5.6

Ubuntu 20.04编译安装BlueZ-5.6

BlueZ是Linux官方的蓝牙协议栈。可以通过BlueZ提供的接口,进行蓝牙相关的开发。

下载BlueZ

官网链接: http://www.bluez.org/download/.
github链接: https://github.com/bluez/bluez.

也可以使用wget下载,然后解压。

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

编译BlueZ

进入到bluez目录下,执行./configure文件

./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var

根据错误提示安装对应软件包

1.error: GLib >= 2.28 is required

sudo apt install libglib2.0-dev

2.error: D-Bus >= 1.6 is required

sudo apt install libdbus-1-dev

3.error: libudev >= 172 is required

sudo apt install libudev-dev

4.error: libical is required

sudo apt install libical-dev

5.error: readline header files are required

sudo apt install libreadline-dev

6.error: rst2man is required

sudo apt install python-docutils
sudo which rst2man

sudo apt-get install libdw-dev

./bootstrap: 5: libtoolize: not found

注意,每安装一次需要执行一下./configure文件

最后成功创建makefile就算成功了。

config.status: creating Makefile
config.status: creating src/bluetoothd.rst
config.status: creating lib/bluez.pc
config.status: creating mesh/bluetooth-meshd.rst
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands

编译和安装
然后执行make

sudo make
sudo make install

bluez工具使用

1 bluetoothctl

在编译BlueZ时,如果configure配置添加了“–enable-client”,就会编译生成Bluetoothctl工具。如果类比于WiFi,bluetoothd相当于wpa_supplicant,bluetoothctl相当于wpa_cli。

bluetoothctl内部集成了一个shell交互功能,直接在命令行运行bluetoothctl工具即可进入该工具的内部shell,输入help可以查看该工具支持的命令。

[bluetooth]# help
Menu main:

Available commands:
advertise                                         Advertise Options Submenu
scan                                              Scan Options Submenu
gatt                                              Generic Attribute Submenu
list                                              List available controllers
show [ctrl]                                       Controller information
select <ctrl>                                     Select default controller
devices                                           List available devices
paired-devices                                    List paired devices
system-alias <name>                               Set controller alias
reset-alias                                       Reset controller alias
power <on/off>                                    Set controller power
pairable <on/off>                                 Set controller pairable mode
discoverable <on/off>                             Set controller discoverable mode
discoverable-timeout [value]                      Set discoverable timeout
agent <on/off/capability>                         Enable/disable agent with given capability
default-agent                                     Set agent as the default one
advertise <on/off/type>                           Enable/disable advertising with given type
set-alias <alias>                                 Set device alias
scan <on/off>                                     Scan for devices
info [dev]                                        Device information
pair [dev]                                        Pair with device
trust [dev]                                       Trust device
untrust [dev]                                     Untrust device
block [dev]                                       Block device
unblock [dev]                                     Unblock device
remove <dev>                                      Remove device
connect <dev>                                     Connect device
disconnect [dev]                                  Disconnect device
menu <name>                                       Select submenu
version                                           Display version
quit                                              Quit program
exit                                              Quit program
help                                              Display help about this program
export                                            Print environment variables

以下列举了一些常用的命令:

power on:打开蓝牙总开关,同理power off就是关闭蓝牙总开关,下面的命令也是同理。
show:显示本地蓝牙适配器的信息。
discoverable on:设置经典蓝牙可被发现,开启后手机的蓝牙设置界面可以搜索到该蓝牙设备。
pair on:使能经典蓝牙的可配对。
system-alias:设置设备的蓝牙别名,即手机蓝牙设置界面扫描时看到的设备名。
agent NoInputNoOutput:设置配对能力级为无输入无输出,设置成该agent后经典蓝牙配对时设备无需输入配对码,手机上点击确定即可完成配对。
scan on:开启蓝牙扫描,如果设备支持双模蓝牙,那么会同时扫描经典蓝牙和低功耗蓝牙,扫描一段时间后可以通过scan off关闭扫描。
devices:列出当前可用列表,该列表包含了已配对的设备和刚扫描到的设备。
info:查看某一设备的具体信息。
connect:尝试连接设备。
disconnect:断开设备连接。
pair:发起配对。
advertise on:开启BLE广播。
remove:移除设备,如果是已配对的设备,绑定关系也会移除。
menu:进入子菜单,目前有advertise、scan、gatt三个子菜单,分别用于设置BLE广播信息、扫描过滤、GATT设置。
举例说明如何使用bluetoothctl连接蓝牙外设:

运行bluetoothctl,输入power on命令使能蓝牙。
蓝牙外设开机并使其广播,使用scan on命令开启扫描,等扫描到目标蓝牙外设后使用scan off命令停止扫描。
使用devices命令查看扫描到的设备地址,,复制该外设对应的蓝牙MAC地址xx:xx:xx:xx:xx:xx。
使用connect xx:xx:xx:xx:xx:xx命令连接蓝牙外设,有些外设首次连接需要配对,将connect改为pair即可。

2 hciconfig

hciconfig工具可以实现一些bluetoothctl工具无法完成的功能,bluetoothctl偏向于蓝牙应用层,而hciconfig则偏向于蓝牙层本身。例如hciconfig工具可以设置BR/EDR的inquiry scan参数和page scan参数、设置ACL、SCO的MTU等。具体的用法可以使用hciconfig --help命令来获得。(命令示例 hciconfig hci0 reset)

3 l2ping

l2ping工具类似于ping工具,可以测试两个蓝牙设备之间L2CAP链路的通信是否正常。其原理为发送方发送L2CAP_ECHO_REQ命令,接收方应答。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6ucjCTB-1683879864867)(D:/%E8%B5%84%E6%96%99/common-master/note/img/image-20230224135058727.png)]

l2ping用法如下:

l2ping - L2CAP ping
Usage:
        l2ping [-i device] [-s size] [-c count] [-t timeout] [-d delay] [-f] [-r] [-v] <bdaddr>
        -f  Flood ping (delay = 0)
        -r  Reverse ping
        -v  Verify request and response payload

各参数含义如下:

-i:指定hci接口,例如-i 0是指定hci0,默认就是hci0
-s:指定ping包大小,默认是44字节
-c:指定ping包个数
-t:指定最大超时时间,单位是秒
-d:指定两个ping包之间的间隔,单位是秒
-f:相当于-d 0,ping包之间没有间隔,只要收到应答就发送下一个ping包
-r:接收ping包
-v:校验发送与接收到的ping包内容
:指定目标设备的蓝牙地址,格式为xx:xx:xx:xx:xx:xx
命令示例:

/home/bluez # ./l2ping -f -s 512 -c 10 -t 1 34:1C:F0:F1:E5:3F
Ping: 34:1C:F0:F1:E5:3F from 40:24:B2:D1:F2:A8 (data size 512) ...
512 bytes from 34:1C:F0:F1:E5:3F id 0 time 209.38ms
512 bytes from 34:1C:F0:F1:E5:3F id 1 time 83.60ms
512 bytes from 34:1C:F0:F1:E5:3F id 2 time 81.16ms
512 bytes from 34:1C:F0:F1:E5:3F id 3 time 41.26ms
512 bytes from 34:1C:F0:F1:E5:3F id 4 time 42.35ms
512 bytes from 34:1C:F0:F1:E5:3F id 5 time 108.65ms
512 bytes from 34:1C:F0:F1:E5:3F id 6 time 38.67ms
512 bytes from 34:1C:F0:F1:E5:3F id 7 time 48.65ms
512 bytes from 34:1C:F0:F1:E5:3F id 8 time 44.94ms
512 bytes from 34:1C:F0:F1:E5:3F id 9 time 56.19ms
10 sent, 10 received, 0% loss

4 l2test

l2test工具用于测试蓝牙L2CAP层的性能,有点类似于iperf工具。l2test工具使用的是服务器-客户端模型,基于L2CAP层建立socket连接。测试时,一台设备需作为server,另一台作为client。下面是测试命令示例,其中-r表示接收模式,-b表示接收多少数据,-s表示发送模式,xx:xx:xx:xx:xx:xx是接收端的地址。l2test工具较为灵活,这个例子是服务器接收、客户端连接并发送,也可以改成服务器发送、客户端连接并接收,只需要将-r改为-w,-s改为-u

服务器:./l2test -r -b 100000
发送端:./l2test -s xx:xx:xx:xx:xx:xx

这个例子中,服务器端的效果如下:

/home/bluez # ./l2test -r -b 100000
l2test[836]: Waiting for connection on psm 4113 ...
bluetoothd[489]: src/adapter.c:connected_callback() hci0 device 78:F2:35:0E:D0:46 connected eir_len 11
bluetoothd[489]: src/adapter.c:new_link_key_callback() hci0 new key for 78:F2:35:0E:D0:46 type 4 pin_len 0 store_hint 0
bluetoothd[489]: src/device.c:device_bonding_complete() bonding (nil) status 0x00
bluetoothd[489]: src/adapter.c:resume_discovery() 
l2test[837]: Connected to 78:F2:35:0E:D0:46 (bredr, psm 4113, dcid 64)
l2test[837]: Local device B8:4D:43:35:42:9D (bredr, psm 4113, scid 64)
l2test[837]: Options [imtu 672, omtu 672, flush_to 65535, mode 0, handle 2, class 0x000000, priority 0, rcvbuf 163840]
l2test[837]: Receiving ...
l2test[837]: 100128 bytes in 0.84 sec, 117.10 kB/s
l2test[837]: 100128 bytes in 0.87 sec, 112.98 kB/s
l2test[837]: 100128 bytes in 0.89 sec, 110.14 kB/s
l2test[837]: 100128 bytes in 0.81 sec, 120.81 kB/s
l2test[837]: 100128 bytes in 0.83 sec, 118.36 kB/s

l2test还可以用于测试蓝牙反复连接-断开-连接的稳定性,服务器的命令不变,客户端命令从-s改为-c即可。

5 hcidump

hcidump可以抓取HCI层的数据,可以直接在控制台打印,也可以保存为文件,这在分析问题时非常有用。下面是使用hcidump在后台运行并直接打印在控制台的效果。

< HCI Command: LE Set Advertising Parameters (0x08|0x0006) plen 15
min 100.000ms, max 100.000ms
type 0x00 (ADV_IND - Connectable undirected advertising) ownbdaddr 0x00 (Public)
directbdaddr 0x00 (Public) 00:00:00:00:00:00
channelmap 0x07 filterpolicy 0x00 (Allow scan from any, connection from any)

HCI Event: Command Complete (0x0e) plen 4
LE Set Advertising Parameters (0x08|0x0006) ncmd 2
status 0x00
< HCI Command: LE Set Advertise Enable (0x08|0x000a) plen 1
HCI Event: Command Complete (0x0e) plen 4
LE Set Advertise Enable (0x08|0x000a) ncmd 2
status 0x00
直接打印在控制台的方式比较简陋,而且不利于后期分析,可以用hcidump -w output_file & 命令将日志记录在指定文件中,并在后台运行,待记录完数据后再将日志传回PC,直接使用Wireshark打开,效果如下图所示。

### 如何在 Ubuntu 20.04 中离线安装 net-tools 要在 Ubuntu 20.04 上进行 `net-tools` 的离线安装,可以按照以下方式操作: #### 准备工作 为了实现离线安装,需要先在一个能够联网的设备上获取所需的 `.deb` 文件及其依赖项。可以通过访问官方 Debian 或 Ubuntu 存储库来下载这些文件。 1. **查找并下载 `net-tools` 安装包** 访问 Ubuntu 的软件包页面(https://packages.ubuntu.com/),搜索适用于 focal (20.04) 版本的 `net-tools` 软件包[^3]。找到适合目标架构(通常是 amd64 或 i386)的 `.deb` 文件,并将其下载到可移动存储介质中。 2. **收集必要的依赖关系** 使用命令行工具如 `apt-rdepends` 来分析 `net-tools` 及其所有依赖项。例如,在有网络连接的情况下运行以下命令: ```bash apt-rdepends net-tools | grep -v "^ " ``` 这会列出所有的直接和间接依赖项。对于每种依赖项,也需要从上述网站手动下载相应的 `.deb` 文件[^5]。 #### 实际安装过程 当所有必需的 `.deb` 文件都已准备好之后,将它们复制至目标系统的某个目录下(比如 `/tmp/net-tools-offline/`)。接着执行批量安装命令以完成部署。 ```bash sudo dpkg -i /path/to/*.deb ``` 如果遇到未满足的依赖错误提示,则重新检查是否有遗漏的组件;或者尝试修复模式下的自动处理功能: ```bash sudo apt --fix-broken install ``` 以上步骤应该能成功地让您的 Ubuntu 20.04 系统即使处于无互联网环境下也能正常使用 `ifconfig` 等由 `net-tools` 提供的功能[^1]^。 ### 注意事项 - 确保所选 `.deb` 文件版本与操作系统匹配。 - 若某些深层级依赖无法单独获得时,可能需考虑整个基础镜像更新策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值