0

我在 Android 上有一个蓝牙客户端,它必须通过 RFCOMM 连接到我的计算机并使用 UUID 00001101-0000-1000-8000-00805F9B34FB

使用 PyBluez 库以及 Python 2.6。我使用了PyBluez 文档中的以下代码

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 似乎是众所周知的,但我必须使用这个 UUID 才能使我的程序与另一个特定平台兼容。

Windows 7 计算机上的蓝牙堆栈来自 Atheros Communications,Windows XP 计算机上的蓝牙堆栈来自 Widcomm。

4

1 回答 1

0

XP 上安装的 Widcomm 蓝牙堆栈有自己的 API 和驱动程序;此 API 与 MS 蓝牙堆栈完全不兼容!(此外,您需要 XP SP2 才能使用 MS Stack,还需要兼容的加密狗……我从来没有找到过)

因此,在 Win7 上,您可以将“套接字”与 MS 堆栈一起使用(即使是 Broadcom/Widcomm 也可以使用,使用 MS 堆栈而不是特定的 API!)在 XP 上,您需要使用与 Widcomm 堆栈兼容的其他代码...您最终可以在 XP 上使用 COMports,连接到虚拟 COM...但是您不会从堆栈中收到任何通知...

于 2015-03-05T22:25:49.150 回答