Partager via


Welcome to the Windows Bluetooth Core Team blog!

Bluetooth is powering new innovations in wireless connectivity across computers, smart devices, and the Internet-of-Things. Besides being the input of choice for the new Surface accessories such as mice, keyboards, Surface Pen, and Surface Dial, it's become the preferred protocol for wearables and health monitoring systems like Fitbit and Garmin. Because of Bluetooth, a Jabra Sport Pulse headphone can stream music to power your workout, while simultaneously transferring your heart rate data to your smartphone. Bluetooth also makes it easy to track products on a shop floor. Finally, Bluetooth flagship applications, audio and automotive, are two key areas where it continues to innovate: from truly wireless earbuds with great battery life, to using Cortana's voice for map navigation, Bluetooth cannot be beat!

Hi, I'm Aruna, a new PM on the Bluetooth team, helping our dev community enable great Bluetooth experiences on Windows!

Check out our January blog post about our much anticipated release of new Bluetooth features in our Windows 10 Creators Update! Not only did we make improvements to our GATT server, and LE device connectivity, we also improved Bluetooth audio functionality. Now, your Skype audio will sound much better over Bluetooth!

As a part of that, we're excited to present our three-part video series* for Microsoft Build 2017. Our videos dive deep into:

* The BTVS sniffer tool, shown in the videos, is still work in progress. We'll keep you updated on its release timeline.

Other Microsoft Build 2017 sessions are available on Channel 9.

To learn more about our work in Bluetooth BR/EDR and LE, check out these links:

Update on 08/21/2017:

We've open sourced our app! Please check out our new blog post for more details!

If you have any questions, or would like us to discuss more about any of the topics in this post, please let us know in the comments below!

Comments

  • Anonymous
    May 12, 2017
    i miss the link to source code of Bluetooth LE Explorer ?
    • Anonymous
      May 12, 2017
      Hi Andre,We're making some improvements to the LE Explorer app. We'll keep you posted on its release timeline.
      • Anonymous
        July 07, 2017
        Any new updates on this? I can connect successfully to my device with the app, and the app source would be extremely useful. I'd even take a code drop of whatever you've got right now, even if it isn't the final source you intend to publish. Thank you!
    • Anonymous
      August 21, 2017
      We've open sourced our app! Please check out our new blog post for more details: https://blogs.msdn.microsoft.com/btblog/2017/08/21/bluetooth-le-explorer-code-is-open-source-now/
  • Anonymous
    May 17, 2017
    I'm having problems with responding to read requests with an UWP application that acts as Bluetooth LE peripheral.http://stackoverflow.com/questions/43776554/how-to-respond-to-bluetooth-le-characteristic-read-request-in-uwp-applicationI couldn't see in the videos how you did to respond to the read request.A working sample source code, like the Bluetooth LE Explorer app would have been nice as there isn't much documentation for the new features.
    • Anonymous
      May 18, 2017
      Hi Joben,You would need to subscribe to ReadRequest callback.https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/gatt-server
      • Anonymous
        May 18, 2017
        Looking at the Stack Overflow question, it looks like your code snippet is based on an outdated, incorrect snippet that was online. We've since updated it -- sorry for the confusion.You need to make sure you take the deferral for the request. This is due to the Async operation that happens in the callback.var deferral = args.GetDeferral();var request = args.GetRequestAsync(); // In a foreground app, this should be called on the UX thread if the request is from a paired device and it's the first time it's been used....request.ResponWithValue();deferral.Complete();
        • Anonymous
          May 18, 2017
          Thanks a lot for the reply, now I got it working!But the documentation where I got the snippet from still has the old code.https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/gatt-server
        • Anonymous
          May 25, 2017
          I have created a sample UWP to run on a pi3. I followed Aruna's document link and examples shown in the channel 9 part 3 video, but I cannot get the read handler to return anything to the LE Exporer except Exception! A sample server code app would be awesome if someone could publish one.
          • Anonymous
            May 25, 2017
            Nevermind, I have been staring at it too long, just need to return a writer.WriteBytes() rather that a writer.WriteInt16().
  • Anonymous
    May 26, 2017
    I didn't hear an explanation from the Built videos that what enables the "Virtual Peripheral" feature in the LE explorer app? specific bluetooth devices in the host?
    • Anonymous
      May 26, 2017
      Hi Jack,The virtual peripheral option would be automatically enabled in the app if the Bluetooth chipset in the device supports BLE peripheral role. Developers can discover which device radio can support this feature through the BluetoothAdapter.IsPeripheralRoleSupported API at runtime.
  • Anonymous
    June 19, 2017
    i miss the link to source code of connect to an unpaired Bluetooth peripheral ?
  • Anonymous
    July 09, 2017
    Aruma,I've downloaded and run the UWP Toolkit. It worked well, but my issue is something not covered in the module. Maybe you could help me?I'm trying to listen for changed values in a characteristic that has a Notify Property.I can successfully get the characteristic (_rcCharacteristic) and I'm trying to receive events:// Set up an event listener_rxCharacteristic.ValueChanged += _rxCharacteristic_ValueChanged; // Subscribe to notifications of data changes from the GATT characteristic Task gattCommunicationStatusTask = _rxCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify).AsTask();if (gattCommunicationStatusTask.Wait(CONNECT_READSYNC_TIMEOUT) == false) return;GattCommunicationStatus gattCommunicationStatus = gattCommunicationStatusTask.Result;if (gattCommunicationStatus != GattCommunicationStatus.Success) return;This all works, and gattCommunicationStatus == GattCommunicationStatus.Success, yet the event never fires.In the BluetoothLE Explorer, I can switch on the Notify switch and data flows through just fine.Additionally, if I loop the following code, I do get different data coming, so I know it is changing:// Read latest valueTask gattReadResultTask = _rxCharacteristic.ReadValueAsync(BluetoothCacheMode.Uncached).AsTask();if (gattReadResultTask.Wait(READSYNC_TIMEOUT) == false) return;GattReadResult gattReadResult = gattReadResultTask.Result;Any help you could give me would be greatly appreciated. Thank you!
    • Anonymous
      July 10, 2017
      Hi, What are you using for your server and are you sure it's sending out notifications?
      • Anonymous
        July 10, 2017
        I'm pretty sure it is sending out notifications, based on what I am seeing with the Bluetooth LE Explorer app. Here is what I am doing:- Open Bluetooth LE Explorer app- Click the Start button- Click the hardware device that is found (it's in a blue tile)- Service Names and Characteristics for the device are shown. I click the characteristic I'd like from the list.- I am presented with a Characteristics page. Read Value has a value in it. It has a gray background. It is not changing. A Notify On/Off toggle is shown with an Off setting- I toggle the Notify property to On- The Read Value begins to change, and keeps changingI am assuming that this Read Value is being updated by a ValueChanged trigger based on this characteristic.But I can't get the same behavior to occur based on the code I've supplied, so I'm assuming what I'm doing is different than the source code behind how this app is working. I'm trying to understand the difference.Thanks so much for your replies and help so far. I'm hoping this is just some really simple adjustment to make this all work.
  • Anonymous
    July 30, 2017
    Hello I have been working on the application, works very well, but I have some questions: 1.- How do I disconnect from a BLE device? I've tried bluetoothLeDevice?.Dispose(); then bluetoothLeDevice = null; but it doesn't disconnect. i have to close the program to disconnect. 2.- How do I clear the cache from the Discovered devices? if i enumerate and there was a device, then i enumerate again but the device is off it still shows the device, this happens even when closing the application, the only way to clear it is by removing the USB dongle. 3.- Is it possible to connect to more than one BLE device? if so how?Thanks and Best regards.
    • Anonymous
      July 31, 2017
    1. There is no way to disconnect. The OS will handle that for you. The reason for this is that application doesn't know who else is using the device so it may inadvertently disconnect while another application is using it. The OS will handle the disconnect when no more activity is happening. 2. We had an issue with this in earlier version of Windows. Bluetooth LE Explorer on the latest insider build should not show stale devices.3. Yes. There is nothing that stops anyone from connecting to more than 1 device. You connect to the 2nd device just like the first. There is no difference.
      • Anonymous
        July 31, 2017
        Thanks for the clarifications!
      • Anonymous
        August 29, 2017
        You mention that there is no way to disconnect, that the OS will handle that. Are there any details available on when it will release the connection? In my application, the module I am connecting to does not show available to other devices after my app is done with it until the app closes. This is the same behavior as the Bluetooth LE Explorer. But I expect my users will find this problematic. I noticed that when I force a suspend it does release it. Is there any other way? Any way to temporarily suspend an app from the code?
        • Anonymous
          September 11, 2017
          As it stands today, if an app is “using” the device (has a resource open to it like GattDeviceService or BluetoothLEDevice), we will stay connected unless the remote device disconnects from us – having the resources open is considered in use. In general, an app must call Dispose on all GattDeviceServices and BluetoothLEDevices it has acquired. In addition, if they are using the GattSession it must also be destroyed. The Dispose/IClosable pattern is seen commonly across the UWP world.
  • Anonymous
    August 06, 2017
    Hi I develop windows forms app with C# and I wanna get Bluetooth LE devices and connect and write and read data. What can I do for that? Any sample code or Api?
  • Anonymous
    September 10, 2017
    The comment has been removed
    • Anonymous
      September 11, 2017
      What exception is being thrown?
      • Anonymous
        September 12, 2017
        Exception levée : 'System.NullReferenceException' dans App2.exe
        • Anonymous
          September 12, 2017
          Hi Thierry,To help us investigate this issue, could you please gather Bluetooth traces and send them to us through Feedback hub?Here are the instructions to submit a Feedback Hub report to reproduce the issue and collect Bluetooth logs:1. Search for “Feedback Hub” in Cortana search, then launch the app.2. Navigate to Feedback in the left menu, then press + "Add new feedback".3. Select the Problem button, share any details you think are relevant, and choose an appropriate category and subcategory. (For proper Bluetooth logs to be captured it must be one of the Bluetooth context paths, e.g. Hardware, Devices, and Drivers -> Bluetooth – Discovery, Pairing, and Connectivity) 4. Fill out the summary and the details with relevant information, including basic scenario and what’s failing, host and device make and model.5. Select "Start capture" link or "Begin montoring" near the end of the form.6. Toggle the Bluetooth radio OFF-then-ON via the quick action menu or force a power cycle of the remote device (we want the connection information).7. Reproduce the Bluetooth issues you're facing.8. Select the "Stop capture" or "Stop monitoring" link when done.9. Click Continue using Feedback Hub.10. Click My feedback at the top, then find the item you submitted (it may take a while to appear).11. Open the item you submitted, then click Share.12. Click Copy link, then paste the link here in your response. (It will look like https://aka.ms/.)Thanks,Aruna.
          • Anonymous
            September 16, 2017
            In fact I suspect that the old way to get data when the device is already added as a Bluetooth device to the PC does not work anymore and that I have to switch to your new way without declaring the Bluetooth device , but it is more complex . With the previous version of windows I used this to get a list of devices : var str = BluetoothLEDevice.GetDeviceSelector();devices = await DeviceInformation.FindAllAsync(str);Then I search which device has the good name to get its id.foreach (var d in devices){ if ((d.Name == NAME)) { device = d; break; }}Then I access to the device to get the service I want (I know its id)var ble = await BluetoothLEDevice.FromIdAsync(device.Id);var service = ble.GetGattService(new Guid("0000180f-0000-1000-8000-00805f9b34fb"));Then I get the characteristics (I know its id)GattCharacteristic battery = service.GetCharacteristics(new Guid("00002A19-0000-1000-8000-00805f9b34fb"))[0]; Then the last step create the exception :gattRead = await battery.ReadValueAsync(BluetoothCacheMode.Uncached);I can change my way, and do not add the device to the list of the bluetooh devices.I have tried to understand your Bluetooth LE sample codeBut when I open it in visual studio I have a lot of errors like this oneGravité Code Description Projet Fichier Ligne État de la suppressionErreur CS0246 Le nom de type ou d'espace de noms 'System' est introuvable (vous manque-t-il une directive using ou une référence d'assembly ?) GattHelper C:\Users\Thierry\Downloads\BluetoothLEExplorer-master\BluetoothLEExplorer-master\BluetoothLEExplorer\GattHelper\Converters\GattConvert.cs 1 ActifCan you help me either by understanding what I have to change in my code to make it running again,or really explain but a simple way like mine how to use get data from device not declared.I will try to activate the Bluetooth trace, and will tell you.Fortunately, I have another PC with the standard (non insider) windows and my software continues to work.It is important because I need my device (based on CC2650 Sensortag) and my software to participate and win (like last year) the next e-rally of montecarlo (http://acm.mc/en/edition/erallye-2017-edition/)
            • Anonymous
              September 18, 2017
              Hi Thierry,We have fix for this bug in our Windows Insider program (WIP) Fast Skip Ahead. Please upgrade to the latest build and let us know if you still see issues.Thanks,Aruna.
  • Anonymous
    October 12, 2017
    Nice, since the open source it's been great!
    • Anonymous
      October 12, 2017
      Awesome! That's great to hear.Regards,Aruna.
  • Anonymous
    November 18, 2017
    Hi, My Galaxy Note 8 (apparently) has the Bluetooth 5 standard built in, which should provide significant improvements to range etc. I haven't seen it anywhere else thoguh in terms of peripherals or other core devices like Windows 10 PCs. Can you say if there is an intention to build BT5 into future software updates and if so when? Until more core devices use the new stanrdard peripherals are unlikely to follow it.
    • Anonymous
      November 20, 2017
      Hi Dean,This is something we are definitely looking into. We'll update this blog with more details at a later time.Thanks,Aruna.
  • Anonymous
    December 18, 2017
    Any release timeline for the BTVS sniffer tool?
    • Anonymous
      January 24, 2018
      The BTVS can be downloaded from Windows WDK version 1709 and later.For instructions on using the BTVS sniffer, please take a look at our Build 2017 video : introduction to Bluetooth Virtual Sniffer (details on using the sniffer starts around the 10:25 sec mark)https://channel9.msdn.com/Events/Build/2017/P4177
  • Anonymous
    December 18, 2017
    In another forum I had posted 'is there a way to specify to NOT do dialogs re pair/unpairing of a BLE device".The answer I got was 'no its not possible'. Question, any plans in the future to make these dialogs optional (e.g. in the API a flag to say to NOT to do them.)Context: we are developing a UWP app that will scan BLE devices looking for 'our' devices. if N are found, then briefly pair/unpair with each to read some info (which for security/privacy reasons we DO NOT want to be advertised) then display the list of n devices to the user with the read info, and let the user decide of the n which to 'pair' with for futher use. With the dialogs 'always there for pair/unpair'this is really tiresome for the user.
    • Anonymous
      January 02, 2018
      Thanks for reaching out to the Microsoft Bluetooth team. Unfortunately, it is not possible to get around the dialogs at this time. If this changes, we will be sure to update the blog with more details.Thanks,Aruna.
  • Anonymous
    December 22, 2017
    The comment has been removed
    • Anonymous
      January 02, 2018
      The comment has been removed
  • Anonymous
    December 23, 2017
    Does Windows 10 v1709's built-in Bluetooth stack (assuming you're not using Broadcom's WIDCOMM or BlueSoleil or CSR Harmony) come with AptX Low Latency codec? How can I tell if this codec is in use with some A2DP headphones?
    • Anonymous
      January 02, 2018
      Hi Sean,The Windows Bluetooth A2DP SRC profile supports aptX “classic” but not aptX-LL. Unfortunately, there is no way in the Windows UI to tell what Bluetooth A2DP codec is in use.Thanks,Aruna
  • Anonymous
    January 24, 2018
    Hi there,Is the BTVS sniffer tool publicly available yet?
    • Anonymous
      January 24, 2018
      Hi Deepak,The BTVS tool can be downloaded from Windows WDK version 1709 and later.For instructions on using the BTVS sniffer, please take a look at our Build 2017 video : introduction to Bluetooth Virtual Sniffer (details on using the sniffer starts around the 10:25 sec mark)https://channel9.msdn.com/Events/Build/2017/P4177Thanks,Aruna.
      • Anonymous
        January 24, 2018
        Thanks for the link Aruna. Appreciate your help.
    • Anonymous
      February 08, 2018
      Found the ComProbe tool used itself as well, figured I'd share :) http://www.fte.com/support/CPAS-download.aspx?demo=FTS4BT&iid=16
  • Anonymous
    January 31, 2018
    The comment has been removed
    • Anonymous
      February 01, 2018
      H Cody,Thanks for reaching out to us. From your description, I would suspect that one instance of the app has not fully torn down connection and the second process is trying to connect and fail.Could you please try the following:1.Dispose all of your GattDeviceService-s and BluetoothLEDevice-s when they are finished, including when your app is terminating. This will also ensure the device disconnects quickly when not in use.2.If you wish to enable sharing, you should specify in your call to OpenAsync of FromIdAsync, after retrieving or when constructing the GattDeviceService respectively.public IAsyncOperation OpenAsync(GattSharingMode sharingMode)Exclusive : The sharing mode is exclusive.SharedReadAndWrite : The sharing mode is read and write.SharedReadOnly : The sharing mode is read only.For more information on GattSharingMode, please refer to the following links:https://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.genericattributeprofile.gattdeviceservicehttps://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.genericattributeprofile.gattsharingmodeHope that helps!Thanks,Aruna.
  • Anonymous
    February 01, 2018
    How would one close a GATT session i.e. disconnect from a BT LE GATT server? Except for disposing objects which fails depending on asynchronous behavior there is no documented way to tell the GATT Server that the session (connection) is closed?
    • Anonymous
      February 01, 2018
      The comment has been removed
  • Anonymous
    June 06, 2018
    Hello ,I have a question regarding Windows 10 Pro -version 1803 bluetooth Profiles Access in C# and also for devices having bluetooth version 4.2 and above.Issue details:Platform: Windows 10 Pro - version 1803.Issue brief: I am trying to access bluetooth profiles via desktop(c#) of connected phones, however on windows 10 the profile shows enabled but the profiles are not working eg: HFP connects however voice is not heard from computer speakers even the configuration is set right which works on bluetooth driver's built in application Bluetooth device tested on:1.Bluetooth CSR 4.0 Dongle (CSR8510 A10) (Note: this bluetooth connets and show HFP and works as expected, however the bluetooth does not show on the device list and hence we cannot connect programatically using c#)2.IOGEAR's Bluetooth 4.0 (Model GBU521W6) (Shows on device list and our application can detect as device however HFP is not working as expected both from application or from normal device setcion) Required Profiles:1.Hands-Free Profile (HFP)2.Message Access Profile (MAP)3.Phone Book Access Profile (PBAP)Already Tried:1. Updating drivers2. Tried uninstall install many times3. Used android, ios and windows phones Regards,
    • Anonymous
      June 25, 2018
      Hi AmitOhal,Thanks for reaching out to us. It sounds like you are trying to use HFP from a phone that is paired and connected with a PC. This would require the HandsFree role, which is not implemented by Windows at this time. If this changes, we will be sure to update the blog with more details.Thanks,Aruna.
  • Anonymous
    September 14, 2018
    Hello,I am seeing strange behaviour with unpaired BLE connections, that maybe you could clarify?Windows Version 1803 (OS Build 17143.285)I am attempting to initiate a connection to peripheral with a known Bluetooth address using BluetoothLEDevice.FromBluetoothAddressAsync. This will always fail (returning null) I have not first performed a Bluetooth search, either via Windows settings or BluetoothLEAdvertisementWatcher. Does this function only attempt to initiate an unpaired connection to a previously cached list of devices or something? Or is there some stack initialisation done by the act of searching, that I could also do beforehand? Any help greatly appreciated?Thanks,Chris
    • Anonymous
      September 14, 2018
      Hi Chris,This is expected behavior by the stack. You would need to discover the device first before calling FromBluetoothAddressAsync.Hope this helps!Thanks,Aruna.
  • Anonymous
    October 12, 2018
    Hi, me again :) thanks for your responses on here. Since Bluetooth SIG are withdrawing "Bluetooth specification versions 2.0 + EDR" in January 2019 and other specifications up to 4.1 in July 2020; will this have any effect on the Microsoft stack's support for devices conforming to theses specifications in future Windows updates?
    • Anonymous
      October 12, 2018
      Hi,Thanks for reaching out to the Microsoft Bluetooth team. Withdrawal of old specification versions will not have any adverse impact on Windows stack support. This is because all new Bluetooth specifications are backwards compatible with previous versions to this point. That said, we highly recommend you consider moving to newer versions of the specification for improved security and user experience.Hope that helps!Thanks,Aruna.
  • Anonymous
    November 22, 2018
    Hello, I have a some questions:1. What is the difference between Serial, KeepLatest, Batch for BluetoothEventTriggeringMode?2. I subscribed to ValueChanged event for GattCharacteristic in foreground app and i have background task registered with GattCharacteristicNotificationTrigger. When app not running in foreground only background task is triggered and i think this is correct.When my app is running in foreground i get event from GattCharacteristic and background task is triggered too. This is correct behavior?
    • Anonymous
      November 29, 2018
      Hi Perov,Regarding your 1st question, did you find some part of the documentation for BluetoothEventTriggeringMode (https://docs.microsoft.com/en-us/uwp/api/windows.devices.bluetooth.background.bluetootheventtriggeringmode) unclear so I can improve it for all? If so can you tell me what terms need a deeper explanation?For your 2nd question yes your background task will be triggered regardless of whether the foreground task is running. You can use the in-process background task model and in your code handle the event only once using the EnteredBackground and LeavingBackground events to toggle which handler executes. Thanks,Frank