BluetoothServerSocket 在接受时挂起

BluetoothServerSocket hangs on accept

我看过许多关于这个特定问题的其他帖子,所有结果都对我没有帮助或与我的案例相关。

这是我的问题,我正在尝试设置一个蓝牙微微网,其中一个节点作为服务器,7 个作为客户端,每个节点都有一个数字作为位置代表,从 0(服务器)开始到 7 (客户)。目前我正试图让它只适用于两个设备,服务器和一个客户端。我假设他们已经配对。在下面的代码中uuid是

private UUID uuid=UUID.fromString("0000111f-0000-1000-8000-00805f9b34fb");

这是我的接受传入连接的线程,广告只是蓝牙适配器

 private class BTServerThread implements Runnable{

    @Override
    public void run() {
        try {
            if (ad != null) {
                if (ad.isEnabled()) {
                    BluetoothServerSocket btss=ad.listenUsingInsecureRfcommWithServiceRecord("MyApp",uuid);
                    Location=0;
                    Integer loc=1;
                    Log.wtf("Server","Searching");
                    while(loc<=7){
                        Thread t=new Thread(new BTServerHandler(btss.accept(),loc));
                        t.start();
                        Log.wtf("BTS","Found");
                        loc++;
                    }

                } else {
                    Log.e("error", "Bluetooth is disabled.");
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

这是我尝试连接的客户端线程

 private class BTClientThread implements Runnable{

    @Override
    public void run() {
        try {
            if (ad != null) {
                if (ad.isEnabled()) {
                    Set<BluetoothDevice> bondedDevices = ad.getBondedDevices();
                    if (bondedDevices.size() > 0) {
                        Iterator<BluetoothDevice> iter = bondedDevices.iterator();
                        BluetoothDevice device = iter.next();
                        Log.wtf("dev", device.getName());
                        BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                        clientsocket.connect();
                        Log.wtf("Connected",device.getName());
                    }

                    Log.e("error", "No appropriate paired devices.");
                } else {
                    Log.e("error", "Bluetooth is disabled.");
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

屏住呼吸,奇怪的部分来了,调用 btss.accept() 永远挂起(甚至 return 一次都没有),同时客户端设备以某种方式连接.当我打电话给

BluetoothSocket clientsocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                 clientsocket.connect()

这会弹出 phone 上的吐司,它挂在接受说 "DeviceName connected" 上,然后过了一会儿它会弹出另一个吐司,它自己说 "DeviceName disconnected",而我什么都不做,同时服务器 phone 仍然挂在接受上。

这是我的问题,为什么当 toast 弹出说连接时它挂在接受上?当另一个 phone 仍在侦听连接时,它怎么可能连接?

感谢您的帮助。

事实证明,使用那个特定的 UUID 导致了一些我仍然不明白的原因?在尝试了很多随机的事情之后,我最终决定尝试另一个随机的 UUID,这神奇地让它起作用了。 这是我的新 UUID

private UUID uuid = UUID.fromString("56e8a14a-80b3-11e5-8bcf-feff819cdc9f");