2017-06-01 23 views
7

Korzystam z DeviceWatcher, aby uzyskać DeviceInformation dla sparowanego urządzenia Bluetooth w aplikacji UWP. Ustawić DeviceWatcher się jak toUzyskiwanie nazwy portu COM znanego urządzenia Bluetooth w urządzeniu UWP

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(); 

Gdy obsługi zdarzeń DeviceWatcher_Added nazywa I sprawdzić, czy urządzenie jest jednym Jestem zainteresowany zaznaczając jego nazwę i to, że oferuje usługę RfcommServiceId.SerialPort.Uuid.

Kiedy mam DeviceInformation dla urządzenia Bluetooth, jestem zainteresowany, w jaki sposób mogę uzyskać dla niego port COM? Widzę to w Menedżerze urządzeń, gdzie jest wymienione jako "Standardowe łącze szeregowe przez Bluetooth (COM8)", ale nie widzę, jak programowo uzyskać "COM8" w UWP.

Próbowałem dokonywania DeviceInformation w SerialDevice, dzięki czemu mogłem wtedy dostać SerialDevice.PortName (por this odpowiedź), ale moje wezwanie do SerialDevice.FromIdAsync(deviceInfo.Id) nie z System.Exception: Dane jest nieprawidłowy.

(NB Niektóre kuszących odpowiedzi, jak this i this, korzystać z funkcji zarządzania Windows Intrumentation WMI ale nie są one dostępne w UWP).

+0

Jak upewnić się, że deviceInfo.Id jest id Twojego urządzenia (COM8)? Czy możesz pokazać pełny kod zrobić ten wyjątek: 'System.Exception: dane są nieprawidłowe'? –

+0

Pełny kod jest [tutaj] (https://github.com/dumbledad/BluetoothCOMGleaner) – dumbledad

+0

Biorąc pod uwagę, że znasz już 'deviceInfo.Name', zastanawiasz się, czy możesz uzyskać" Id "z tego? '(czekać na DeviceInformation.FindAllAsync (SerialDevice.GetDeviceSelector())) Single (di => di.Name == deviceInfo.Name) .Id' –

Odpowiedz

3

Na another questionRita zaproponował patrząc na Serial UART sample który pomógł mi zobaczyć drogę do Zrób to. Nie będę nazywać tego jako odpowiedź na chwilę, ponieważ wydaje się zbyt pośrednia, by być kanoniczną.

Chociaż mam DeviceInformation dla sparowanego urządzenia Bluetooth w mojej aplikacji UWP, potrzebuję również listy SerialDevice s, aby móc je dopasować. Oto wynikowy kod.

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 ""; 
} 
Powiązane problemy