首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyBluez不接受连接

PyBluez不接受连接
EN

Stack Overflow用户
提问于 2012-08-30 21:38:25
回答 3查看 9.2K关注 0票数 4

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

但是,PyBluez不接受该连接。

下面是服务器的代码:

代码语言:javascript
复制
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"

下面是客户端的代码

代码语言:javascript
复制
#!/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)客户端(电话):

代码语言:javascript
复制
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')

是什么导致了这个问题??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-04 20:25:20

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

然而,我怀疑这就是错误所在。为了给更多的读者提供详细信息:

如果你看一下客户端代码,他正在导入套接字模块并使用它-这与pybluez没有任何关系,这是错误的。

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

票数 0
EN

Stack Overflow用户

发布于 2014-01-29 16:53:53

我知道这是一年后,但我有另一个解决方案。在Debian的某些版本上(Raspbian等),可能还有其他一些发行版。默认情况下,server_sock.accept()只会挂起,永远不会接受连接-即使是来自配对设备的连接!然而,解决这个问题的方法非常简单。如果转到/etc/bluetooth/main.conf,有一行叫做Disable Plugins。添加一行或更改,使其如下所示:-

代码语言:javascript
复制
 DisablePlugins = pnat

然后重新启动蓝牙服务:

代码语言:javascript
复制
 sudo invoke–rc.d bluetooth restart

现在它可能已经修复了。

祝好运!

参考:RFCOMM without pairing using PyBluez on Debian?

票数 2
EN

Stack Overflow用户

发布于 2013-06-20 15:13:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12198198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档