

ユーザーにCOMポートで接続されたデバイスを選択してもらう際、COM15のような表記ではなく、  
デバイス名を表示させたい。 下記のコードでシリアルポートに接続されたデバイスの名前をWMIによって取得できますが、
Bluetoothで接続されたデバイスの場合、  
「Bluetooth リンク経由の標準シリアル (COMxx)」となり、デバイス名が取得できません。  
Bluetoothで接続されたデバイスの名前を取得することは、方法などありましたら、教えて下さい。

[code]

    // using System.Management;
    using (var device = new ManagementClass( "Win32_SerialPort" )) {
        foreach( ManagementObject port in device.GetInstances() ) {
            var name = port.GetPropertyValue( "Name" ) as string;
            Console.WriteLine( name );
        }
    }
    
[/code]

開発環境: Windows 7 、C# 6.0 .NET 4.5.1


CC BY-SA 3.0
2014-12-21T10:36:34.683
2321
2021-05-02T11:59:51.680
2014-12-21T14:29:37.953
728
2207
question
windows c# .net
Bluetoothで接続されたシリアルポートのデバイス名を取得したい


[32feet.NET](https://github.com/inthehand/32feet)を使うと簡単に取得できそうです。

nugetから32feet.NETで検索して`32feet.NET Personal Area Networking for
.NET`の方をインストールします。

ボタンとリストボックスだけ配置したWindows Form
アプリケーションで以下の様なコードで取得できるようです…が、そういえば私のマシンはbluetoothオフにしてるので何も取れませんでした（エラーにはなりませんでした）。  
(なのでポートとどう紐づけるのかはわかりませんでした。DeviceAddressは取れるみたいですが）

[code]

    private void button1_Click(object sender, EventArgs e) {
    
        BluetoothClient client = new BluetoothClient();
        var devices = client.DiscoverDevicesInRange();
        foreach (BluetoothDeviceInfo d in devices) {
            listBox1.Items.Add(d.DeviceName);
        }
    }
    
[/code]

LicenceはGitHubの方にも書いてありますが、MIT Licenseです。

本家での [この質問(セルフ回答ですが)](https://stackoverflow.com/questions/25908734/get-name-
of-bluetooth-device-on-the-devices-and-printers-window) のほか、[イスラエルのMicrosoft
blog](https://web.archive.org/web/20200111222959/http://blogs.microsoft.co.il:80/shair/2009/06/21/working-
with-bluetooth-devices-using-c-part-1/)でも紹介されていました。


CC BY-SA 4.0
2014-12-21T14:53:35.177
2333
2021-05-02T11:59:51.680
2021-05-02T11:59:51.680
19110
728
2321
answer


DiscoverDevicesInRange()は検出可能な状態のデバイス、  
DiscoverDevices()は登録済みのデバイスの情報を取得するようです。

登録済みのデバイスの名称のみであれば、先の回答と同じコードにはなりますが  
以下で取得できました。

[code]

            foreach (BluetoothDeviceInfo d in new BluetoothClient().DiscoverDevices())
            {
                listBox1.Items.Add(d.DeviceName);
            }
    
[/code]


CC BY-SA 3.0
2015-02-03T16:59:10.590
5892
2015-02-03T16:59:10.590
7501
2321
answer


以下のようにすると、COMポートとの紐付けが可能です。  
グローバル変数 ArrayList bluetoothPriniterListに結果が保存されます。

ただし注意事項があります。  
スター精密のサーマルプリンタ（mC-Print3）をBluetooth接続した場合の例

[code]

    public void SearchPrinter(object theObj)
            {
                BluetoothDeviceInfo[] devices;
                using (BluetoothClient sdp = new BluetoothClient())
                    devices = sdp.DiscoverDevices();
    
                bluetoothPriniterList.Clear();
                foreach (BluetoothDeviceInfo deviceInfo in devices)
                {
    //                Console.WriteLine(string.Format("{0} ({1})", deviceInfo.DeviceName, deviceInfo.DeviceAddress));
    
                    if(deviceInfo.DeviceName.Contains("mC-Print3"))
                    {
                        bluetoothPriniterList.Add(deviceInfo.DeviceName+"|"+ deviceInfo.DeviceAddress.ToString());
                    }
                }
    
                ManagementObjectSearcher serialSearcher =
                    new ManagementObjectSearcher("root\\CIMV2",
                    "SELECT * FROM Win32_SerialPort");
                var query = from ManagementObject s in serialSearcher.Get()
                            select new { Name = s["Name"], DeviceID = s["DeviceID"], PNPDeviceID = s["PNPDeviceID"] }; // DeviceID -- > PNPDeviceID
    
                foreach (var port in query)
                {
                    Console.WriteLine("{0} - {1}", port.DeviceID, port.Name);
                    var pnpDeviceId = port.PNPDeviceID.ToString();
    
                    if (pnpDeviceId.Contains("BTHENUM"))
                    {
                        var bluetoothDeviceAddress = pnpDeviceId.Split('&')[4].Split('_')[0];
                        if (bluetoothDeviceAddress.Length == 12 && bluetoothDeviceAddress != "000000000000")
                        {
                            Console.WriteLine(" - Address: {0}", bluetoothDeviceAddress);
                        }else
                        {
    // 注意事項
    // スター精密のDeviceIDは、5番目の＆にBluetoothデバイスアドレスがありました。
    // DeviceIDの作成方法はベンダーによって異なるようです。
                            try
                            {
                                bluetoothDeviceAddress = pnpDeviceId.Split('&')[5].Split('_')[0];
                                if (bluetoothDeviceAddress.Length == 12 && bluetoothDeviceAddress != "000000000000")
                                {
                                    int cc = 0;
                                    foreach(string thePrinter in bluetoothPriniterList)
                                    {
                                        string myPrinterAddress = thePrinter.Split('|')[1];
                                        if (myPrinterAddress == bluetoothDeviceAddress)
                                            break;
    
                                        cc++;
                                    }
    
                                    if(cc < bluetoothPriniterList.Count)
                                    {
                                        bluetoothPriniterList[cc] = bluetoothPriniterList[cc] + "|" + port.Name;
                                        Console.WriteLine(" - myPrinter Info: {0}", bluetoothPriniterList[cc]);
                                    }
    
                                }
                            }
                            catch
                            {
                                continue;
                            }
                        }
                    }
                }
            }
    
[/code]


CC BY-SA 4.0
2019-12-24T02:42:55.933
61727
2019-12-24T02:49:15.393
2019-12-24T02:49:15.393
32986
15667
2321
answer