2012-03-27 71 views
0

我已經在Android藍牙客戶端必須由RFCOMM連接到我的電腦,並使用UUID 00001101-0000-1000-8000-00805F9B34FB藍牙RFCOMM在電腦上工作,但不得不使用另一個

虛擬COM端口

使用PyBluez庫以及Python 2.6。我用下面的代碼從PyBluez Documentation

from bluetooth import * 

server_sock=BluetoothSocket(RFCOMM) 
server_sock.bind(("",PORT_ANY)) 
server_sock.listen(1) 

port = server_sock.getsockname()[1] 
uuid = "00001101-0000-1000-8000-00805F9B34FB" 
advertise_service(server_sock, "SampleServer", 
        service_id = uuid, 
        service_classes = [ uuid, SERIAL_PORT_CLASS ], 
        profiles = [ SERIAL_PORT_PROFILE ], 
        ) 

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"

這工作完全正常的Windows 7

下,但我有在Windows XP上的另一臺計算機沒有任何反應,也就是我的代碼停留在行「正在等待連接在RFCOMM頻道上「。不過,我的藍牙客戶端警告我它已連接。

此Windows XP計算機藍牙配置允許我爲藍牙串行通信設置COM端口。如果我在此配置的COM端口上偵聽,則可以從藍牙客戶端看到我的數據。

我更喜歡在任何Windows計算機上運行代碼,並且我不想在這些計算機上配置虛擬COM端口。所以我想上面的程序也與Windows XP電腦一起工作。

我怎麼錯過?就好像Windows XP計算機不會將藍牙數據轉發到我的程序,即使我禁用其在虛擬串行端口上再現數據的功能。 看來我使用的UUID是一個衆所周知的,但我必須使用這一個讓我的程序與另一個特定的平臺兼容。

Windows 7計算機上的藍牙堆棧來自Atheros Communications,Windows XP計算機上的藍牙堆棧來自Widcomm。

+0

聽起來像你的Windows驅動程序正在接管連接,並將其用於虛擬COM端口。您是否嘗試禁用(或卸載)Windows設備管理器中的虛擬COM端口/藍牙串行端口設備? – TJD 2012-03-27 18:59:20

+0

我有同樣的感覺。是的,我卸載了它,我甚至在我的藍牙管理器中刪除了虛擬端口服務功能,並重新啓動以防萬一:我仍然可以連接我的藍牙客戶端,但沒有任何反應。知道一些有趣的事情:如果啓用了虛擬端口並且啓動了我的程序,則藍牙客戶端無法連接(就好像驅動程序和我的程序有衝突一樣)。 – 2012-03-27 19:35:02

回答

0

安裝在XP上的Widcomm藍牙堆棧有自己的API和驅動程序;這個API與MS藍牙堆棧完全不兼容! (此外,您還需要XP SP2才能使用MS堆棧,並使用兼容的加密狗...我從來沒有找到過)

因此,在Win7上,您可以使用'套接字'與MS堆棧(甚至是Broadcom/Widcomm將工作,使用MS堆棧,而不是特定的API!) 在XP上,您需要使用另一個代碼,與Widcomm堆棧兼容... 您最終可以在XP上連接到虛擬COM上使用COMports。 ..但你會得到沒有通知從堆棧...

相關問題