bluez5.50蓝牙文件传输

简介: bluez5.50蓝牙文件传输

蓝牙文件传输主要用到 bluez 下 obex 协议支持,需要在启动 bluetoothd 蓝牙守护进程后再启动 obexd 文件传输服务进程,关于蓝牙协议栈可以参考以下图片:


469b8ca61916414e861aaa30500972e5.png

bluez 5.50 蓝牙协议栈体系结构

蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和应用层


1、底层硬件模块

蓝牙的 GIG 规定了四种与硬件连接的物理总线方式 USB、RS232、UART、PC卡


2、bluezcore 核心层包含各种 profile

  • GAP:设备连接
  • SDAP:查询相关信息
  • SPP:虚拟串口连接
  • GOEP:数据传输

3、中间协议层

  • HCI接口:设备扫描、配对
  • L2CAP协议:蓝牙适配

4、应用层及 bluez 各种工具集

  • hciconfig:配置蓝牙设备,用于打印设备信息和配置设备
  • hcitool:配置蓝牙连接,执行扫描等命令
  • gatttool:直接使用参数对蓝牙设备进行控制,使用 -l 参数进入 interactive 模式对蓝牙设备进行控制
  • sdptool:搜索并管理设备服务

buildroot 配置添加

这里使用的 bluez 5.50,在 buildroot 配置中能够看到 bluez 分为 bluez 和 bluez5.x ,这是因为 bluez(3.xx-4.xx) 版本与 bluez5.xx 版本相差很大,之前旧版本的 bluez 会包含很多上层 a2dp、obex 等应用服务,而在新版本的 bluez 中为了方便应用配置和简化代码将上层应用进行了剥离。


由于我们使用的是 bluez5.50 ,所以在添加配置时注意要选择我们所需要的 bluez 协议:


d16588156faa42f8aaaa55c5fbca990f.png

文件传输启动流程

在 bluetoothd 蓝牙守护进程启动之前需要确保 dbus 服务已经正常启动了,具体启动流程可以参考以下脚本:


【bluetooth_init.sh】
#!/bin/sh
btmgmt -i hci0 name "blueztest"
btmgmt -i hci0 connectable on
btmgmt -i hci0 le on
btmgmt -i hci0 advertising on
btmgmt -i hci0 power on
export $(dbus-launch)
sdptool add --channel=1 GATT SP A2SNK A2DP
btgatt-server &
/usr/libexec/bluetooth/bluetoothd -d -C -n &
pulseaudio -D  --exit-idle-time=-1 --start --log-target=file:/tmp/pulse.log
/usr/libexec/bluetooth/obexd -a -n -r /home/ &


注意 export $(dbus-launch) 操作是为了添加 dbus session 环境变量 DBUS_SESSION_BUS_ADDRESS ,如果启动 obexd 服务发现有以下报错肯定是这个环境变量没有配置:


# /usr/libexec/bluetooth/obexd
Using X11 for dbus-daemon autolaunch was disabled at compile time, set your DBUS_SESSION_BUS_ADDRESS instead


在启动 bluetoothd 时可以将 -d 选项去掉,这里添加是为了方便进行调试,-d 选项是 debug 使能操作。


同理,obexd 启动时也可以将 -n 选项去掉,-n 选项是为了将 log 信息显示到前台。


服务启动后的文件传输操作

1、先确定蓝牙设备是否挂载成功并且使能,hciconfig -a 查看,如下:

52da6f2a9fd3414c92abce0ec55a235a.png

2、顺利执行 bluetooth_init.sh 脚本,脚本内容如前一小节所示,启动成功后,能够进入 bluetoothd 并执行 show 操作:

6634bb32a8704fd9b7452fb6bb6beea3.png

3、在 bluetoothctl 交互对话中执行 scan on 搜索设备,如下所示:

8adfc37573c346ef832402006ab90231.png

4、devices 查看搜索到的设备,这时候就可以通过 connect 连接我们的手机或者蓝牙设备:

21dda0240ffa40cb96fbc95cf330ab5b.png

5、连接操作:

连接成功后,当前标签就会变成连接后的设备名称,并且能够通过help查看支持的操作,如下所示:

cdd47ce0a74b42cd9ad44a513d2450d3.png

此时可以输入 quit 退出 bluetoothctl 操作,蓝牙会继续保持连接,如果需要使得该设备每次启动后自动连接,需要执行 trust <设备addr> 操作即可。

d66ea9a6a8a94873a2822800072791b2.png

6、前面已经在启用 obexd 时添加了 -a 自动接收文件操作,这时候可以操作手机完成文件上传,如下图所示:

这里的接收路径是在启用 obexd 时的 -r 参数配置的,我这里配置成 /home 路径,所以自动接收的文件会存放到这里。如果这一步报错有编码问题,需要重新编译 builroot ,具体参考后面的【问题及解决方法】


7、蓝牙文件发送操作

文件发送操作在板子上需要借助 obexctl 工具,这个工具 buildroot 不会自动拷贝过来,它存在 bluez 的 tools 下,在编译过程中应该已经编译完成,我们拷贝到板子上使用即可。


启用 obexctl 进入界面:

983e40cb9c9e4c609fb5a44c2b2e4ad7.png

遇到的问题及解决方法

1、在从手机端向设备进行文件传输请求时:

failed: Conversion from character set “UTF-16BE” to “UTF-8” is not supported


https://blog.csdn.net/qq_32017483/article/details/124304238


buildroot 中要添加 libiconv 库支持,就需要在 Toolchain 中选择如下:(注意在添加选项后,需要重新编译 glibc、dbus、bluez才能有效)


b0f3060bb4a2481984386f205205c238.png

2、启动 obexctl 失败

obexctl 启动 arguments to dbus_connection_unref() were incorrect, assertion "connection != NULL" failed in file dbus-connection.c


这里还是 dbus 环境问题,重启后调用dbus-launch 后,export 设置环境变量DBUS_SESSION_BUS_ADDRESS 再次尝试即可正常


相关文章
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
1923 0
|
存储 安全 算法
【BLE】 BLE配对绑定保姆级介绍
实现蓝牙通信安全,除了paring/bonding这种底层方式,用户也可以在应用层去实现相同功能,两者从功能上和安全性上没有本质区别,只不过应用层自己实现的话,需要自己选择密码算法,密钥生成,密钥交换等,如果你不是这方面的专家,你的应用就有可能会存在安全漏洞。设备跟手机绑定成功后,手机再次重连这个设备时,就会自动跳过service discovery过程,换句话说,配对的时候手机会把设备所有服务和characteristic的handle保存下来,二次重连的时候,直接用以前保存的handle值去操作设备。
5762 1
【BLE】 BLE配对绑定保姆级介绍
|
监控 物联网 数据安全/隐私保护
蓝牙调试工具集合汇总
蓝牙调试工具集合汇总
1173 0
|
物联网 API 数据库
一文带你认识蓝牙 GATT 协议
正所谓磨刀不误砍柴工,我们有必要先深入的学习一下 GATT 以及 GATT 相关的一些知识。 本文我们就来了解一下 蓝牙 GATT 到底是什么?同时了解下我们使用的 ESP32-C3 GATT示例的工程的代码结构。
9413 5
一文带你认识蓝牙 GATT 协议
|
存储 编解码 Ubuntu
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
|
传感器 编解码 Linux
V4L2框架 | MIPI Camera指令调试笔记
V4L2框架 | MIPI Camera指令调试笔记
8662 2
|
运维 网络协议 Linux
Linux(28) Linux双网卡配置为连接到Linux主机的PC提供外网访问
Linux(28) Linux双网卡配置为连接到Linux主机的PC提供外网访问
1078 1
|
数据安全/隐私保护
wpa_supplicant 的使用
wpa_supplicant 的使用
883 1
|
前端开发 安全 数据安全/隐私保护
WPA_CLI 的介绍:介绍如何使用wpa_cli连接WiFi的方法
WPA_CLI 的介绍:介绍如何使用wpa_cli连接WiFi的方法
1796 2
|
XML Ubuntu Linux
探索Linux中的`busctl`命令:DBus的瑞士军刀
`busctl`是Linux下管理DBus消息总线的命令行工具,用于查看、监听和控制DBus服务。

热门文章

最新文章

下一篇
开通oss服务