我需要通过安卓手机向支持蓝牙的设备发送命令 (CSR8670)
我想过使用RFCOMM,我可以达到发现蓝牙设备的
地步发现后我用过
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
device.createBond();
将蓝牙芯片与安卓手机
配对直到配对步骤似乎工作正常,因为我可以看到芯片使用手机的内置蓝牙设置界面与手机配对,但我不知道之后如何进行,因为我似乎碰壁
我做的下一件事是
serverSocketForCSRComm = myBluetoothAdapter.listenUsingRfcommWithServiceRecord("Hello world", MY_UUID);
其中MY_UUID被定义为
private static final UUID MY_UUID = UUID.fromString("0000FFFF-0000-1000-8000-00805F9B34FB");
在 MainActivity 类中。我还应该指出,CSR 的文档不是很清楚,所以我需要使用大量的点击和试用来完成这个问题。我根据 CSR 芯片示例代码中的一些注释使用了上面的参数"Hello world"和MY_UUID(我愿意根据需要更改这些值;选择这个特定的 UUID 是因为 CSR 注释说该设备使用 uint16 UUID 0xFFFF,我在这里读到这就是我应该如何将 16 位 UUID 转换为正确的 128 位 UUID)。此外,无论我给出什么参数,listenUsingRfcommWithServiceRecord() 函数似乎都会立即返回,因此不匹配的 UUID 可能不是我问题的唯一原因。
调用上述函数后,我调用
btSocketForCSRComm = serverSocketForCSRComm.accept();
调用此函数时,应用程序似乎卡住了。我相信accept()是一个阻塞函数,并且在建立与蓝牙插座的正确连接之前不会返回,这应该是应用程序卡住的原因。在这一点上,我有一堵热墙,所以正在尝试从安卓开发者的网站研究蓝牙示例程序。
我的问题是,在蓝牙程序中,配对究竟是如何发生的?我可以看到用于发现新设备的函数调用以及获取以前绑定的设备列表,但我找不到对 createBond() 函数的调用,并且我不确定代码的哪一部分正用于配对发现的设备。我现在没有两台安卓设备,这无济于事,所以我甚至无法对蓝牙代码进行示例运行以查看它的运行情况。
请指出我到蓝聊天程序中的代码部分,该部分对发现的设备进行实际配对,或者请让我知道配对的替代方式(到目前为止,我很确定它应该存在,但找不到它)发现的设备除了使用蓝牙设备类中的createBond()函数。
EDIT1(为澄清评论而添加)--
public ConnectThread(BluetoothDevice device) {
Log.d("MYLOG", "ConnectThread(BluetoothDevice device) CONSTRUCTOR");
mmDevice = device;
BluetoothSocket tmp = null;
try {
Method method = device.getClass().getMethod("createBond", (Class[]) null);
method.invoke(device, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
do{
}while(device.getBondState()!=BluetoothDevice.BOND_BONDED);
Log.d("MYLOG", "Bonding complete" );
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.d("MYLOG", "createRfcommSocketToServiceRecord(MY_UUID) GONE WRONG");
Log.e(TAG, "create() failed", e);
}
mmSocket = tmp;
}
这不是一个答案,而是一些观察结果。
我在我的两部Android手机上尝试了蓝牙聊天示例,一部MOTO G(主)和一部三星Galaxy S III(从)。在测试之前,缓存已清除,以便两个设备未配对。
我插入了一些 Logcat 调试消息来打印
BluetoothAdapter.getDefaultAdapter().getBondedDevices().size()
在每次调用以下方法之前和之后:
-
listenUsingRfcommWithServiceRecord
和listenUsingInsecureRfcommWithServiceRecord
, - 蓝牙服务器插座的
accept()
, -
createRfcommSocketToServiceRecord
和createInsecureRfcommSocketToServiceRecord
, - 蓝牙插座的
connect()
,getInputStream()
和getOutputStream()
, - 上述数据流的
read()
和write()
方法。
令人惊讶的是,在聊天过程中,getBondedDevices().size()
的报告值始终为零。此外,Android API 指南说
首次与远程设备建立连接后,将自动向用户显示配对请求。
。
注意:如果两个设备之前没有配对,那么Android框架会在连接过程中自动向用户显示配对请求通知或对话框
但是,当我第一次运行蓝牙聊天应用程序时,该对话框没有显示(它确实在后续运行时显示,但这次连接失败。
第一次运行后,我退出了应用程序。每台设备都保留在另一台设备的 Android 蓝牙设置"可用设备"列表中,但两部手机未配对。
我还查看了Android SDK的蓝牙文件夹中包含的文件中的源代码。有三个方法的名称以 createBond
开头,但在文件BluetoothTestUtils.java
中只调用其中一个,并且只调用一次。当然,这并不意味着永远不会进行配对,但显然,如果在聊天会话期间曾经发生过配对,则不会通过直接呼叫createBond
来执行。