我需要通过Android手机向蓝牙设备(CSR8670)发送命令 我想过使用RFCOMM,我可以达到发现蓝牙设备的程度 发现后我使用了
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
device.createBond();
将蓝牙芯片与Android手机配对 配对步骤似乎工作正常,因为我可以看到芯片使用手机的内置蓝牙设置界面与手机配对,但我不知道如何在此之后继续,因为我似乎已经撞墙了
接下来我做的是
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和I read here这就是我应该如何将16位UUID转换为正确的128位UUID)。此外,无论我作为参数提供什么,listenUsingRfcommWithServiceRecord()函数似乎立即返回,因此不匹配的UUID可能不是我问题的唯一原因。
调用上述函数后,我调用
btSocketForCSRComm = serverSocketForCSRComm.accept();
当调用此函数时,应用程序似乎卡住了。我相信accept()是一个阻塞函数,并且在建立与BluetoothSocket的正确连接之前不会返回,这应该是应用程序卡住的原因。在这一点上,我有一堵墙,所以我试图从Android开发者的网站上学习Bluechat示例程序。
我的问题是,Bluechat计划中的配对究竟如何?我可以看到函数调用发现新设备以及获取以前绑定的设备列表,但是我找不到对createBond()函数的调用,我不确定代码的哪个部分正好被用于配对已发现的设备。我现在没有两个安卓设备也无济于事,所以我甚至无法对Bluechat代码进行示例运行以查看它的实际运行情况。
请指出我在Bluechat程序中执行已发现设备的实际配对的部分,或者请让我知道配对的替代方式(此时我非常有信心它应该存在,但是我除了使用BluetoothDevice类中的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;
}
答案 0 :(得分:0)
这不是答案,而是一些观察结果。
我在我的两部Android手机上尝试了BluetoothChat示例,一台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框架会在连接过程中自动向用户显示配对请求通知或对话
但是,当我第一次运行BluetoothChat应用程序时,对话框没有显示出来。 (它确实出现在后续运行中,但这次连接失败了。)
第一次运行后,我退出了应用程序。每个设备都保留在其他设备的Android蓝牙设置和#34;可用设备"列表,但这两部手机没有配对。
我还查看了Android SDK蓝牙文件夹中包含的文件中的源代码。有三种方法的名称以createBond
开头,但在文件BluetoothTestUtils.java
中只调用其中一种方法,并且只调用一次。当然,这并不意味着配对永远不会完成,但显然,如果在聊天会话期间曾发生过配对,则不会直接调用createBond
来执行配对。