python - Bluetooth RFCOMM arbejder på en computer, men tvunget til at bruge virtuel COM-port på en anden

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Bluetooth-klient på Android, der skal oprette forbindelse til min computer af RFCOMM og bruge UUID 00001101-0000-1000-8000-00805F9B34FB


PyBluez biblioteket bruges, såvel som Python 2.6. Jeg brugte følgende kode fra PyBluez-dokumentationen [2]


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"


Det virker perfekt fint under Windows 7.


Men jeg har ingen reaktion med en anden computer på Windows XP, dvs. min kode forbliver på linjen 'Venter på forbindelse på RFCOMM-kanal'. Min Bluetooth-klient advarer mig om, at den er tilsluttet.


Denne Windows XP-computer Bluetooth-konfiguration tillader mig at oprette en COM-port til seriel kommunikation med Bluetooth. Hvis jeg lytter på denne konfigurerede COM-port, kan jeg se mine data fra Bluetooth-klienten.


Jeg foretrækker at have en kode, der arbejder på enhver Windows-computer, og jeg ønsker ikke at konfigurere virtuel COM-port på disse computere. Så jeg vil gerne, at ovenstående program også arbejder med Windows XP-computeren.


Hvad savner jeg? Det er som om Windows XP-computeren ikke videresender Bluetooth-data til mit program, selvom jeg deaktiverer dens evne til at gengive data på en virtuel seriel port.
Det ser ud til, at UUID jeg bruger er velkendt, men jeg skal bruge denne til at få mit program kompatibelt med en anden specifik platform.


Bluetooth-stakken på Windows 7-computeren er fra Atheros Communications, den ene på Windows XP-computeren er fra Widcomm.

Bedste reference


Widcomm Bluetooth-stakken installeret på din XP har sin egen API og driver; Denne API er fuldstændig uforenelig med MS Bluetooth-stakken! (du skal også bruge XP SP2 til at bruge MS Stack, med en kompatibel dongle også ... Jeg har aldrig fundet en)


Så på Win7 kan du bruge 'sockets' med MS Stack (selv en Broadcom/Widcomm vil fungere, ved hjælp af MS stacken og ikke den specifikke API!)
På XP skal du bruge en anden kode, kompatibel med Widcomm-stakken ...
Du kan i sidste ende bruge COMports på XP, der er forbundet til de virtuelle COM'er ... men du får ingen besked fra stakken ...