2017-06-01 90 views
7

DeviceWatcherを使用して、UWPアプリケーションのペアのBluetoothデバイスにDeviceInformationを取得しています。 DeviceWatcher_Addedイベントハンドラは、私は、デバイスが、私はその名前をチェックして、それがRfcommServiceId.SerialPort.Uuidサービスを提供することに興味が1であるかどうかを確認するに呼び出されたとき、私はこのUWPで既知のBluetoothデバイスのCOMポート名を取得する

var requestedProperties = new string[] { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" }; 
var deviceWatcher = DeviceInformation.CreateWatcher("(System.Devices.Aep.ProtocolId:=\"{e0cbf06c-cd8b-4647-bb8a-263b43f0f974}\")", requestedProperties, DeviceInformationKind.AssociationEndpoint); // ClassGuid = {e0cbf06c-cd8b-4647-bb8a-263b43f0f974} includes all Bluetooth devices 
deviceWatcher.Added += DeviceWatcher_Added; 
deviceWatcher.Updated += DeviceWatcher_Updated; 
deviceWatcher.Start(); 

ようDeviceWatcherを設定します。

ブルートゥースデバイス用のDeviceInformationを取得したら、私はどのようにCOMポートを取得するのですか?私はそれが "標準的なSerial over Bluetooth link(COM8)"としてリストされているデバイスマネージャーで見ることができますが、UWPでプログラム的に "COM8"を取得する方法はわかりません。

私はその後、SerialDevice.PortName(C.F. this答えを)得ることができることによって、SerialDeviceにデバイス情報を作ってみたけどSerialDevice.FromIdAsync(deviceInfo.Id)に私の呼び出しはのSystem.Exceptionで失敗:データが無効です。 another question

(NB thisthisのようないくつかの食欲をそそるの答えは、Windows管理インストゥルメンWMI機能を使用しますが、これらはUWPでは使用できません。)

+0

?あなたは完全なコードを表示することができますこの例外: 'System.Exception:データは無効です'? –

+0

完全なコードはここにあります(https://github.com/dumbledad/BluetoothCOMGleaner) – dumbledad

+0

あなたはすでに 'deviceInfo.Name'を知っていますので、あなたはこれから' Id'を得ることができるのだろうか? (deviceInformation.FindAllAsync(SerialDevice.GetDeviceSelector())))。シングル(di => di.Name == deviceInfo.Name).Id' –

答えて

3

Ritaは私がへの道を参照してください助けたSerial UART sampleを見て提案しましたこれを行う。私は標準的な方法ではあまりにも間接的であると思われるので、これを答えとしてマークしません。

私のUWPアプリにペアリングされたBluetoothデバイス用のDeviceInformationがありますが、一致するようにSerialDeviceのリストも必要です。結果のコードは次のとおりです。あなたはdeviceInfo.Idは、お使いのデバイスのID(COM8)であることを確認するにはどうすればよい

public async Task<string> ComPort(DeviceInformation deviceInfo) 
{ 
    var serialDevices = new Dictionary<string, SerialDevice>(); 
    var serialSelector = SerialDevice.GetDeviceSelector(); 
    var serialDeviceInformations = (await DeviceInformation.FindAllAsync(serialSelector)).ToList(); 
    var hostNames = NetworkInformation.GetHostNames().Select(hostName => hostName.DisplayName.ToUpper()).ToList(); // So we can ignore inbuilt ports 
    foreach (var serialDeviceInformation in serialDeviceInformations) 
    { 
     if (hostNames.FirstOrDefault(hostName => hostName.StartsWith(serialDeviceInformation.Name.ToUpper())) == null) 
     { 
      try 
      { 
       var serialDevice = await SerialDevice.FromIdAsync(serialDeviceInformation.Id); 
       if (serialDevice != null) 
       { 
        serialDevices.Add(deviceInfo.Id, serialDevice); 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.ToString()); 
      } 
     } 
    } 
    // Example Bluetooth DeviceInfo.Id: "Bluetooth#Bluetooth9c:b6:d0:d6:d7:56-00:07:80:cb:56:6d" 
    // from device with Association Endpoint Address: "00:07:80:cb:56:6d" 
    var lengthOfTrailingAssociationEndpointAddresss = (2 * 6) + 5; 
    var bluetoothDeviceAddress = deviceInfo.Id.Substring(deviceInfo.Id.Length - lengthOfTrailingAssociationEndpointAddresss, lengthOfTrailingAssociationEndpointAddresss).Replace(":", "").ToUpper(); 
    var matchingKey = serialDevices.Keys.FirstOrDefault(id => id.Contains(bluetoothDeviceAddress)); 
    if (matchingKey != null) 
    { 
     return serialDevices[matchingKey].PortName; 
    } 
    return ""; 
} 
関連する問題