Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Bluetooth Operations

Scan for Devices

Start Discovery

#!/usr/bin/env bash
# Scan for Bluetooth devices

echo "Starting discovery..."
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.bluez.Adapter1.StartDiscovery

echo "Scanning for 5 seconds..."
sleep 5

echo "Stopping discovery..."
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.bluez.Adapter1.StopDiscovery

List Discovered Devices

# List all discovered devices
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    / \
    org.freedesktop.DBus.ObjectManager.GetManagedObjects \
    | grep -A 10 '/org/bluez/hci0/dev_'

# Example output:
# /org/bluez/hci0/dev_E4_17_D8_EC_04_1E
#   string "Name"
#   variant string "My Bluetooth Device"
#   string "Address"
#   variant string "E4:17:D8:EC:04:1E"

Note: Device paths use underscores in MAC addresses (e.g., E4_17_D8_EC_04_1E), not colons.

Connect to Device

Connection Script

#!/usr/bin/env bash
# Connect to a Bluetooth device
# Usage: ./connect.sh DEVICE_MAC
# MAC format: XX_XX_XX_XX_XX_XX (underscores, not colons)

DEVICE_MAC="$1"

if [ -z "$DEVICE_MAC" ]; then
    echo "Usage: $0 DEVICE_MAC (e.g., E4_17_D8_EC_04_1E)"
    exit 1
fi

echo "Step 1: Check if device needs pairing"
PAIRED=$(dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Device1 \
    string:Paired 2>&1 | grep boolean | awk '{print $3}')

if [ "$PAIRED" = "false" ]; then
    echo "Pairing device..."
    dbus-send --system --print-reply \
        --dest=com.kobo.mtk.bluedroid \
        /org/bluez/hci0/dev_"${DEVICE_MAC}" \
        org.bluez.Device1.Pair
    sleep 3
fi

echo "Step 2: Set device as trusted"
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Set \
    string:org.bluez.Device1 \
    string:Trusted \
    variant:boolean:true

echo "Step 3: Connect to device"
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.bluez.Device1.Connect

echo "Step 4: Verify connection"
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Device1 \
    string:Connected

Handling “AlreadyConnected” Error

If you get Error org.bluez.Error.AlreadyConnected: already connected when the device isn’t actually connected, the device is in a stale state. Performing a new device scan (discovery) clears the stale state. A disconnect is not required.

Check Device Status

Get Device Properties

#!/usr/bin/env bash
# Check device connection status
# Usage: ./device_status.sh DEVICE_MAC

DEVICE_MAC="$1"

if [ -z "$DEVICE_MAC" ]; then
    echo "Usage: $0 DEVICE_MAC"
    exit 1
fi

echo "=== All Device Properties ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.GetAll \
    string:org.bluez.Device1

echo ""
echo "=== Connected Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Device1 \
    string:Connected

echo ""
echo "=== Paired Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Device1 \
    string:Paired

echo ""
echo "=== Trusted Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Device1 \
    string:Trusted

Check Adapter Status

#!/usr/bin/env bash
# Check Bluetooth adapter status

echo "=== All Adapter Properties ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.freedesktop.DBus.Properties.GetAll \
    string:org.bluez.Adapter1

echo ""
echo "=== Powered Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Adapter1 \
    string:Powered

echo ""
echo "=== Discovering Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Adapter1 \
    string:Discovering

echo ""
echo "=== Discoverable Status ==="
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.freedesktop.DBus.Properties.Get \
    string:org.bluez.Adapter1 \
    string:Discoverable

Disconnect Device

#!/usr/bin/env bash
# Disconnect from a Bluetooth device
# Usage: ./disconnect.sh DEVICE_MAC

DEVICE_MAC="$1"

if [ -z "$DEVICE_MAC" ]; then
    echo "Usage: $0 DEVICE_MAC"
    exit 1
fi

dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0/dev_"${DEVICE_MAC}" \
    org.bluez.Device1.Disconnect

Remove Device

#!/usr/bin/env bash
# Remove (unpair) a Bluetooth device
# Usage: ./remove.sh DEVICE_MAC

DEVICE_MAC="$1"

if [ -z "$DEVICE_MAC" ]; then
    echo "Usage: $0 DEVICE_MAC"
    exit 1
fi

# Remove device from adapter
dbus-send --system --print-reply \
    --dest=com.kobo.mtk.bluedroid \
    /org/bluez/hci0 \
    org.bluez.Adapter1.RemoveDevice \
    objpath:/org/bluez/hci0/dev_"${DEVICE_MAC}"