2012-08-30 102 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 –