2017-01-24 5 views
1

Всякий раз, когда я запускаю приложение BluetoothLEAdvertisementWatcher из приложения UWP, его статус прерывается. Использование такой же функциональности в консольном приложении без проблем (требуемые библиотеки включены). Когда я хочу соединиться с устройством BLE, я использую DeviceWatcher из приложения UWP без проблем. OS - Win10, а используется VS2015.Статус рекламы UWP BLE отменен

Чтобы ilustrate проблему, я сделал UWP проект с Bluetooth включен в возможности:

<Capabilities> 
    <Capability Name="internetClient" /> 
    <DeviceCapability Name="bluetooth" /> 
    </Capabilities> 

Есть кнопки Пуск, Стоп и вид, и TextBlock используется для отображения состояния BluetoothLEAdvertisementWatcher на MainPage. Код:

public sealed partial class MainPage : Page 
    { 
     private BluetoothLEAdvertisementWatcher watcher = null; 

     public MainPage() 
     { 
      this.InitializeComponent(); 

      watcher = new BluetoothLEAdvertisementWatcher(); 
      watcher.ScanningMode = BluetoothLEScanningMode.Active; 

      textBlock.Text = watcher.Status.ToString(); 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      watcher.Received += OnAdvertisementReceived; 

      watcher.Stopped += OnAdvertisementWatcherStopped; 
     } 


     private void StopButton_Click(object sender, RoutedEventArgs e) 
     { 
      watcher.Stop(); 
     } 

     private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs) 
     { 

      await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
      { 
       textBlock.Text = "rcvd" + watcher.Status.ToString(); 
      }); 
     } 

     private async void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementWatcherStoppedEventArgs eventArgs) 
     { 
      // Notify the user that the watcher was stopped 
      await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
      { 
       textBlock.Text = "stopped:" + watcher.Status.ToString(); 
      }); 
     } 

     private void buttonStart_Click(object sender, RoutedEventArgs e) 
     { 
      watcher.Start(); 
      textBlock.Text = watcher.Status.ToString(); 
     } 
     private void buttonStop_Click(object sender, RoutedEventArgs e) 
     { 
      watcher.Stop(); 
      textBlock.Text = watcher.Status.ToString(); 
     } 

     private void buttonView_Click(object sender, RoutedEventArgs e) 
     { 
      textBlock.Text = watcher.Status.ToString(); 
     } 
    } 

При запуске программы создается статус BluetoothLEAdvertisementWatcher. После нажатия кнопки «Пуск» запускается наблюдатель, но статус отменяется, и инициируется событие OnAdvertisementWatcherStopped (статус по-прежнему отменен).

Есть ли какие-либо предложения по преодолению этой проблемы? Или что-то, что можно сделать дополнительно, чтобы прояснить проблему?

ОБНОВЛЕНИЕ

приложение выполняется на другом ноутбуке. Результат тот же, поэтому это не аппаратная проблема.

Есть две рекомендации по сети:

  1. , чтобы включить Bluetooth (это предложено в первом ответе Дмитрий)

  2. проверить возможности ( https://keyoti.com/blog/bluetooth-low-energy-in-windows-10-troubleshooting-capabilities/)

Отсутствие предоставленного результата.

Дополнительное примечание: при регистрации события для Stopped удаляется (// watcher.Stopped + = OnAdvertisementWatcherStopped;) первый результат запущен. Следующий щелчок на кнопке View отобразит Aborted. За короткий промежуток времени результат будет действительным.

Любое предложение настроек конфигурации?

ответ

1

Я думаю, вам нужно попытаться включить Bluetooth на устройстве, получив статус «Прервано».

Я добавил метод LaunchBluetoothSettingsAsync() для этого. Он вызывается, когда OnAdvertisementWatcherStopped запускается со статусом, прерванным.

public sealed partial class MainPage : Page 
{ 

    private BluetoothLEAdvertisementWatcher watcher = null; 
    private IAsyncOperation<IUICommand> _bluetoothNotOnDialogOperation; 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     watcher = new BluetoothLEAdvertisementWatcher(); 
     watcher.ScanningMode = BluetoothLEScanningMode.Active; 

     textBlock.Text = watcher.Status.ToString(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     watcher.Received += OnAdvertisementReceived; 

     watcher.Stopped += OnAdvertisementWatcherStopped; 
    } 


    private void StopButton_Click(object sender, RoutedEventArgs e) 
    { 
     watcher.Stop(); 
    } 

    private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs) 
    { 

     await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
     { 
      textBlock.Text = "rcvd" + watcher.Status.ToString(); 
     }); 
    } 

    private async void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementWatcherStoppedEventArgs eventArgs) 
    { 
     if (watcher .Status == BluetoothLEAdvertisementWatcherStatus.Aborted && _bluetoothNotOnDialogOperation == null) 
     { 
      MessageDialog messageDialog = new MessageDialog(
       "Do you wish to enable Bluetooth on this device?", 
       "Failed to start Bluetooth LE advertisement watcher"); 

      messageDialog.Commands.Add(new UICommand("Yes", 
       async command => { await LaunchBluetoothSettingsAsync(); })); 

      messageDialog.Commands.Add(new UICommand("No", 
       command => { watcher.Stop(); })); 

      _bluetoothNotOnDialogOperation = messageDialog.ShowAsync(); 
     } 
    } 

    private void buttonStart_Click(object sender, RoutedEventArgs e) 
    { 
     watcher.Start(); 
     textBlock.Text = watcher.Status.ToString(); 
    } 
    private void buttonStop_Click(object sender, RoutedEventArgs e) 
    { 
     watcher.Stop(); 
     textBlock.Text = watcher.Status.ToString(); 
    } 

    private void buttonView_Click(object sender, RoutedEventArgs e) 
    { 
     textBlock.Text = watcher.Status.ToString(); 
    } 

    private async Task LaunchBluetoothSettingsAsync() 
    { 
     await Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:")); 
    } 
} 
+0

Спасибо, Дмитрий за усилия. – procrustes

+0

У меня есть эта проблема на ноутбуке Dell (Bluetooth поддерживается на ноутбуке), который используется для разработки.После запуска измененного приложения настройки Bluetooth открываются, и у меня есть информация о том, что Bluetooth запущен. Я упомянул, что создал класс с BluetoothLEAdvertiseWatcher, который теперь является частью другого консольного приложения, которое успешно сканирует устройства BLE (на том же ноутбуке). Если предоставленная вами программа работает правильно в вашем окружении, тогда я сделал какую-то грубую ошибку ... или это аппаратная проблема. – procrustes

1

Эта тема помогла мне.

https://social.msdn.microsoft.com/Forums/windowshardware/en-US/5351a1f0-92f3-498b-a0c1-805d568cb55c/when-uwp-ble-advertising-watcher-is-started-its-status-is-aborted?forum=wdk

Решение было включить "синхронизацию с устройствами" разрешение (Settings-> Privacy-> Другие устройства) для UWP приложения.

+0

Это было решением моей проблемы. Я надеюсь, что документация будет обновлена, потому что я больше нигде не нашел эту рекомендацию. – procrustes