当前位置:网站首页>bluez5.50蓝牙文件传输
bluez5.50蓝牙文件传输
2022-08-02 03:30:00 【跑不了的你】
蓝牙文件传输主要用到 bluez 下 obex 协议支持,需要在启动 bluetoothd 蓝牙守护进程后再启动 obexd 文件传输服务进程,关于蓝牙协议栈可以参考以下图片:
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 协议:
文件传输启动流程
在 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
查看,如下:
2、顺利执行 bluetooth_init.sh
脚本,脚本内容如前一小节所示,启动成功后,能够进入 bluetoothd
并执行 show
操作:
3、在 bluetoothctl 交互对话中执行 scan on 搜索设备,如下所示:
4、devices 查看搜索到的设备,这时候就可以通过 connect 连接我们的手机或者蓝牙设备:
5、连接操作:
连接成功后,当前标签就会变成连接后的设备名称,并且能够通过help查看支持的操作,如下所示:
此时可以输入 quit 退出 bluetoothctl 操作,蓝牙会继续保持连接,如果需要使得该设备每次启动后自动连接,需要执行 trust <设备addr> 操作即可。
6、前面已经在启用 obexd
时添加了 -a 自动接收文件操作,这时候可以操作手机完成文件上传,如下图所示:
这里的接收路径是在启用 obexd
时的 -r 参数配置的,我这里配置成 /home 路径,所以自动接收的文件会存放到这里。如果这一步报错有编码问题,需要重新编译 builroot
,具体参考后面的【问题及解决方法】
7、蓝牙文件发送操作
文件发送操作在板子上需要借助 obexctl
工具,这个工具 buildroot
不会自动拷贝过来,它存在 bluez 的 tools 下,在编译过程中应该已经编译完成,我们拷贝到板子上使用即可。
启用 obexctl
进入界面:
遇到的问题及解决方法
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才能有效)
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
再次尝试即可正常
边栏推荐
- [Spark]-协同过滤
- 蛮力法求解凸包问题
- 【nRF24L01 connects with Arduino to realize wireless communication】
- Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset I3D论文精读
- 如何在 Scala 中科学地操作 collection(一):集合类型与操作
- 三相同步发电机的空载短路的simulink仿真
- 哈工大2021机器学习期末考试题
- uniCloud使用
- 2020 - AAAI - Image Inpainting论文导读《Learning to Incorporate Structure Knowledge for Image Inpainting》
- 振芯GM7123C:功能RGB转VGA芯片方案简介
猜你喜欢
USB HUB USB集线器电路设计
电子密码锁_毕设‘指导’
同时求最大值与最小值(看似简单却值得思考~)
使用批处理脚本修改hosts文件
从Attention到Self-Attention和Multi-Head Attention
USB2.0一致性测试方法_高速示波器
Case | industrial iot solutions, steel mills high-performance security for wisdom
【opencv】error: (-215:Assertion failed) ssize.empty() in function ‘cv::resize‘报错原因
【Arduino 连接GP2Y1014AU0F 灰尘传感器】
SyntaxError: unexpected character after line continuation character
随机推荐
【Arduino connects SD card module to realize data reading and writing】
分割回文串 DP+回溯 (LeetCode-131)
所有子字符串中的元音 —— LeetCode - 2063
78XX 79XX多路输出电源
[Arduino connected to GP2Y1014AU0F dust sensor]
PCIE电路设计
判断子序列 —— LeetCode-392
基于阿里云OSS+PicGo的个人图床搭建
How to remotely debug PLC?
AD PCB导出Gerber文件(非常详细的步骤)
[Spark]-协同过滤
MQ-5 可燃气体传感器与 Arduino 接口
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
NE5532运放加法器
Arduino点亮数码管
功率计,物联网,智能插座电路设计【毕业设计】
字符串匹配(蛮力法+KMP)
【opencv】error: (-215:Assertion failed) ssize.empty() in function ‘cv::resize‘报错原因
引擎开发日志:场景编辑器开发难点
Transformer结构解析及常见问题