【问题标题】:PyBluez not accepting connectionPyBluez 不接受连接
【发布时间】:2012-08-25 06:13:38
【问题描述】:

我正在尝试在我的 PC 和诺基亚 E63 之间设置一个 RFCOMM 客户端-服务器通信系统。我正在使用 Python 和 PyBluez 来设置服务器并使用 PyS60 在我的手机上对客户端进行编程。

但是 PyBluez 不接受连接。

这里是服务器的代码:

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"

这是客户端的代码

#!/usr/bin/env python

import socket

class BTReader:
  def connect(self):
    self.sock=socket.socket(socket.AF_BT, socket.SOCK_STREAM)
    addr, services=socket.bt_discover()
    print "Discovered: %s, %s" % (addr, services)
    port = services[services.keys()[0]]
    print port
    address=(addr,port)
    print "Connecting to", str(address), "..."
    self.sock.connect(address)
    print "OK."
    data = "Hello, World!"
    print "Sending data:", data
    self.sock.send("Hello World!");
    print "SENT."

  def close(self):
    self.sock.close()

def main():
  bt=BTReader()
  bt.connect()
  bt.close()

if __name__ == '__main__':
  main()

当我运行这两个程序时,我得到了这个输出

1) 服务器(PC): 正在等待 RFCOMM 通道 1 上的连接 [它一直在那里。它不承认连接。我使用WINPDB检查过,即使手机显示已建立连接,服务器脚本仍保留在server_sock.accept()循环中。]

2) 客户(电话):

Discoverd: xx:xx:xx:xx:xx:xx {u'SampleServer':1}
1
Connecting to ('xx:xx:xx:xx:xx:xx', 1) ...
OK.
Sending data: Hello World!
Traceback (most recent call last):
...
...
File "c;\resource\socket.py" , line 409, in send return self._sock.send(data, f, cb)
error: (0, 'Error')

是什么导致了问题??

【问题讨论】:

    标签: python bluetooth


    【解决方案1】:

    一年后我就知道了,但我有另一个解决方案。在某些版本的 Debian(Raspbian 等)和其他一些发行版上。 server_sock.accept() 默认情况下只会挂起并且从不接受连接 - 即使是来自配对设备!但是,对此的解决方案非常简单。如果你去 /etc/bluetooth/main.conf 有一行叫做禁用插件。添加一行或更改如下所示:-

     DisablePlugins = pnat
    

    然后重启蓝牙服务:-

     sudo invoke–rc.d bluetooth restart
    

    现在可能已修复。

    祝你好运!

    参考:RFCOMM without pairing using PyBluez on Debian?

    【讨论】:

    • 您好,invoke 和-rc.d 之间的空格应该没有,我用的时候没用。但是,我遵循了您包含的链接,并使用了 OP 发布的没有空间的链接。有效。谢谢!
    • 太好了,这为我节省了几个小时!使用 Asus USB-BT400 蓝牙加密狗为 Raspberry Pi 工作
    【解决方案2】:

    您应该重新阅读 PyBluez 库的 Rfcomm-client.py 示例。 我不知道您为什么使用一些随机套接字而不是 BluetoothSocket 对象...

    但我怀疑这是错误。为更多读者详细说明:

    如果您查看客户端代码,他正在导入套接字模块并使用它 - 这与 pybluez 无关,并且是错误的。

    作为提示,尝试使 2 examples in the PyBluez library 工作(客户端和服务器),然后创建您的应用程序。

    【讨论】:

      【解决方案3】:

      有时服务器会弹出一个窗口并要求用户批准连接。如果您在没有 X 服务器的情况下运行,那么您将没有机会看到对话框窗口并且连接被拒绝..!! (过去在这上面花了半天时间……!!!)

      【讨论】:

      • 我在代码中硬编码了蓝牙适配器的 MAC 地址。我决定不使用服务发现机制。我实际上并没有尝试解决这个问题,我需要一个快速的解决方法。
      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 2016-04-30
      • 2012-01-16
      • 2018-03-22
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多