2016-08-07 1 views
1

Ich versuche, eine BLE-Ankündigung Rückruf von einer .NET Windows-Desktop-Anwendung zu erhalten. Ich kann die APIs aufrufen, das Received-Ereignis wird jedoch nie vom Betriebssystem in einer WPF- oder Befehlszeilenanwendung aufgerufen. Ich erhalte Ereignisse, wenn der Code von einem Komponententest in VS2015 oder einer universellen Windows-App aufgerufen wird. Ich muss jedoch andere Dinge tun, die in Universal Windows nicht verfügbar sind. Hier ist der Code:Wie erhalten Sie einen BLE-Anzeigenrückruf in einer Desktop-.NET-App?

using Windows.Devices.Bluetooth.Advertisement; 
    public static void ScanForAdvertisments() 
    { 
     mWatcher = new BluetoothLEAdvertisementWatcher();   
     mWatcher.Received += OnAdvertismentReceived; 
     mWatcher.ScanningMode = BluetoothLEScanningMode.Active; 
     mWatcher.Start(); 
    } 

    public static void OnAdvertismentReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) 
    { 

     ulong address = args.BluetoothAddress; 
     short rssi = args.RawSignalStrengthInDBm; 
    } 
  • I Windows.winmd aufzunehmen, um die BLE/UWP-Namespaces verwiesen haben.
  • Ich verwende Framework-Version 4.6.1 auf Windows 10 Anniversary Edition, hatte ich das gleiche Problem auf der vorherigen Windows-Build als auch.
  • Mit einer UWP-App habe ich die DeviceCapability für Bluetooth im appxmanifest eingestellt. Das Unit-Test-Projekt scheint dies nicht zu erfordern und ich bin mir nicht sicher, wie man appxmanifests auf Desktop-Projekte anwenden kann.
  • Die status -Eigenschaft meldet, dass der Scanner ausgeführt wird und das angehaltene Ereignis auch nie ausgelöst wird.

Wie auch immer, ist das ein Windows-Bug? Gibt es einen Weg, um es zu umgehen? Ich habe versucht, in App-Dienste zu schauen, aber sie scheinen nicht so eingerichtet zu sein, dass sie sehr gut in den Desktop-Code eingreifen, und das Aufrufen von Desktop-Code aus UWP scheint komplex zu sein. Vielen Dank.

Antwort

1

Probieren Sie dies mit einer Console .NET 4.6.1 App aus und der Callback für die Ankündigung kommt durch. Ich habe vor kurzem eine GitHub Sample geschrieben, die helfen könnte. Der Schlüssel für das Erhalten WinRT APIs arbeiten, sind zwei Referenzen:

Um die WinRT-APIs zu verwenden, fügen Sie zwei Referenzen:

  1. C: \ Program Files (x86) \ Windows-Kits \ 10 \ UnionMetadata \ Windows.winmd

  2. C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETCore \ v4.5 \ System.Runtime.WindowsRuntime.dll

Es klingt, als ob Ihnen die zweite Referenz fehlt. Ich konnte das v4.5 .NetCore-Framework mit 4.6.1 verwenden.

+0

Danke Carter, das war hilfreich. Zuallererst ist der zweite Verweis nicht unbedingt notwendig, um das Ereignis zu empfangen, und als ich alle Verweise auf System.Runtime.WindowsRuntime.dll entfernte, begann das Befehlszeilenprogramm zu arbeiten. Die .dll ist notwendig, um auf IBuffer und ähnliches zugreifen zu können. Als ich es wieder hinzufügte, funktionierte es zunächst nicht, und ich bekam eine Reihe von Fehlern (schlechtes Bildformat, Datei nicht gefunden, nicht übereinstimmendes Manifest) mit den verschiedenen Konfigurationen/Versionen (copylocal, v4.5.1 usw.) . Wie auch immer, ich habe es letztendlich wie empfohlen funktionieren lassen. Nicht sicher, warum es anfangs nur im Unit-Test funktionierte. –

Verwandte Themen