如何以主角色连接到HC05?

时间:2017-12-28 14:24:48

标签: android bluetooth

在我的Android应用程序中,我创建了一个侦听BluetoothDevice.ACTION_ACL_CONNECTEDBluetoothDevice.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");                
        }
    }
};

Here you can see and the logs I received

所以当我检测到我的wifi或检测到另一个接近蓝牙的设备时,我想知道不是连接到HC05,而是当它处于从属模式并且必须打开插座时,我可以用它知道什么时候HC05在范围内,然后连接到它。

2 个答案:

答案 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\nAT+INIT\r\nAT+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()后处理了连接。

来自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;
}