A link layer level ioctl is provided to disconnect an baseband link without first closing the open sockets using that link. This provides the ability to quickly disconnect one or all current Bluetooth asynchronous connection-oriented links (ACL) open on a device.
The TLMDisconnectACLIoctl structure contains the device address of the remote device to be disconnected and the reason code to be supplied during the disconnection.
Basic Procedure
To directly disconnect individual Bluetooth ACL links:
Create a TLMDisconnectACLBuf packaged structure, which contains the address of the Bluetooth device to be disconnected and the reason to be given to the other device for its disconnection.
Call the KLMDisconnectACLIoctl ioctl on the socket with the link manager level KSolBtLM, passing the package buffer.
Example: Disconnecting ACL links
Here is a simple disconnect example.
Starting with an open socket
RSocket sock; ret=sock.Open(ss,pInfo.iAddrFamily,pInfo.iSockType,pInfo.iProtocol);
Identify the Bluetooth device to be disconnected and provide a reason for the disconnect.
TLMDisconnectACLBuf aclConnBuf; aclConnBuf().iDevAddr = devAddr; // devAddr is a TBTDevAddr aclConnBuf().iReason = 0x13; // Remote User Ended Connection TRequestStatus stat;
Send Ioctl command to disconnect.
sock.Ioctl(KLMDisconnectACLIoctl, stat, &aclConnBuf, KSolBtLM); User::WaitForRequest(stat);