Kevin M.
Kevin M.

Reputation: 43

How to know if a bluetooth device is connected or disconnected by Powershell

I have the next sentence to show all bluetooth devices in Powershell.

(Get-PnpDevice -PresentOnly -class Bluetooth | ? HardwareID -match 'DEV_' | Select *).FriendlyName

The main problem, it's that even if the device isn't connected, it still shows, i haven't find a way to find a way to see if it's connected or disconnected, cause it only shows "OK" in its status, even if it's disconnected.

Upvotes: 3

Views: 3251

Answers (2)

JayTe
JayTe

Reputation: 1

I found a very easy solution with btdiscovery integrated in bluetooth-command-line-tools.

PowerShell command like btdiscovery -d"%c%" -i1 -bXX:XX:XX:XX:XX:XX just replys "Yes" or "No", whether the device is connected.

My PowerShell script:

$bluetoothAddress = "XX:XX:XX:XX:XX:XX"
 
$commandOutput = btdiscovery -d "%c%" -i 1 -b $bluetoothAddress
if ($commandOutput -eq "Yes") {
     Write-Host "Bluetooth device is connected."
} elseif ($commandOutput -eq "No") {
     Write-Host "Bluetooth device is not connected."
}
pause

Upvotes: 0

Cpt.Whale
Cpt.Whale

Reputation: 5341

For audio devices, this will show Status as either OK or Unknown for connected/disconnected

Get-PnpDevice -class AudioEndpoint | Select FriendlyName,Status 

For other devices, it probably depends on the driver. The closest I could get without loading a bunch of windows api .dll files was by checking the driver properties.

However, this property is missing a standard friendly name for my device, so I have to use a property guid:

# Returns true/false for connection status:
$BtStatus = Get-PnpDevice -class Bluetooth -FriendlyName 'JVC HA-S65BN' | 
  Get-PnpDeviceProperty -KeyName '{83DA6326-97A6-4088-9453-A1923F573B29} 15' |
  Select -ExpandProperty Data

If that property ID isn't right for you, try and find one you can use by comparing the pnp device properties while connected/disconnected like so:

# while disconnected, get property values
$Disconnected = Get-PnpDevice -class Bluetooth -FriendlyName 'JVC HA-S65BN' | Get-PnpDeviceProperty
# run again while connected
$Connected = Get-PnpDevice -class Bluetooth -FriendlyName 'JVC HA-S65BN' | Get-PnpDeviceProperty

# compare to look for different values while connected/disconnected
Compare-Object $Disconnected $Connected -Property Data,Keyname -PassThru | 
  Select SideIndicator,KeyName,Data | Format-Table -AutoSize

# output:

SideIndicator KeyName                                   Data
------------- -------                                   ----
<=            {2BD67D8B-8BEB-48D5-87E0-6CDA3428040A} 5  3/24/2022 1:31:16 PM
<=            {83DA6326-97A6-4088-9453-A1923F573B29} 15 False
=>            {83DA6326-97A6-4088-9453-A1923F573B29} 15 True
<=            DEVPKEY_Bluetooth_LastConnectedTime       3/24/2022 1:31:16 PM
=>            DEVPKEY_Device_DevNodeStatus              25190410
<=            DEVPKEY_Device_DevNodeStatus              58744842

As you can see, the only useful device property that I could use is named {83DA6326-97A6-4088-9453-A1923F573B29} 15. I don't have other bluetooth devices to test with though, maybe someone else can confirm or add another example

Upvotes: 4

Related Questions