RFCOMM без сопряжения с использованием PyBluez на Debian?
Я пытаюсь создать серверный процесс RFCOMM с Python, который можно использовать без необходимости сопряжения. Сначала я взял два примера скриптов из документации PyBluez:
Сервер:
# file: rfcomm-server.py
# auth: Albert Huang <albert@csail.mit.edu>
# desc: simple demonstration of a server application that uses RFCOMM sockets
#
# $Id: rfcomm-server.py 518 2007-08-10 07:20:07Z albert $
from bluetooth import *
server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)
port = server_sock.getsockname()[1]
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
advertise_service( server_sock, "SampleServer",
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ],
# protocols = [ OBEX_UUID ]
)
print "Waiting for connection on RFCOMM channel %d" % port
client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info
try:
while True:
data = client_sock.recv(1024)
if len(data) == 0: break
print "received [%s]" % data
except IOError:
pass
print "disconnected"
client_sock.close()
server_sock.close()
print "all done"
Клиент:
# file: rfcomm-client.py
# auth: Albert Huang <albert@csail.mit.edu>
# desc: simple demonstration of a client application that uses RFCOMM sockets
# intended for use with rfcomm-server
#
# $Id: rfcomm-client.py 424 2006-08-24 03:35:54Z albert $
from bluetooth import *
import sys
addr = None
if len(sys.argv) < 2:
print "no device specified. Searching all nearby bluetooth devices for"
print "the SampleServer service"
else:
addr = sys.argv[1]
print "Searching for SampleServer on %s" % addr
# search for the SampleServer service
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
service_matches = find_service( uuid = uuid, address = addr )
if len(service_matches) == 0:
print "couldn't find the SampleServer 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)
# Create the client socket
sock=BluetoothSocket( RFCOMM )
sock.connect((host, port))
print "connected. type stuff"
while True:
data = raw_input()
if len(data) == 0: break
sock.send(data)
sock.close()
Когда я запускал серверный скрипт в Windows, все работало так, как я и надеялся - не было необходимости в сопряжении. На этом этапе все выглядело очень многообещающе.
Однако мне нужен серверный процесс для запуска под Debian Squeeze. Когда я тестирую на Debian, клиентское соединение отклоняется. В системном журнале есть сообщения от bluetoothd для неудачного запроса ключа связи и запроса PIN-кода.
Информация о версии:
- PyBluez 0,18
- Python 2.6
- Bluez 4.66
- Оборудование Bluetooth v2.0 на обоих концах соединения
Похоже, это обсуждение говорит о том, что если я смогу настроить уровень безопасности на сокете сервера, то соединение будет отключено, и все будет работать так, как ожидается. Для меня не очевидно, как это сделать с PyBluez, или даже если это возможно.
Я экспериментировал с вызовами setsockopt(), используя различные константы BT_SECURITY*, а также захватывал последний PyBluez и вызывал setl2capsecurity(), но не смог добиться какого-либо прогресса.
Это будет достигнуто с PyBluez?
1 ответ
Это оказалось проблемой в конфигурации Debian Squeeze bluez по умолчанию.
Если кто-то еще сталкивается с этой проблемой, отключите плагин pnat, отредактировав /etc/bluetooth/main.conf:
DisablePlugins = pnat
Затем перезапустите bluetoothd.
$ sudo invoke-rc.d bluetooth restart
Никаких изменений не требовалось к коду PyBluez.