2017-02-16 4 views
3

в моем текущем проекте требуется отправить файл с компьютера Windows на Android-устройство через Bluetooth без каких-либо проблем на телефоне, кроме стандартного состояния и, конечно, в паре подключение Bluetooth. я просмотрел pybluez, и это казалось достаточно простым, чтобы отправлять файлы между клиентской и серверной архитектурой (и фактически быстро отправлял его между моим ноутбуком и рабочим столом), но я не могу на всю жизнь найти способ получить python отправьте файл с компьютера на андроид после установления соединения; мои попытки были захвата адреса Bluetooth макинтош, как вещи из устройства, как такPython Bluetooth как отправить файл на телефон

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 (даже если я укажу его адрес и знаю, что он находится в пределах диапазона)

ответ

1

Вы большую часть пути туда ...

Как вы знаете, что вам нужно что-то, чтобы говорить на другом конце вашего соединения Bluetooth. Вам просто нужно заменить свой собственный сервер на известную услугу (как правило, одну из these options).

В моем случае мой телефон поддерживает услугу «OBEX Object Push», поэтому мне просто нужно подключиться к ней и использовать подходящего клиента для разговора с правильным протоколом. К счастью, комбинация 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 совместимы, так что вы можете иметь немного портирование делать, если это требование.

+0

bro ... спасибо. Как серьезно спасибо. это один из тех видов сделок «действительно нужен для моего проекта»; вы, вероятно, поможете не только мне, но и многим другим в этой точной ситуации. –

+0

Я сделал вилку PyOBEX под названием nOBEX с кучей улучшений, новых функций и исправлений ошибок вместе с поддержкой Python 3. Вы можете посмотреть здесь: https://github.com/nccgroup/nOBEX – Sultan

2

У меня нет лично изучил его, но chec K этот блог -

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

Автор использует пакет LightBlue в качестве API для протокола OBEX и передачи файлов через соединение. Теперь пакет lightblue, похоже, не поддерживается. Существуют и другие пакеты, такие как PyObex (которые я не мог импортировать по какой-либо причине), которые вы также могли бы изучить в качестве альтернатив, но lightblue, похоже, подходит для этого.

+0

Я имею в виду, что я просмотрел эту точную страницу, вероятно, примерно десять раз; проблема заключается в том, что lightblue является * nix based и целевым os для использования для этого проекта, основанного на Windows. мои мысли до сих пор таковы, что я неизбежно должен буду написать свою собственную библиотеку в c, чтобы выполнить это. –

+1

Я получаю это. Похоже, что проблема в том, что окна не поддерживают openOBEX, на чем все это основано. Но у меня была необычная идея, что _might_ работает с немного возиться. Возможно, вы можете настроить модуль pybluez для отправки через FTP? Я не уверен, что вам нужны obexftp, openobex или что-то еще на устройстве Android, но их установка должна быть достаточно простой. Извините, я не мог больше помочь. –

+0

Честно говоря, в конце концов я нашел библиотеку obex после нескольких дней ударов головой о стену, но по какой-то причине она по-прежнему блокировалась моим телефоном. похоже, что это для меня для меня –