Scripting connecting/disconnecting a paired Bluetooth device
I wrote C++ code to do it using Win32 Bluetooth API's BluetoothSetServiceState
, but it's actually enough to use Bluetooth Command Line Tools.
As it turns out, once all services in use by a device get disabled, device gets released and disconnected by Windows automatically. In my case these are voice and music, as per the screenshot, and most headphones will work the same way.
Voice is actually the hands free service (HFP) and music is just an audio sink (A2DP). Service identifiers will be necessary and they can be discovered through the usage of btdiscovery
command from the package above, or via the list of Bluetooth services. HFP voice is 111e
, A2DP music is 110b
.
Per btcom
command line help:
Usage:
btcom {-c|-r} {-bBluetoothAddress | -nFriendlyName} [-s{sp|dun|GUID|UUID}] -c Create association between COM port and a remote service (Enable non-COM service). -r Remove association between COM port and a remote service (Disable non-COM service). -s Remote service to use (Default is Serial Port Service) -b Bluetooth address of remote device in (XX:XX:XX:XX:XX:XX) format. -n Friendly name of remote device.
To disconnect the device, issue the following (only works when run as administrator in my case, using Windows 10 1809 (17763.437)):
"C:\Program Files (x86)\Bluetooth Command Line Tools\bin\btcom" -n "WH-1000XM3" -r -s111e
"C:\Program Files (x86)\Bluetooth Command Line Tools\bin\btcom" -n "WH-1000XM3" -r -s110b
To connect again, issue the same with -c
instead of -r
. This works for other devices, not just headphones, as long as all services/profiles connected to by Windows get disabled/enabled.
Note: using -n <friendly name>
is much slower than using -b <address>
due to performing Bluetooth discovery.