BluetoothLEAdvertisementWatcher not returning Service data UUIDs












1















I am writing a UWP application, I am using the BluetoothLEAdvertisementWatcher method to capture advertising from BLE devices around. This all works fine and I can build a list of devices by capturing the BluetoothLEAdvertisementReceivedEventArgs..... like below



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);


However, I want to capture the ServiceData UUIDs carried in the advertising data (in our case 0x180f for the battery service data and 0xb991 for our own service data).



If I capture the advertising and examine the Advertisement.ServiceUuids.Count as shown above the count is always zero even though I know there are two ServiceData UUIDs present and Apps like the Nordic nRF app finds them and displays them.



Also, if I use the debugger to stop execution and examine the Advertisement.ServiceUuids then they appear not to have been captured and are certainly not accessible as can be seen below:
Link to screenshot.



I have tried using



ScanningMode = BluetoothLEScanningMode.Active; 


and



ScanningMode = BluetoothLEScanningMode.Passive; 


and it makes no difference.



Ultimately what I want is to be able to extract the ServiceData from the advertising data as it contains useful data for our application but if Windows won't even report the existence of the UUIDs then I am certain I can't get the data associated with it!!



So, what I need to know is it me doing something wrong? is it a limitation of Windows 10 (I am using the very latest version)? or is it perhaps an issue with the Dell Optiflex I am using?



Any help would be gratefully received










share|improve this question



























    1















    I am writing a UWP application, I am using the BluetoothLEAdvertisementWatcher method to capture advertising from BLE devices around. This all works fine and I can build a list of devices by capturing the BluetoothLEAdvertisementReceivedEventArgs..... like below



    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);


    However, I want to capture the ServiceData UUIDs carried in the advertising data (in our case 0x180f for the battery service data and 0xb991 for our own service data).



    If I capture the advertising and examine the Advertisement.ServiceUuids.Count as shown above the count is always zero even though I know there are two ServiceData UUIDs present and Apps like the Nordic nRF app finds them and displays them.



    Also, if I use the debugger to stop execution and examine the Advertisement.ServiceUuids then they appear not to have been captured and are certainly not accessible as can be seen below:
    Link to screenshot.



    I have tried using



    ScanningMode = BluetoothLEScanningMode.Active; 


    and



    ScanningMode = BluetoothLEScanningMode.Passive; 


    and it makes no difference.



    Ultimately what I want is to be able to extract the ServiceData from the advertising data as it contains useful data for our application but if Windows won't even report the existence of the UUIDs then I am certain I can't get the data associated with it!!



    So, what I need to know is it me doing something wrong? is it a limitation of Windows 10 (I am using the very latest version)? or is it perhaps an issue with the Dell Optiflex I am using?



    Any help would be gratefully received










    share|improve this question

























      1












      1








      1








      I am writing a UWP application, I am using the BluetoothLEAdvertisementWatcher method to capture advertising from BLE devices around. This all works fine and I can build a list of devices by capturing the BluetoothLEAdvertisementReceivedEventArgs..... like below



      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);


      However, I want to capture the ServiceData UUIDs carried in the advertising data (in our case 0x180f for the battery service data and 0xb991 for our own service data).



      If I capture the advertising and examine the Advertisement.ServiceUuids.Count as shown above the count is always zero even though I know there are two ServiceData UUIDs present and Apps like the Nordic nRF app finds them and displays them.



      Also, if I use the debugger to stop execution and examine the Advertisement.ServiceUuids then they appear not to have been captured and are certainly not accessible as can be seen below:
      Link to screenshot.



      I have tried using



      ScanningMode = BluetoothLEScanningMode.Active; 


      and



      ScanningMode = BluetoothLEScanningMode.Passive; 


      and it makes no difference.



      Ultimately what I want is to be able to extract the ServiceData from the advertising data as it contains useful data for our application but if Windows won't even report the existence of the UUIDs then I am certain I can't get the data associated with it!!



      So, what I need to know is it me doing something wrong? is it a limitation of Windows 10 (I am using the very latest version)? or is it perhaps an issue with the Dell Optiflex I am using?



      Any help would be gratefully received










      share|improve this question














      I am writing a UWP application, I am using the BluetoothLEAdvertisementWatcher method to capture advertising from BLE devices around. This all works fine and I can build a list of devices by capturing the BluetoothLEAdvertisementReceivedEventArgs..... like below



      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);


      However, I want to capture the ServiceData UUIDs carried in the advertising data (in our case 0x180f for the battery service data and 0xb991 for our own service data).



      If I capture the advertising and examine the Advertisement.ServiceUuids.Count as shown above the count is always zero even though I know there are two ServiceData UUIDs present and Apps like the Nordic nRF app finds them and displays them.



      Also, if I use the debugger to stop execution and examine the Advertisement.ServiceUuids then they appear not to have been captured and are certainly not accessible as can be seen below:
      Link to screenshot.



      I have tried using



      ScanningMode = BluetoothLEScanningMode.Active; 


      and



      ScanningMode = BluetoothLEScanningMode.Passive; 


      and it makes no difference.



      Ultimately what I want is to be able to extract the ServiceData from the advertising data as it contains useful data for our application but if Windows won't even report the existence of the UUIDs then I am certain I can't get the data associated with it!!



      So, what I need to know is it me doing something wrong? is it a limitation of Windows 10 (I am using the very latest version)? or is it perhaps an issue with the Dell Optiflex I am using?



      Any help would be gratefully received







      bluetooth-lowenergy






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 '18 at 16:18









      WhiffyWhiffy

      83




      83
























          1 Answer
          1






          active

          oldest

          votes


















          0














          You are doing noting wrong. The debugger and watch just don't let you dig down deeper and show no native view.
          Put the items you need in a list first and after that you can find out if the lists contain the items and even other collections with more items.
          below is an example that shows you how. I think it does not cover all items, thats up to you:



              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 */
          }





          share|improve this answer
























          • Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

            – Whiffy
            Nov 23 '18 at 14:21













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53434901%2fbluetoothleadvertisementwatcher-not-returning-service-data-uuids%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          You are doing noting wrong. The debugger and watch just don't let you dig down deeper and show no native view.
          Put the items you need in a list first and after that you can find out if the lists contain the items and even other collections with more items.
          below is an example that shows you how. I think it does not cover all items, thats up to you:



              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 */
          }





          share|improve this answer
























          • Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

            – Whiffy
            Nov 23 '18 at 14:21


















          0














          You are doing noting wrong. The debugger and watch just don't let you dig down deeper and show no native view.
          Put the items you need in a list first and after that you can find out if the lists contain the items and even other collections with more items.
          below is an example that shows you how. I think it does not cover all items, thats up to you:



              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 */
          }





          share|improve this answer
























          • Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

            – Whiffy
            Nov 23 '18 at 14:21
















          0












          0








          0







          You are doing noting wrong. The debugger and watch just don't let you dig down deeper and show no native view.
          Put the items you need in a list first and after that you can find out if the lists contain the items and even other collections with more items.
          below is an example that shows you how. I think it does not cover all items, thats up to you:



              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 */
          }





          share|improve this answer













          You are doing noting wrong. The debugger and watch just don't let you dig down deeper and show no native view.
          Put the items you need in a list first and after that you can find out if the lists contain the items and even other collections with more items.
          below is an example that shows you how. I think it does not cover all items, thats up to you:



              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 */
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 '18 at 18:47









          GrooverFromHollandGrooverFromHolland

          514169




          514169













          • Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

            – Whiffy
            Nov 23 '18 at 14:21





















          • Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

            – Whiffy
            Nov 23 '18 at 14:21



















          Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

          – Whiffy
          Nov 23 '18 at 14:21







          Excellent, thanks for your help. I am glad it wasn't something I was doing wrong. I will try putting them in a list and then see what happens

          – Whiffy
          Nov 23 '18 at 14:21






















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53434901%2fbluetoothleadvertisementwatcher-not-returning-service-data-uuids%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

          Alcedinidae

          Origin of the phrase “under your belt”?