BluetoothLEAdvertWatcher не возвращает UUID данных службы - PullRequest
0 голосов
/ 22 ноября 2018

Я пишу приложение UWP, я использую метод BluetoothLEAdvertisingWatcher для захвата рекламы с BLE-устройств вокруг.Это все работает нормально, и я могу создать список устройств, захватив BluetoothLEAdvertiseReceivedEventArgs ..... как показано ниже

private async void LockerAdv_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{

    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => 
    {
        ServiceUuidsFound += args.Advertisement.ServiceUuids.Count;

        Adverts.Add(args);

Однако я хочу захватить UUID ServiceData, переносимых в рекламных данных (в нашем случае0x180f для сервисных данных батареи и 0xb991 для наших собственных сервисных данных).

Если я фиксирую рекламу и проверяю Advertising.ServiceUuids.Count, как показано выше, счетчик всегда равен нулю, хотя я знаю, что есть два ServiceDataПрисутствующие UUID и приложения, такие как приложение Nordic nRF, находят их и отображают.

Кроме того, если я использую отладчик, чтобы остановить выполнение и исследовать объект Advertising.ServiceUuids, то они, по-видимому, не были захвачены и, безусловно, недоступны.как видно ниже: Ссылка на скриншот .

Я пытался использовать

ScanningMode = BluetoothLEScanningMode.Active; 

и

ScanningMode = BluetoothLEScanningMode.Passive; 

, и это не имеет значения.

В конечном итоге я хочу получить ServiceData из рекламных данных.а поскольку он содержит полезные данные для нашего приложения, но если Windows даже не сообщит о существовании идентификаторов UUID, то я уверен, что не могу получить данные, связанные с ним !!

Итак, что мне нужнознаете, я что-то делаю не так?это ограничение Windows 10 (я использую самую последнюю версию)?или это может быть проблема с Dell Optiflex, который я использую?

Любая помощь будет с благодарностью получена

1 Ответ

0 голосов
/ 22 ноября 2018

Вы делаете не так, как надо.Отладчик и часы просто не позволяют копать глубже и не показывать нативное представление.Сначала поместите нужные вам элементы в список, и после этого вы сможете узнать, содержат ли списки элементы и даже другие коллекции с большим количеством элементов.Ниже приведен пример, который показывает вам, как.Я думаю, что это не охватывает все предметы, это зависит от вас:

    private async void OnAdvertisementReceivedAsync(BluetoothLEAdvertisementWatcher watcher,
                                               BluetoothLEAdvertisementReceivedEventArgs eventArgs)
    {
        //we have to stop the watcher to get the data from one advertising device only.           
        var device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);
        if (device != null)
        /* Check all advertisement items for null!
         * Not all of them are present!
         * Null check is not done in this example!*/
        {
            var TimeStamp = eventArgs.Timestamp.DateTime;
            var LocalName = eventArgs.Advertisement.LocalName;
            var Name = device.Name;
            var BleAdress = eventArgs.BluetoothAddress;//ulong
            var Rssi = eventArgs.RawSignalStrengthInDBm.ToString();
            var ConnectionStatus = device.ConnectionStatus;
            var Access = device.DeviceAccessInformation.CurrentStatus;
            /* Shows advertising flags:
                  LimitedDiscoverableMode = 1,
                  GeneralDiscoverableMode = 2,
                  ClassicNotSupported = 4,
                  DualModeControllerCapable = 8,
                  DualModeHostCapable = 16.
             */
            var flags = eventArgs.Advertisement.Flags.ToString();
            var AdvNumberOfDataSections = eventArgs.Advertisement.DataSections.Count;
            /*AdvDataSections contains the advertisement data */
            List<BluetoothLEAdvertisementDataSection> AdvDataSections = new List<BluetoothLEAdvertisementDataSection>();
            foreach (var item in eventArgs.Advertisement.DataSections)
            {
                AdvDataSections.Add(item);
            }
            List<BluetoothLEManufacturerData> AdvManufacturerData = new List<BluetoothLEManufacturerData>();
            foreach (var item in eventArgs.Advertisement.ManufacturerData)
            {
                AdvManufacturerData.Add(item);
            }
            List<GattDeviceService> ServicesList = new List<GattDeviceService>();
            var services = await device.GetGattServicesAsync(BluetoothCacheMode.Uncached);
            if (services != null)
            {
                foreach (var item in services.Services)
                {
                    ServicesList.Add(item);
                }
            }
        }
      /* Start the watcher again to get other devices or missing services or data */
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...