2012-08-30 91 views
4

我试图在我的电脑和我的诺基亚E63之间建立一个RFCOMM客户端 - 服务器通信系统。我在PyBluez中使用Python来设置服务器,并使用PyS60在我的手机上对客户端进行编程。PyBluez不接受连接

但是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') 

是什么导致问题?

回答

0

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

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

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

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

0

有时服务器会弹出一个窗口并要求用户批准连接。如果你没有X服务器运行,那么你就没有机会看到对话窗口,连接被拒绝..! (已经花了半天时间在这个...... !!!)

+0

我硬编码的蓝牙适配器的MAC地址在我的代码。我决定不使用服务发现机制。我没有试图解决这个问题,我需要一个快速的解决方法。 – Utsav

2

我知道它一年后,但我有另一种解决方案。在某些版本的Debian(Raspbian等)以及其他一些发行版中。 server_sock.accept()默认会挂起,永远不会接受连接 - 即使是配对的设备!但是,解决这个问题非常简单。如果你去/etc/bluetooth/main.conf,有一行叫做Disable Plugins。添加行或更改,所以它看起来是这样的: -

DisablePlugins = pnat 

然后重启蓝牙服务: -

sudo invoke–rc.d bluetooth restart 

现在可能已被固定。

祝你好运!

参考:RFCOMM without pairing using PyBluez on Debian?

+0

嗨,invoke和-rc.d之间的空间不应该在那里,当我使用它时不起作用。然后,我跟着你包含的链接,使用OP发布的那个空间。有效。谢谢! – RoboCop87

+0

编辑,谢谢:) – user1840255

+1

非常好,这节省了我几个小时!在华硕USB-BT400蓝牙适配器上工作过Raspberry Pi –