Bluechat示例程序的哪一部分配对已发现的设备?

时间:2014-12-29 08:05:50

标签: android bluetooth rfcomm

我需要通过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;
}

1 个答案:

答案 0 :(得分:0)

这不是答案,而是一些观察结果。

我在我的两部Android手机上尝试了BluetoothChat示例,一台MOTO G(主机)和一台三星Galaxy S III(奴隶机)。在测试之前,清除了缓存,以便两个设备不配对。

我已经插入了一些Logcat调试消息来打印

的值
  

BluetoothAdapter.getDefaultAdapter().getBondedDevices().size()

在每次调用以下方法之前和之后:

  • listenUsingRfcommWithServiceRecordlistenUsingInsecureRfcommWithServiceRecord
  • BluetoothServerSocket' accept()
  • createRfcommSocketToServiceRecordcreateInsecureRfcommSocketToServiceRecord
  • BluetoothSocket' connect()getInputStream()getOutputStream()
  • 上述数据流的read()write()方法。

令人惊讶的是,在聊天过程中,getBondedDevices().size()的报告值始终为零。此外,Android API指南说明了

  

首次与远程设备建立连接后,系统会自动向用户显示配对请求。

     

...

     

注意:如果两个设备之前没有配对,那么Android框架会在连接过程中自动向用户显示配对请求通知或对话

但是,当我第一次运行BluetoothChat应用程序时,对话框没有显示出来。 (它确实出现在后续运行中,但这次连接失败了。)

第一次运行后,我退出了应用程序。每个设备都保留在其他设备的Android蓝牙设置和#34;可用设备"列表,但这两部手机没有配对。

我还查看了Android SDK蓝牙文件夹中包含的文件中的源代码。有三种方法的名称以createBond开头,但在文件BluetoothTestUtils.java中只调用其中一种方法,并且只调用一次。当然,这并不意味着配对永远不会完成,但显然,如果在聊天会话期间曾发生过配对,则不会直接调用createBond来执行配对。