Python蓝牙如何将文件发送到phon

2024-03-29 07:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在我目前的项目中,需要通过蓝牙将文件从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设备(即使我指定了它的地址并知道它在范围内)


Tags: 文件true客户机port地址计算机lookupbd
3条回答

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

如您所知,您需要在蓝牙连接的另一端进行通话。您只需要用一个著名的服务(通常是these options)替换您的自定义服务器。

在我的例子中,我的手机支持“OBEX对象推送”服务,所以我只需要连接到该服务并使用合适的客户端来讨论正确的协议。幸运的是,PyOBEX和PyBluez的结合在这里起到了作用!

下面的代码(从PyOBEX和PyBluez示例快速拼凑而成)运行在我的windows10python2.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不兼容,所以如果需要的话,您可能需要进行一些移植。

我还没有亲自探索过,但看看这个博客-

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

作者使用lightblue包作为Obex协议的API,并通过连接发送文件。现在,浅蓝色包似乎未被维护。还有其他的软件包,比如PyObex(无论出于什么原因,我都无法导入),你也可以作为替代品来探索,但lightblue似乎是一条路要走。

我在PyOBEX code on bitbucket的基础上做了一个Python 3 port的PyOBEX。到目前为止,我只测试了客户机功能,但我希望服务器也能正常工作,因为Python 3的大部分兼容性问题都是由于附加到字符串的struct.pack/struct.unpack二进制blob引起的,这些问题本应得到解决。

相关问题 更多 >