使用Python实现两台树莓派3间经蓝牙传输单个CSV文件的技术求助
树莓派3蓝牙整文件传输可落地方案
前置基础
- 两台树莓派3均开启内置蓝牙功能,完成双向配对,确保双方设备列表里能互相识别
- 全程依托树莓派原生的BlueZ蓝牙协议栈实现,不需要额外购置硬件
最快落地:零开发工具方案
不需要写业务代码,完全依托系统自带的蓝牙文件传输能力,全程整文件二进制传输,不会解析文件内容:
- 发送端安装
obexftp命令行工具,接收端安装obexpushd后台服务 - 接收端启动OBEX推送服务,所有收到的文件会以完整原始二进制形式落地到默认目录
/var/spool/obex/,接收过程不会拆分、不会解析文件内容,和发送端的原文件完全一致 - 发送端拿到接收端的蓝牙MAC地址后,直接执行传输命令:
obexftp --nopath --nocache --bluetooth [接收端蓝牙MAC地址] --put [待传输CSV/压缩包的绝对路径] - 实际性能参考:使用经典蓝牙BR/EDR模式传输4MB文件,耗时约10-20秒,OBEX协议自带传输校验和丢包重传机制,不会出现接收端文件损坏的问题
可集成进自有业务的开发实现
如果需要把传输逻辑嵌入到自己的业务流程中,可根据技术栈灵活适配,全程不需要逐行读取CSV内容:
- 核心实现逻辑统一:把所有文件操作按二进制流处理,仅做固定块大小的分块传输,完全不涉及CSV文本内容的解析
- 发送端:建立RFCOMM蓝牙链路后,先和接收端完成简单握手,传递文件名、文件总大小的元数据,之后直接以
rb(二进制只读)模式打开待传文件,按固定块大小读取内容向外发送即可 - 接收端:收到元数据后直接初始化本地文件的二进制写入流,把收到的传输块直接追加写入本地文件,直到接收完全部内容再关闭文件句柄,之后再开展后续业务处理
- 发送端:建立RFCOMM蓝牙链路后,先和接收端完成简单握手,传递文件名、文件总大小的元数据,之后直接以
- 技术栈适配选择:
- Python场景可搭配PyBluez、PyOBEX开源库快速实现,基础功能代码量不到50行
- C场景可直接调用BlueZ原生的RFCOMM、OBEX接口实现,运行资源占用更低,适合对性能要求高的场景
- 优化小技巧:如果想进一步压缩传输耗时,可先把CSV文件用gzip打包为单压缩包再传输,通常4MB的结构化CSV压缩后体积可缩小到1MB以内,接收端收到压缩包后直接解压即可,全程还是保持整文件传输的逻辑
关键避坑提示
- 不要用BLE低功耗蓝牙通道传输大文件,它的带宽仅几十kbps级别,不仅传输慢还容易断连,优先用树莓派3自带的经典蓝牙RFCOMM通道
- 配对流程需要在两台设备上双向确认配对请求,避免单边配对导致链路连接失败
- 整个实现流程完全不需要逐行读取、逐行发送CSV内容,所有数据都是以完整二进制文件的形式在蓝牙链路中传输,完全匹配需求
内容的提问来源于stack exchange,提问作者Adrián Rodríguez
相关产品推荐
相关产品推荐

