Python蓝牙如何向手机发送文件

5

在我的当前项目中,有一个要求是在不需要手机上任何其他东西的情况下(除了已配对的蓝牙连接和标准状态),从Windows计算机向Android设备发送文件。我查看了PyBluez,它似乎很容易在客户端和服务器架构之间发送文件(事实上,我很快就让它在我的笔记本电脑和台式电脑之间发送了文件),但是一旦建立连接,我无论如何都找不到任何方法让Python将文件从计算机发送到Android;我的尝试是从设备中获取类似蓝牙MAC地址的东西,像这样

nearby_devices = bluetooth.discover_devices(
    duration=8, lookup_names=True, flush_cache=True, lookup_class=False)

之后尝试像这样发送文件

port = 1
for addr, name in nearby_devices:
    bd_addr = addr
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((bd_addr, port))

sock.send("download-app")
sock.close()

当然,使用pybluez文档提供的示例脚本,我可以在客户端和服务器之间无缝发送文件。但是,我仍然无法找到一种方法将文件发送到选定的Android设备(即使我指定其地址并知道它在范围内)。
3个回答

8
你已经完成了大部分工作...
正如你所知,你需要在蓝牙连接的另一端找到一个对话对象。你只需要用一个知名服务(通常是这些选项之一)替换自己的自定义服务器。
在我的情况下,我的手机支持“OBEX对象推送”服务,所以我只需要连接到该服务并使用适当的客户端来进行正确的协议交流。幸运的是,PyOBEX和PyBluez的组合在这里起到了作用!
以下代码(从PyOBEX和PyBluez示例中快速拼凑而成)在我的Windows 10上、Python 2.7安装程序上运行,并在手机上创建了一个简单的文本文件。
from bluetooth import *
from PyOBEX.client import Client
import sys

addr = sys.argv[1]
print("Searching for OBEX service on %s" % addr)

service_matches = find_service(name=b'OBEX Object Push\x00', address = addr )
if len(service_matches) == 0:
    print("Couldn't find the service.")
    sys.exit(0)

first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]

print("Connecting to \"%s\" on %s" % (name, host))
client = Client(host, port)
client.connect()
client.put("test.txt", "Hello world\n")
client.disconnect()

看起来PyOBEX是一个非常简单的包,不过它不兼容Python 3,所以如果需要兼容性,你可能需要进行一些移植。


兄弟...谢谢你。真的非常感谢你。这是那种“我项目中真的需要”的交易;你可能不仅帮助了我,还帮助了许多处于同样情况的人。 - j.gooch
{btsdaf} - Sultan

2
我个人还没有探索过,但是请看这个博客 -

http://recolog.blogspot.com/2013/07/transferring-files-via-bluetooth-using.html

作者使用lightblue包作为Obex协议的API并通过连接发送文件。现在,lightblue包似乎已经停止维护。还有其他的包,比如PyObex(由于某种原因我无法导入),你也可以探索作为替代方案,但是lightblue似乎是最好的选择。

我的意思是我可能已经查看了这个页面大约10次;问题在于LightBlue是基于*nix的,而该项目的目标操作系统是基于Windows的。到目前为止,我的想法是不可避免地我将不得不编写自己的C库来完成这个任务。 - j.gooch
1
我明白了。看起来问题在于Windows不支持openOBEX,而这一切都是基于它的。但我有一个不寻常的想法,可能需要一些调整才能实现。你可以尝试自定义pybluez模块以使用FTP发送吗?我不确定你是否需要在Android设备上安装obexftp、openobex或其他什么东西,但安装它们应该很容易。抱歉,我帮不上更多忙。 - Dan Temkin
老实说,我在头痛数天后找到了一个OBEX库,但由于某种原因它仍被我的手机阻止。看来我只能转向C语言了。 - j.gooch

1
我已经基于Bitbucket上的PyOBEX代码制作了一个Python 3端口。目前我只测试了客户端功能,但我认为服务器也应该能正常工作,因为与Python 3的大部分兼容性问题都是由于附加到字符串中的struct.pack / struct.unpack二进制块引起的,这些问题都已解决。请注意,此处保留了HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接