2017-04-23 15 views
6

Tôi đã nâng cấp lên Windows 10, phiên bản 1703 xây dựng 15063 (Bản cập nhật của người sáng tạo) phát hành chính thức. Khi tôi chạy đoạn mã sau trong một ứng dụng máy tính để bàn WPF, BluetoothLEDevice.FromBluetoothAddressAsync không bao giờ trả về.FromBluetoothAddressAsync không bao giờ trả về Bản cập nhật Windows 10 người sáng tạo trong Ứng dụng WPF

Mã này hoạt động tốt trước bản cập nhật Windows 10 của tôi (ví dụ: 1607 bản dựng trước 14393 trước đó). Mã này cũng hoạt động tốt nếu nó đang chạy như một UWP trong Win mới 10 1703.

BluetoothLEAdvertisementWatcher BleWatcher = null; 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    BleWatcher = new BluetoothLEAdvertisementWatcher 
    { 
      ScanningMode = BluetoothLEScanningMode.Active 
    }; 
    BleWatcher.Received += Watcher_Received; 
    BleWatcher.Start(); 
} 

private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, 
            BluetoothLEAdvertisementReceivedEventArgs args) 
{ 
     var device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress); 
     // never continues beyond this point above with my BTLE devices that previously worked 
} 

Tôi làm theo các hướng dẫn tại đây https://stackoverflow.com/a/37335251/3187714 để thiết lập ứng dụng máy tính để bàn WPF của tôi để sử dụng các API UWP.

Vấn đề còn tồi tệ hơn vì ứng dụng WPF hiện tại của tôi sẽ bị hỏng khi khách hàng bắt đầu nâng cấp lên Win 10 1703 vì exe hiện tại của tôi không còn hoạt động nữa.

Có ai khác đang gặp vấn đề này với bản cập nhật Windows 10 1703 trong exe máy tính để bàn (Non UWP) không?

Sau khi thử nghiệm hơn nữa, tôi đã tìm thấy nếu tôi thêm đối số thứ 2 BluetoothAddressType.Public tùy chọn để gọi FromBluetoothAddressAsync, chức năng trả lại, nhưng các thiết bị quay trở lại là null.

var device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress, BluetoothAddressType.Public); 
+0

Có, tôi có cùng một vấn đề.Điều này thực sự khó chịu vì các yêu cầu của dự án của chúng tôi loại trừ rõ ràng việc sử dụng UWP nhưng buộc sử dụng BLE. Làm việc với Microsoft API là một nỗi đau trong ass ... – Frank

+0

Quyền? thats thường là vấn đề với các công cụ như thế. Đôi khi nó không rõ ràng, có lẽ có một sự cho phép của các cửa sổ UWP Bluetooth khác nhau, so sánh các biểu hiện với một ứng dụng UWP với Bluetooth. –

Trả lời

3

Dường như có lỗi trong các chức năng bảo mật xung quanh API Bluetooth vào năm 15063 gây ra điều này (tôi thấy điều tương tự). Kiểm tra chủ đề này:

https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk#ef927009-676c-47bb-8201-8a80d2323a7f

tl; dr Đối với các ứng dụng C++, họ cung cấp một chức năng CoInitializeSecurity để gọi. Đối với những người khác, có vẻ như họ đang đề xuất tạo một AppId trong sổ đăng ký, vì P/Invoke không vui lắm.

Lạ lùng, mọi thứ đang hoạt động tốt cho tôi tại thời điểm này thông qua noble-uwp, sử dụng liên kết C++ cho các hàm UWP để truy cập qua node.js. Nó chỉ thông qua C# mà tôi đang gặp vấn đề, và mọi thứ thất bại tại các điểm khác nhau tùy thuộc vào việc tôi đang ở trong một ứng dụng UWP hay WPF/Console/Desktop.

Sau khi thêm AppId vào sổ đăng ký như được nêu trong bài đăng trên diễn đàn, mọi thứ đã hoạt động lại cho tôi.

0

thú vị, nó không làm việc trên các ứng dụng máy tính để bàn sử dụng cppwinrt:

Advertisement::BluetoothLEAdvertisementWatcher watcher; 

void Start() { 
    watcher.ScanningMode(Advertisement::BluetoothLEScanningMode::Active); 
    Windows::Foundation::TimeSpan timeout = std::chrono::seconds(2); 
    watcher.SignalStrengthFilter().OutOfRangeTimeout(timeout); 
    watcher.SignalStrengthFilter().OutOfRangeThresholdInDBm(-90); 

    watcher.Received([&](Advertisement::BluetoothLEAdvertisementWatcher watcher, Advertisement::BluetoothLEAdvertisementReceivedEventArgs eventArgs) { 
     connect(eventArgs.BluetoothAddress()); 
    }); 
    watcher.Start(); 
} 

Windows::Foundation::IAsyncAction connect(uint64_t uuid) { 
    co_await resume_background(); 
    BluetoothLEDevice device = co_await BluetoothLEDevice::FromBluetoothAddressAsync(uuid); 
    GenericAttributeProfile::GattDeviceServicesResult gatt = co_await device.GetGattServicesForUuidAsync(myServiceUUID); 
    // works fine! 
} 

Tuy nhiên, thông báo cho đặc GATT không làm việc cho tôi sau đó. I have filed a bug report với dự án cppwinrt, nhưng các nhà phát triển dường như không có khuynh hướng nhìn vào nó.

Tôi không biết API đó đang làm gì khác với phiên bản C# trên máy tính để bàn.

0

Nếu bạn muốn sử dụng giải pháp CoInitializeSecurity trong VB, đây là giải pháp pinvoke. Hãy nhớ hủy ghép nối/sửa chữa tất cả các thiết bị BLE của bạn!

Lưu ý rằng phải là điều nắm tay được thực thi trong mã của bạn. Lưu ý rằng đây KHÔNG phải là an toàn.

Public Enum RpcAuthnLevel 
    Default1 = 0 
    None = 1 
    Connect = 2 
    Call1 = 3 
    Pkt = 4 
    PktIntegrity = 5 
    PktPrivacy = 6 
End Enum 

Public Enum RpcImpLevel 
    Default1 = 0 
    Anonymous = 1 
    Identify = 2 
    Impersonate = 3 
    Delegate1 = 4 
End Enum 

Public Enum EoAuthnCap 
    None = &H0 
    MutualAuth = &H1 
    StaticCloaking = &H20 
    DynamicCloaking = &H40 
    AnyAuthority = &H80 
    MakeFullSIC = &H100 
    Default1 = &H800 
    SecureRefs = &H2 
    AccessControl = &H4 
    AppID = &H8 
    Dynamic = &H10 
    RequireFullSIC = &H200 
    AutoImpersonate = &H400 
    NoCustomMarshal = &H2000 
    DisableAAA = &H1000 
End Enum 

Declare Function CoInitializeSecurity Lib "ole32.dll" (pVoid As IntPtr, cAuthSvc As Integer, asAuthSvc As IntPtr, pReserved1 As IntPtr, dwAuthnLevel As Integer, dwImpLevel As Integer, pAuthList As IntPtr, dwCapabilities As Integer, pReserved3 As IntPtr) As Integer 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    CoInitializeSecurity(IntPtr.Zero, -1, IntPtr.Zero, IntPtr.Zero, RpcAuthnLevel.Default1, RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero) 
    'Other code 
End Sub 
Các vấn đề liên quan