Python蓝牙如何将文件发送到手机

时间:2017-02-16 03:27:35

标签: android python windows bluetooth pybluez

在我目前的项目中,要求通过蓝牙将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 个答案:

答案 0 :(得分:2)

我没有亲自探讨过,但请查看此博客 -

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

作者使用lightblue软件包作为Obex协议的API并通过连接发送文件。现在,浅蓝色包装似乎没有维护。还有像PyObex这样的其他软件包(无论出于何种原因我都无法导入),你也可以将它作为替代品进行探索,但是浅蓝色似乎是要走的路。

答案 1 :(得分:2)

你大部分时间都在那里......

如您所知,您需要在蓝牙连接的另一端与之交谈。您只需要使用众所周知的服务(通常是these options之一)替换您的自定义服务器。

在我的情况下,我的手机支持" 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,所以如果这是一个要求,你可能需要做一些移植。

答案 2 :(得分:0)

我基于Python 3 port制作了PyOBEX code on bitbucket的PyOBEX。到目前为止,我仅测试了客户端功能,但是我希望服务器也能正常工作,因为与Python 3的大多数兼容性问题是由于附加到字符串的struct.pack/struct.unpack二进制Blob引起的,解决了。​​