在我的Android应用程序中,我创建了一个侦听BluetoothDevice.ACTION_ACL_CONNECTED
和BluetoothDevice.ACTION_ACL_DISCONNECTED
的广播接收器。当HC05处于主要角色时,它会定期一个接一个地进入这两个动作,它永远不会停止。
private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
Log.d(TAG1, device.getAddress() + "ACTION_ACL_CONNECTED");
}
if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
Log.d(TAG1, device.getAddress() + "ACTION_ACL_DISCONNECTED");
}
}
};
所以当我检测到我的wifi或检测到另一个接近蓝牙的设备时,我想知道不是连接到HC05,而是当它处于从属模式并且必须打开插座时,我可以用它知道什么时候HC05在范围内,然后连接到它。
答案 0 :(得分:0)
这是解决方案广播接收器:
private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
Log.d("Test", "DVC CON " + device.getAddress());
if (device.getAddress().equals("98:D3:31:FB:2A:CE")) {
BluetoothSocket socket = null;
String data = "/0";
byte[] bytes = data.getBytes();
try {
BluetoothServerSocket bluesocketserver = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("", BTModuleUUID);
socket = bluesocketserver.accept();
if(socket.isConnected())
socket.getOutputStream().write(bytes);
} catch (IOException e) {
Log.d("Test", e.getMessage());
e.printStackTrace();
}
}
}
}
};
将这些命令与显示的订单AT+ROLE=1\r\n
,AT+INIT\r\n
和AT+BIND=<Bluetooth Address>\r\n
一起使用,以接收广播。使用这些命令后,将HC05模块置于正常模式。仅当Android设备可被发现时才会收到广播。
答案 1 :(得分:-1)
我遇到了同样的问题。您无法避免触发这些事件,因为它们是由Android操作系统发送的。这是因为您的HC05使用安全简单配对(SSP)过程。
如果您通过BluetoothSocket.connect()
连接到HC05,您的手机将作为从属设备连接,HC05将作为主设备连接。
要让您的手机成为主角色,意味着您的HC05必须初始化连接,并且您的手机必须接受listenUsingRfcommWithServiceRecord()的传入连接。
有关详细信息,请参阅this guide。
请注意,您的手机只能有一个Master,直到7个Slaves。
要解决我的问题,我没有听BluetoothDevice.ACTION_ACL_CONNECTED
,我在致电BluetoothSocket.connect()
后处理了连接。
此方法将阻止,直到建立连接或连接失败。如果此方法返回时没有异常,则此套接字现已连接。
这是一个线程的样本
//Thread.java
@Override
public void run() {
try {
mSocket.connect();
// Handle the connection here
handleConnectedSocket(mSocket);
} catch (IOException connectException) {
// Unable to connect; close the socket and return.
try {
mSocket.close();
} catch (IOException closeException) {
Log.e(TAG, "Could not close the client socket", closeException);
}
return;
}
}
如果触发了handleConnectedSocket()
,则表示您已成功连接到您的设备。
然后我在上面的方法中将boolean connected
类属性设置为true
(先前初始化为false
),并使用getter:
//Thread.java
private void handleConnectedSocket(BluetoothSocket socket) {
connected = true;
// Manage your connection here
}
public boolean isConnected() {
return connected;
}
最后,在BroadcastReceiver
中,您可以检查您是否已关联:
if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
// Check if we previously were connected
if (mThread.isConnected()) {
mThread.handleDisconnection();
}
}
注意:在handleConnectedSocket()
中,您可以通过蓝牙设备,然后按照您上面的相同流程运行,以便更好地检查您的身份BroadcastReceiver
{1}}:
if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
String deviceName = device.getName();
// Check if the disconnecting device corresponds to the managed connection
if (deviceName != null && deviceName.equals(mThread.getDeviceName())) {
mThread.handleDisconnection();
}
}
getDeviceName()
的位置:
//Thread.java
@Nullable
static String getDeviceName() {
return connected ? mDevice.getName() : null;
}