使用Python实现电脑与手机间的简单Wifi文件传输

8 投票
3 回答
24034 浏览
提问于 2025-04-15 14:27

我想在手机和电脑之间传输文件。我的手机是一部可以运行Python 2.5.4的智能手机,而我的电脑是运行Windows XP的(上面有Python 2.5.4和3.1.1)。

我希望在手机上有一个简单的Python程序,可以把文件发送到电脑,也能从电脑获取文件。手机端的程序应该只在需要的时候运行,而电脑端可以做成一个服务器,不过最好是占用资源少一点的那种。手机端应该能够知道电脑上相关文件夹里的内容。

目前,我是通过在电脑上运行Windows网络服务器(真麻烦)和在手机上用socket.set_default_access_point(这样程序可以选择我路由器的SSID或其他传输方式)以及urlretrieve(用来获取文件)来从电脑获取文件。至于发送文件到电脑,我是通过电子邮件用smtplib来实现的。

如果有建议的话,不管是一般的想法、现有的程序,还是其他任何相关的内容,我都非常欢迎。

3 个回答

0

网上有一些例子,但要记住,按照我记得的,PyBluez 只在 Linux 上能用。

我之前做过一些跟 OBEX 相关的事情,主要是用 obexftp 程序从手机上获取东西,这个程序是 OpenOBEX 项目的一部分2。当然,你可以在 Python 中调用 obexftp 程序,并使用 os、popen2 和 subprocess 模块中的函数来解析响应和退出代码。我相信 obexftp 也支持“推送”模式,但如果不支持,你可能能找到其他与 OpenOBEX 相关的东西。

因为在 GNU/Linux 发行版和 Python 中,蓝牙通信是通过套接字来支持的(前提是蓝牙支持被检测并配置好),你可以用普通的网络编程与手机进行通信,但这可能需要你自己实现 OBEX 协议——这并不是一件简单的事情,原因有很多,包括我下面提到的一个。因此,至少在最开始,使用 obexftp 可能更简单。

你还有lightblue,这是一个跨操作系统的蓝牙库。

还有一个完整的脚本,PUTools: Python Utility Tools for PyS60 Python(例子中有 Windows 的截图),它有一个:

Python 解释器,可以在电脑上输入和显示输出,通过蓝牙连接到手机,并在手机上执行。你还可以在手机上使用简单的命令行功能(比如 cd、ls、rm 等)。这个工具还允许你在电脑和手机之间同步文件(从电脑到手机非常有用,特别是在应用开发时),以及从手机到电脑(比如你的图片、正在开发程序的日志文件等)。

3

我会使用 paramiko。它安全、快速,而且非常简单。怎么样?

首先,我们要导入这个模块,并指定日志文件:

import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')

接下来,我们打开一个SSH传输通道:

host = "example.com"
port = 22
transport = paramiko.Transport((host, port))

然后我们需要进行身份验证。我们可以用密码来完成这一步:

password = "example101"
username = "warrior"
transport.connect(username = username, password = password)

另一种方法是使用SSH密钥:

import os
privatekeyfile = os.path.expanduser('~/.ssh/id_rsa')
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
username = 'warrior'
transport.connect(username = username, pkey = mykey)

现在我们可以启动SFTP客户端了:

sftp = paramiko.SFTPClient.from_transport(transport)

接下来,我们从远程系统把一个文件传到本地系统:

filepath = '/home/zeth/lenna.jpg'
localpath = '/home/zeth/lenna.jpg'
sftp.get(filepath, localpath)

现在我们来反向操作,把文件从本地传到远程:

filepath = '/home/zeth/lenna.jpg'
localpath = '/home/zeth/lenna.jpg'
sftp.put(filepath, localpath)

最后,我们需要关闭SFTP连接和传输通道:

sftp.close()
transport.close()

怎么样?我得给这个例子一些 致谢

1

我最后在手机上使用了Python的ftplib库,在电脑上用FileZilla这个FTP服务器。这样做的好处是非常简单,虽然可能会有一些安全问题。

如果有人感兴趣的话,这里是客户端代码的核心部分,用来发送和接收文件。实际的实现会稍微复杂一些。

from ftplib import FTP
import os

ftp = FTP()
ftp.connect(server, port)
ftp.login(user, pwd)

files = ftp.nlst() # get a list of files on the server
# decide which file we want

fn = 'test.py' # filename on server and for local storage
d = 'c:/temp/' # local directory to store file
path = os.path.join(d,fn)
r = ftp.retrbinary('RETR %s' % fn, open(path, 'wb').write)
print(r) # should be: 226 Transfer OK

f = open(path, 'rb') # send file at path
r = ftp.storbinary('STOR %s' % fn, f) # call it fn on server
print(r) # should be: 226 Transfer OK
f.close()

ftp.quit()

撰写回答