RFCOMM 没有在 Debian 上使用 PyBluez 配对?

Posted

技术标签:

【中文标题】RFCOMM 没有在 Debian 上使用 PyBluez 配对?【英文标题】:RFCOMM without pairing using PyBluez on Debian? 【发布时间】:2013-01-15 02:40:21 【问题描述】:

我正在尝试使用 Python 创建一个无需配对即可使用的 RFCOMM 服务器进程。最初,我从 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 上测试时,客户端连接被拒绝。在 syslog 中有来自 bluetoothd 的消息,显示链接密钥请求和 PIN 请求失败。

版本信息:

PyBluez 0.18 Python 2.6 Bluez 4.66 连接两端的蓝牙 v2.0 硬件

This discussion 似乎暗示如果我可以调整服务器套接字上的安全级别,那么配对将被禁用,一切都会按预期工作。不过,我不清楚如何使用 PyBluez 做到这一点,或者即使有可能。

我已经尝试使用各种 BT_SECURITY* 常量调用 setsockopt(),以及获取最后一个 PyBluez 并调用 setl2capsecurity(),但没有取得任何进展。

这可以通过 PyBluez 实现吗?

【问题讨论】:

【参考方案1】:

事实证明这是 Debian Squeeze bluez 默认配置的问题。

如果其他人遇到此问题,请通过编辑 /etc/bluetooth/main.conf 禁用 pnat 插件:

DisablePlugins = pnat

然后重启蓝牙。

$ sudo invoke-rc.d bluetooth restart

不需要对 PyBluez 代码进行任何更改。

【讨论】:

谢谢!这也是Ubuntu 12.04下的问题! 谢谢!非常有帮助。我也在 Ubuntu 12.04 上。我还发现杀死蓝牙代理进程会有所帮助。 永远不会想到这一点,谢谢!在 Raspbian 操作系统上工作。您是否有机会添加一些关于 pnat 到底是什么以及为什么默认启用它的信息?找不到太多关于它的信息... 这个 Debian 错误报告有更多信息:bugs.debian.org/cgi-bin/bugreport.cgi?bug=690749 我在 Raspbian 上仍然会出现这个问题,任何提示如何调试它?感谢您的提醒:)

以上是关于RFCOMM 没有在 Debian 上使用 PyBluez 配对?的主要内容,如果未能解决你的问题,请参考以下文章

可以在iOS中使用RFCOMM吗?

如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微控制器上的 RFCOMM 插座?

Xamarin.iOS 和 RFComm

我可以使用 RFCOMM 蓝牙协议在 iOS 设备和另一台设备之间共享数据吗?

八RFCOMM

pyb库