Intereting Posts
.net Рефлектор декомпилированный код C # не будет компилироваться Как добавить изображение в PDF для каждой страницы? Как я могу расширить class LINQ-to-SQL без необходимости вносить изменения каждый раз, когда генерируется код? Как сохранить бинарную совместимость для сборки .NET, которая представляет COM-интерфейс? Шрифт очень уродливый C # добавить слой к изображению Создать полностью динамическое предложение where с деревом выражений и выполнить на IQueryable Где находится таблица tableClient.CreateTableIfNotExist в библиотеке AzureStorage v2? Почему эти параметры типового типа не могут быть выведены? Как реализовать шаблон dispose в c # при обертке COM-объекта Interop? Разница в значениях MeasureString и DrawString Почему я не могу перераспределить hashset Словарь с замком или Совместный словарь? Как настроить таргетинг на конкретную языковую версию с помощью CodeDOM? Как сериализовать объект для json с информацией о типе с помощью Newtonsoft.Json?

Интервал проверки BLE Windows 10

Есть ли способ отрегулировать интервал сканирования рекламы BLE в Windows 10 при использовании Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher ? При сканировании на Android я вижу рекламные объявления каждые 100 мс, но в Windows 10 с использованием C # я получаю только сообщение BluetoothLEAdvertisementWatcher.Received которое вызывается каждые 700 мс.

Наверное, нет.

Параметры сканирования жестко запрограммированы на интервал сканирования 118,125 мс и окно сканирования 18,125 мс.

Вот почему вы получаете только 1/7 всех пакетов (с 18.125 / 118.125 ~ 1/7).

Однако вы можете использовать DeviceIoControl для более низкого уровня. Вот пример. Вы должны запускать это параллельно с вашим BluetoothLEAdvertiseWatcher (например, BetterScanner.StartScanner(0, 29, 29) ). Кажется, Windows всегда выбирает «лучшие» параметры, если одновременно работают два сканера.

DeviceIoControl никогда не возвращается, поэтому я запускаю его в отдельном streamе. Если вам нужно отменить сканирование, вы должны использовать перекрытие io, чтобы иметь возможность выполнять CancelIoEx. Этот код не проверяет наличие ошибок, поэтому будьте осторожны.

 using System; using System.Runtime.InteropServices; using System.Threading; class BetterScanner { ///  /// The BLUETOOTH_FIND_RADIO_PARAMS structure facilitates enumerating installed Bluetooth radios. ///  [StructLayout(LayoutKind.Sequential)] private struct BLUETOOTH_FIND_RADIO_PARAM { internal UInt32 dwSize; internal void Initialize() { this.dwSize = (UInt32)Marshal.SizeOf(typeof(BLUETOOTH_FIND_RADIO_PARAM)); } } ///  /// Closes an open object handle. ///  /// [In] A valid handle to an open object. /// If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. [DllImport("Kernel32.dll", SetLastError = true)] static extern bool CloseHandle(IntPtr handle); ///  /// Finds the first bluetooth radio present in device manager ///  /// Pointer to a BLUETOOTH_FIND_RADIO_PARAMS structure /// Pointer to where the first enumerated radio handle will be returned. When no longer needed, this handle must be closed via CloseHandle. /// In addition to the handle indicated by phRadio, calling this function will also create a HBLUETOOTH_RADIO_FIND handle for use with the BluetoothFindNextRadio function. /// When this handle is no longer needed, it must be closed via the BluetoothFindRadioClose. /// Returns NULL upon failure. Call the GetLastError function for more information on the error. The following table describe common errors: [DllImport("irprops.cpl", SetLastError = true)] static extern IntPtr BluetoothFindFirstRadio(ref BLUETOOTH_FIND_RADIO_PARAM pbtfrp, out IntPtr phRadio); [StructLayout(LayoutKind.Sequential)] private struct LE_SCAN_REQUEST { internal int scanType; internal ushort scanInterval; internal ushort scanWindow; } [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)] static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, ref LE_SCAN_REQUEST lpInBuffer, uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped); ///  /// Starts scanning for LE devices. /// Example: BetterScanner.StartScanner(0, 29, 29) ///  /// 0 = Passive, 1 = Active /// Interval in 0.625 ms units /// Window in 0.625 ms units public static void StartScanner(int scanType, ushort scanInterval, ushort scanWindow) { var thread = new Thread(() => { BLUETOOTH_FIND_RADIO_PARAM param = new BLUETOOTH_FIND_RADIO_PARAM(); param.Initialize(); IntPtr handle; BluetoothFindFirstRadio(ref param, out handle); uint outsize; LE_SCAN_REQUEST req = new LE_SCAN_REQUEST { scanType = scanType, scanInterval = scanInterval, scanWindow = scanWindow }; DeviceIoControl(handle, 0x41118c, ref req, 8, IntPtr.Zero, 0, out outsize, IntPtr.Zero); }); thread.Start(); } } 

Может быть, если вы установите параметр SamplingInterval частоты SignalStrengthFilter, будет изменен. Попробуй это:

 BluetoothLEAdvertisementWatcher watcher=new BluetoothLEAdvertisementWatcher(); watcher.SignalStrengthFilter.SamplingInterval = 100; 

для Windows Universal App попробуйте изменить StartScanner следующим образом:

 public static void StartScanner(int scanType, ushort scanInterval, ushort scanWindow) { Action action = (object obj) => { BLUETOOTH_FIND_RADIO_PARAM param = new BLUETOOTH_FIND_RADIO_PARAM(); param.Initialize(); IntPtr handle; BluetoothFindFirstRadio(ref param, out handle); uint outsize; LE_SCAN_REQUEST req = new LE_SCAN_REQUEST { scanType = scanType, scanInterval = scanInterval, scanWindow = scanWindow }; DeviceIoControl(handle, 0x41118c, ref req, 8, IntPtr.Zero, 0, out outsize, IntPtr.Zero); }; Task task = new Task(action,"nothing"); task.Start(); }