I discovered the pybluez project that brings bluetooth connectivity to Python today. It’s been around for a while and is compatible with both Windows (running XP) and Linux (running the bluez stack).
I installed it using the ready made windows installer and it ran first time. It’s very simple and easy to use.
I tweaked the example inquiry.py file by Albert Huang and set it up to show all the services on nearby devices.
Here’s the code…
import bluetooth
print "looking for nearby devices..."
nearby_devices = bluetooth.discover_devices(lookup_names = True, flush_cache = True, duration = 20)
print "found %d devices" % len(nearby_devices)
for addr, name in nearby_devices:
print " %s - %s" % (addr, name)
for services in bluetooth.find_service(address = addr):
print " Name: %s" % (services["name"])
print " Description: %s" % (services["description"])
print " Protocol: %s" % (services["protocol"])
print " Provider: %s" % (services["provider"])
print " Port: %s" % (services["port"])
print " Service id: %s" % (services["service-id"])
print ""
print ""
Here’s a quick run through of the code.
Firstly we need to import the bluetooth class to give us access to all that lovely bluetooth functionality.
We now look for nearby devices using bluetooth.discover_devices
. I’m adding a few parameters as well. lookup_names
is set to True
so we can get the devices names instead of the just their addresses, and flush_cache
is also set to True
to make sure we always look for fresh information. Finally we set duration
to 20, meaning we look for devices for up to 20 seconds. This is a bit excessive, but useful when testing.
We should have a list of devices now, assuming some were found, so we now loop over them.
We print out the name and address then look for services offered by the device by calling the bluetooth.find_service
method and passing in the device’s address.
This returns a list of dictionaries describing the services available. We iterate over this and print out details.
That’s the code, now here’s a few results. I ran this on the train home and discovered 7 active bluetooth devices offereing a variety of services. I won’t bore you with them all, so here’s the entry for my Nokia N93.
Perl - 00:16:BC:30:D8:76 Name: AVRCP Target Description: Audio Video Remote Control Protocol: L2CAP Provider: Symbian Software Ltd. Port: 23 Service id: None Name: Hands-Free Audio Gateway Description: Protocol: RFCOMM Provider: None Port: 28 Service id: None Name: Headset Audio Gateway Description: Protocol: RFCOMM Provider: None Port: 29 Service id: None Name: SyncMLClient Description: Protocol: RFCOMM Provider: None Port: 10 Service id: None Name: OBEX File Transfer Description: Protocol: RFCOMM Provider: None Port: 11 Service id: None Name: Nokia OBEX PC Suite Services Description: Protocol: RFCOMM Provider: None Port: 12 Service id: None Name: SyncML DM Client Description: Protocol: RFCOMM Provider: None Port: 13 Service id: None Name: Nokia SyncML Server Description: Protocol: RFCOMM Provider: None Port: 14 Service id: None Name: OBEX Object Push Description: Protocol: RFCOMM Provider: None Port: 9 Service id: None Name: Dial-Up Networking Description: Protocol: RFCOMM Provider: None Port: 2 Service id: None Name: Imaging Description: Protocol: RFCOMM Provider: None Port: 15 Service id: None
As you can see it offers a lot of interesting services, but two have caught my eye and call for a bit more investigation later.
Firstly there is the Imaging service on port 15. I wonder what that does? Does it take input from a remote camera?
Secondly there is AVRCP Target the Audio Visual Remote Control Target from Symbian. I wonder if this means I can use a seperate bluetooth device to control my Nokia N93 when it’s playing back video?
A quick google reveals a (confidential?) specification document for AVRCP…