The Linux.Bluetooth library for .NET gives developers the ability to quickly stand up and interface with Linux's BLE radio with very little effort. There's no need to recall the laborious D-Bus API calls, we handle that for you. Linux.Bluetooth is used by Fortune organizations listed under the Top 100 Fastest Growing Companies and the Linux layer for InTheHand 32Feet! 🥇
The library uses, Tmds.DBus to access Linux's D-Bus, the preferred interface for Bluetooth in userspace.
Check out the SuessLabs article on using Linux.Bluetooth
- Linux
- .NET 6, 7, 8, and 9
Sorry, older Mono (.NET Framework) versions are not supported.
This project has been validated against, BlueZ v5.50 and above. You can check which version you're using with, bluetoothd -v
.
Linux.Bluetooth aims to support Linux Distributions where both .NET and BlueZ is supported. Officially, this NuGet package has been tested against Ubuntu 20.04 LTS.
List of BlueZ supported distros:
- Ubuntu Linux
- Raspbian (Raspberry PI)
- Debian GNU/Linux
- Fedora Core / Red Hat Linux
- OpenSuSE / SuSE Linux
- Mandrake Linux
- Gentoo Linux
- Chrome OS
dotnet add package Linux.Bluetooth
C# events are available for several properties. Events are useful for properly handling disconnects and reconnects.
using Linux.Bluetooth;
...
IAdapter1 adapter = (await BlueZManager.GetAdaptersAsync()).FirstOrDefault();
or get a particular adapter:
IAdapter1 adapter = await BlueZManager.GetAdapterAsync(adapterName: "hci0");
adapter.DeviceFound += adapter_DeviceFoundAsync;
await adapter.StartDiscoveryAsync();
...
await adapter.StopDiscoveryAsync();
adapter.DeviceFound
(above) will be called immediately for existing devices, and as new devices show up during scanning; eventArgs.IsStateChange
can be used to distinguish between existing and new devices. Alternatively you can can use GetDevicesAsync
:
IReadOnlyList<Device> devices = await adapter.GetDevicesAsync();
device.Connected += device_ConnectedAsync;
device.Disconnected += device_DisconnectedAsync;
device.ServicesResolved += device_ServicesResolvedAsync;
await device.ConnectAsync();
Alternatively, you can wait for "Connected" and "ServicesResolved" to equal true:
TimeSpan timeout = TimeSpan.FromSeconds(15);
await device.ConnectAsync();
await device.WaitForPropertyValueAsync("Connected", value: true, timeout);
await device.WaitForPropertyValueAsync("ServicesResolved", value: true, timeout);
Prerequisite: You must be connected to a device and services must be resolved. You may need to pair with the device in order to use some services.
Example using GATT Device Information Service UUIDs.
string serviceUUID = "0000180a-0000-1000-8000-00805f9b34fb";
string characteristicUUID = "00002a24-0000-1000-8000-00805f9b34fb";
IGattService1 service = await device.GetServiceAsync(serviceUUID);
IGattCharacteristic1 characteristic = await service.GetCharacteristicAsync(characteristicUUID);
byte[] value = await characteristic.ReadValueAsync(timeout);
string modelName = Encoding.UTF8.GetString(value);
characteristic.Value += characteristic_Value;
...
private static async Task characteristic_Value(GattCharacteristic characteristic, GattCharacteristicValueEventArgs e)
{
try
{
Console.WriteLine($"Characteristic value (hex): {BitConverter.ToString(e.Value)}");
Console.WriteLine($"Characteristic value (UTF-8): \"{Encoding.UTF8.GetString(e.Value)}\"");
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
}
It may be necessary to pair with a device for a GATT service to be visible or for reading GATT characteristics to work. To pair, one option is to run bluetoothctl
(or sudo bluetoothctl
)
and then run default agent
and agent on
within bluetoothctl
. Watch bluetoothctl
for pairing requests.
See Ubuntu's Introduction to Pairing.
From command line, use bluetoothctl
or Bluetooth Manager to scan and retrieve device UUIDs and Services to assist with debugging.."
$ bluetoothctl
; Get list of BT Adapters
list
; Scan for devices
scan on
; Stop Scanning
scan off
; List known devices
devices
See Contributing.
- Deprecating
Linux.Bluetooth.Extensions
. It will now just beLinux.Bluetooth
namespace. - Wrappers to ease the learning curve
- Prism Avalonia for Linux GUI test app
- Doing Bluetooth Low Energy on Linux
- BlueZ API:
- BlueZ Official Site
- Install BlueZ on the Raspberry PI
Sponsored by: Suess Labs a subsidary of Xeno Innovations, Inc.