views:

1157

answers:

3

Hi!

My company developed a device that communicates with a PC via Bluetooth using a virtual COM port.

Now we need a user to pair a device with a PC (MS Windows OS) first and then enter it's com port number manually into our application(I bet 95% of users will fail on this taks).

So I'd like my application to present a user with a list of paired bluetooth devices (a list of their "friendly names") and after that I'd like to find out the selecded device's COM port number automatically.

How can I do it in c#? (a solution independent of installed bluetooth stack is appreciated).

Thanks in advance.

A: 

you can try using WMI and perhaps the project 32feet.NET - Personal Area Networking for .NET will help.

lsalamon
I tried WMI. I looked thoule the results of querying classes W23_SerialPort and W32_PnPItem bu I didn't find any useful information. As for v32feet - can it be use in commercial projects ?
lbownik
Yes, it's free library at http://32feet.net
lsalamon
+1  A: 

See my answer at http://stackoverflow.com/questions/2004730/widcomm-bluetooth-how-to-open-the-virtual-com for my understanding of the licence: using the binary version is free for commercial use. And, also that I'm maintainer of the library.

So a brief slight digression. I'm not a big fan of virtual COM ports. It always seems much easier to use a direct 'sockets' connection, rather than attempt to setup a COM port, and try to find what name it was created as (see below!), and then have to open a SerialPort to use it, and then if the connection is lost one doesn't know and have simply to keep retrying... With the library its so much easier to just to create and use that direct Bluetooth connection!

However you may want a solution to your current task at the moment. :-) So, use WMI to find the current COM ports in place and see if any of them are for your device. For example in PowerShell:

C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
...
...
DeviceID         : COM66
PNPDeviceID      : BTHENUM\{00001101-0000-1000-8000-00805F9B34FB}\7&1D80ECD3&0&00803A686519_C00000003

In that big long string one sees the address of the target device: 00803A686519. One can use WMI from .NET, run that query, filter the ones with "BTHENUM", and then parse out the address.

If you the do need to create a new Bluetooth virtual COM port, use 32feet.NET's BluetoothDeviceInfo.SetServiceState(BluetoothService.SerialPort) API. See the "Bluetooth Serial Ports" section in the User Guide e.g. at http://www.alanjmcf.me.uk/comms/bluetooth/32feet.NET%20--%20User%20Guide.html, and the class documentation in the release.

Unfortunately the native Win32 API we call does not tell what name of COM port it created! :-( So run the WMI query before and after the call to see what new name appeared (or use System.IO.Ports.SerialPort.GetPortNames as its simpler).

That's all specific to the Microsoft Bluetooth stack. I haven't investigated how other stacks behave in this regard. After a brief check Widcomm's serial ports appear in SerialPort.GetPortNames but not in the WMI query...

alanjmcf
I I could find out the friendly names of paired bluetooth devices I could match them with those com port numbers. Then I'd be satisfied :)
lbownik
A: 

So, to get the information about a remote device including its name, using 32feet.NET do:

BluetoothAddress addr = ... ...
BluetoothDeviceInfo info = new BluetoothDeviceInfo(addr);
string name = info.DeviceName;

If not using the library you'll have to P/Invoke Win32's BluetoothGetDeviceInfo.

alanjmcf
ok - but BluetoothGetDeviceInfo needs a radio handle ang BluetoothFindFirstRadio works only with Microsoft stack :(.I need stack independency.As far as I see stabel version of 32feet.NET supports olny Microsoft stack :(
lbownik
We support both MSFT and Widcomm; Widcomm from version 2.4 onward. 2.5 was released today and is stable. Only by my timidity was 2.4 called beta, it was good quality. :-,)You can pass NULL in most cases where the MSFT API asks for a radio handle -- we pass NULL to that function.BTW the WMI query above shows the MSFT ports only, I don't see any Widcomm ports in it at the moment -- but SerialPort.GetPortNames() does include the name of a Widcomm port...
alanjmcf