Jump to content
ChrisChuah

TBluetoothLE in Windows 10

Recommended Posts

Hi,

In my fmx application running in windows 32, 

when i call the TBluetoothLE.DiscoverDevices(4000), the function does not return any event back.

When it is run on iOS application, the function will return the event back as EndDiscovery

Why is this event is not called in Windows 32? Is there something that i forgot?

 

===== Code ========

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Scanning for devices');
  BluetoothLE1.DiscoverDevices(4000);
end;
==== End Code ======

 

Why isnt this function below not called in Windows 10?

procedure TForm1.BluetoothLE1EndDiscoverDevices(const Sender: TObject;
  const ADeviceList: TBluetoothLEDeviceList);
 

Share this post


Link to post

I have never been able to connect a BLE device with any version of Windows. If you want to use BLE with Windows you have to use WinRT api (i.e. you have to create a UWP application). I've heard you can use BLE with Windows with a special BL stack, but I don't know anything about it.
Like you I was able to use BLE with other devices like Android 32 or 64 without any problem.

 

Bye

Share this post


Link to post

maybe help you

http://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_Bluetooth_Low_Energy

 

HELP SYSTEM:

Platform Support

Platform Bluetooth Low Energy
Client Server

Windows(*)

10+

10+ (**)

macOS

10.7+

10.9+

iOS

5+

6+

Android

4.3+

5+

Note: Windows Server does not support Bluetooth, see General Bluetooth Support in Windows.
Note: WinRT Bluetooth API provides support for BLE advertising data through the manufacturer-specific data field, but it does not fully implement GATT Server functionalities.
Note: The iOS property list includes configuration for Bluetooth LE.
Attention: Applications running on Windows platform lower than Windows 10 do not support Bluetooth LE.

Place a TBluetoothLE Component

Use the new TBluetoothLE component to implement the RTL BluetoothLE feature for server and client applications.

TBluetoothLE includes the System.Bluetooth unit in your application and internally calls TBluetoothLEManager.Current to get an instance of TBluetoothLEManager. TBluetoothLEManager is the main class for Bluetooth Low Energy communications.

Note: TBluetoothLEManager.Current always returns the same instance of TBluetoothLEManager. You do not need more than one instance of TBluetoothLEManager.

Discovering Devices

BluetoothLE does not work as the Classic Bluetooth, you do not need to pair the devices. BluetoothLE clients need to discover BluetoothLE servers.

Notes:

  • Applications running on Windows platform lower than Windows 10 need to pair the devices before discovering BluetoothLE servers. For more information, see Windows Bluetooth FAQ.
  • The WinRT API for Windows 10+ platforms allows to scan for devices without the need to pair them.

Use the DiscoverDevices method to discover BluetoothLE servers.

procedure DoScan;
const 
  HeartRateService: TBluetoothUUID = '{0000180D-0000-1000-8000-00805F9B34FB}';
begin
  BluetoothLE1.DiscoverDevices(2500) // The parameter is the timeout in milliseconds. 
  BluetoothLE1.DiscoverDevices(2500, [HRService]) // It only exposes devices with the Heart Rate service to the BluetoothLE client.
end;

After this period of time, the OnEndDiscoverDevices event is fired. Once you discovered the device you can start getting the services and characteristics from the standard profile as outlined below.

 

Edited by emailx45

Share this post


Link to post

The WinSoft it's a company that have "many mini-components" for all platforms by RAD Studio last, but dont have any for MSWindows Bluetooth.

https://winsoft.sk/products.htm

 

nSoftwares: (Available in all major Windows development environments) - We offer free, fully-functional 30-day trials

 https://www.nsoftware.com/ipworks/ble/ 

 

https://www.serialio.com/support/bluesnap/windows/how-pair-bluesnap-smart-windows-10-ble

 

Here, a project by Fernando Rizzato (MVP Leader from South America) 

Chat via Bluetooth for Android, macOS and Windows (in Portuguese-BR)

https://fernandorizzato.com/2017/04/20/um-chat-via-bluetooth-para-android-macos-e-windows/

Download sources at: https://cc.embarcadero.com/item/30766

 

Developer Skill Sprint: Spelunking Bluetooth Low Energy Devices

https://community.embarcadero.com/blogs/entry/developer-skill-sprint-spelunking-bluetooth-le

 

(In Windows * * Bluetooth (LE) must be coupled with the device manager (in German)

https://www.delphipraxis.net/189298-bluetooth-low-energy-delphi-6-a-3.html

Edited by emailx45

Share this post


Link to post

Bluetooth "classic" and Bluetoooth "LE" are different things !!! With Windows (any version) you can use BClassic after pairing the devices. And you can use normal api from (TBlutooth component for example).

To use BLE in Windows application the BLE devices should be able to pairing with OS. But BLE pure devices (like industrial sensor devices, or other commercial devices) doesn't understand the "piairing" conditions, because it's a no sense. They work on the GATT services basis. So the normal Windows application cannot use BLE. Again, the BClassic and BLE use different radio spectrum tipologies.

3 hours ago, ChrisChuah said:

What other BLE component can be used for windows deployment if the default TBluetoothLE is not working for windows 10

Microsoft told that the UWP applications using the WinRT api (that are different from the standard Blutooth api) are able to use the BLE.

Also, there should be some Bluetooth stacks that may work in Windows with BLE.

 

Take care:  some devices (like many smartphones) have the Blutooth radio that works both in BClassic and BLE. This means that you can pair a smartphone and somtimes use the BLE.

 

@emailx45: i'll look at you suggestions, but i think that they speak about BLE with pair conditions.

Bye

Share this post


Link to post
Quote

Windows 10 supports LE Bluetooth peripherals automatically pairing to a single PC, after all devices have been provisioned and enabled during the manufacturing process. Users do not need to keep LE devices paired and connected after both the host PC and bundled devices are supplied power for the first time. These peripherals can still be used as regular Bluetooth devices, and maintain full functionality when out of range of the host PC. However, if the peripherals are unpaired and within range of the host PC, they will automatically re-pair and connect.

This is the explanation why in Windows 10 it is not necessary to "pair" BLE devices. But the devices must be able to pair, which normal BLEs don't.

Share this post


Link to post

Thanks for the reference to the delphi sample. 

Seems that for MacOS, iOS and Android, there is an event OnEndDiscoverDevices called when there is a timeout set in the DiscoverDevices function.

However, in Windows 10, this event is not called. Instead the event DiscoveredDevice is called.

Hence, have to modify the codes to detect that if windows, have to add a timer for timeout to stop the discovery of devices.

 

Would this be a good option?

what would you do? please advice

 

regards

chris

Share this post


Link to post

From Help:

Quote

 

Platform Support

Platform Notes

Windows

  • Timeout is ignored because DiscoverDevices triggers the OnEndDiscoverDevices event immediately.
  • Always returns True.

OS X

  • OnEndDiscoverDevices always occurs some time after the specified Timeout, never before.
  • Always returns True.

iOS

  • OnEndDiscoverDevices always occurs some time after the specified Timeout, never before.
  • Always returns True.

Android

 

 

You should "have" the event immedialtly if all is working. I doubt that the BLE is working without any pairing (i cannot try beacuse i don't have any BLE that Windows can see …).

 

If you want to test it after a period, I recommend that you test it after 10.24 seconds. This time comes from a Bluetooth 4.0 specification and is the maximum (worse) response time of a Bluetooth device.
I use half of that time (5.2 seconds) and BLE devices always respond ... obviously not tested on Windows platform but on Android. I normally use around seven BLE devices via GATT.

 

There are some answers on Stackoverflow about that (if i remember good).

 

31 minutes ago, ChrisChuah said:

what would you do?

Since I have to work with BLE devices that Windows cannot see, I have given up on developing BLE applications on Windows.

 

Tell us if you will be luckier.

Bye

 

Share this post


Link to post

Now that you have tickled the Bluetooth topic, which I had filed, I tried again with the new PC, which has an Intel Bluetooth compared to the one I tested with which had a BroadComm, and in fact the BLE devices are seen correctly without pair them.
To see them I use the TBluetoothLE component and the DiscoverLEDevice event which is called for each BLE device found.

 

 

Share this post


Link to post
16 hours ago, DelphiUdIT said:

I tried again with the new PC, which has an Intel Bluetooth compared to the one I tested with which had a BroadComm,

I assume the "Intel" is an integrated BLuetooth, while for the "Braodcom" you used an external USB-Bluetooth stick,
is that correct ?

Share this post


Link to post

@Rollo62:

 

No, both old (Acer I7 Intel) and new PC (Asus I7 Intel) have the integrated Bluetooth. The old one was ( RIP) 3 years old, the new is less then one year old. I think that the malfunction of the old one was about the compatibility with BLE radio spectrum, may be the Bradcomm Bluetooth was not fully certified for BLE. I tried also in the past with old versions of Windows 10 and different Bluetooth constructors with no success.

 

But the failure probably also depends on the implementation of the Windows Bluetooth (stack), which only in Windows 10 and after several releases of the same has been made fully functional. In an old test, while in Windows 10 the BLE devices were not seen, in an Oracle virtual machine with MAC OSX (I don't remember the exact version, I think Sierra) the BLEs were seen .... very curious.

Now, in the next weeks (thanks LOCKDOWN :classic_rolleyes:)  i restart testing BLE on Windows with various hardware.
Bye

 

Share this post


Link to post

Have you checked out the functionality with some tools, like

https://www.microsoft.com/de-de/p/bluetooth-le-lab/9n6jd37gwzc8?activetab=pivot:overviewtab

https://www.microsoft.com/de-de/p/bluetooth-le-explorer/9n0ztkf1qd98?activetab=pivot:overviewtab

https://www.nirsoft.net/utils/bluetooth_viewer.html

https://www.nirsoft.net/utils/bluetoothcl.html

https://sensboston.github.io/BLEConsole/


Of course the Nordic tools should be great too, but thats already developer tools for the MCU's,

but they have a lot of helpful tools as well.

https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Connect-for-desktop

 

Maybe someone knows better tools for Windows, since I usually work with Android/iOS.

 

 

  • Thanks 1

Share this post


Link to post

@Rollo62:

 

Thanks for your links.

I already use the Nordic microcontrollers, and in particular the BLE devices I was talking about in this post ... they are really them …. :classic_biggrin:

Bye

 

Share this post


Link to post

I tested out the BLE on windows 10 and it seems that the device needs to be paired up in the Windows Bluetooth screen first by adding it to it.

If not, while you tried to get services from the device, it will prompt that the device is not paired up.

 

Share this post


Link to post
On ‎12‎/‎11‎/‎2020 at 2:43 AM, ChrisChuah said:

I tested out the BLE on windows 10 and it seems that the device needs to be paired up in the Windows Bluetooth screen first by adding it to it.

If not, while you tried to get services from the device, it will prompt that the device is not paired up.

 

Yes, this is true. Windows 10 works only with paired BLE devices. After the first time, means the first time that you paired the devices, Windows 10 do this operation automatically, For some devices the manually paired is not necessary. The devices that i use are without auth protocol and Windows 10 paried them automatically when my app tries to scan and get gatt services.

Share this post


Link to post

I have a BLE device with custom firmware in it that I have succesfully paired on the windows bluetooth screen. When I call DiscoverDevices and pass UUID of the service I am looking for, the function returns true. However, it the event OnEndDiscoverDevices does not fire. If I use a timeout and fire that event manually, the list DiscoveredDevices is empty. I thought that pairing the BLE device to Windows first would solve this issue, but even after pairing I am getting the same results. Does anyone know of a work around?

 

For the record, I can use the Bluetooth LE Explorer app on windows and see the device and its services and characteristics.

Share this post


Link to post

Under Windows you must use "OnDiscoverLEDevice" event. It will be fired for every device discovered. The "OnEndDiscoverDevices" is not fired in Windows, it works on Android Platform.

 

Hope the answer wil be usefull.

Bye

Edited by DelphiUdIT

Share this post


Link to post

Thanks so much for the response. I am ysing Rad Studio 10.2 FMX, and my TBluetoothLE component does not have a method called "OnDiscoverLEDevice" or "DiscoverLEDevice". Is this something that has been introduced in a newer version of FMX?

Share this post


Link to post
13 hours ago, DelphiUdIT said:

Under Windows you must use "OnDiscoverLEDevice" event.

How do you detect end-of-discovery, do you run a timer in parallel ?

Share this post


Link to post
Quote

How do you detect end-of-discovery, do you run a timer in parallel ?

Yes, stay on BLE specifications the maximum response time should be around 10 seconds. I normaly use about 5 seconds (timer or timeout)  (5.2 seconds exactly) and Always all the devices respond.
But the logic to "list" the device is different: in Android I use the "end" event, while in Windows I use the "single" discovery event.

 

This should be in that way: if the "end" discovery event works, the "single" discovery event  doesn't work and vice versa.

 

I don't know if in the last updates somthing is changed, but surely in that way is working.

Bye

Share this post


Link to post

Yes, in Macos/iOS/Android I use both events, the OnDeviceLE to show an early response,

and the EndDiscovery to proceed further.

So an additional timer would mimick the Android/iOS behavior well.

Still I don't use BLE on Windows, which is another construction site, but its on my roadmap.

 

 

Share this post


Link to post

I was able to get my device to pair to windows and then discover its services and characteristics. My device is to work like a simple UART bridge, with and Rx and Tx characteristic. My program successfully sends out the Tx message. However, when an Rx message is recieved, the event "OnCharacteristicRead" does not seem to be fired, therefore my code does not successfully get the message. Is there an issue in windows firing this event? The same application on iOS works as it should.

 

*EDIT*

 

This ended up not being a windows issue but an issue in the BLE device firmware I needed to address.

Edited by almcneil15

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×