2

我有一个充当蓝牙服务器的 Android 平板电脑,最多允许 6 个客户端连接(我设置了这个限制,知道理论上的最大值是 7,根据蓝牙 piconet 规范)。我尝试了来自同一制造商的两种不同的平板电脑型号:华为 Mediapad T3 和华为 MediaPad T5。在 T3 上,我最多可以建立 6 个保持稳定的连接,并允许与客户端几乎无缝通信。但是,在 T5 上,平板电脑不会接受超过 4 个同时连接。如果我断开一台设备,其余两台继续请求连接的设备中的一台将被接受。我没有从对 accept() 方法的调用中收到任何错误消息,也没有收到有关 Android Logcat 中蓝牙的任何其他错误。

这两款平板电脑都在 EMUI 8.0.0(Android 8.0.0 的华为 brew)下运行。

这是我为接受连接的线程运行的代码:

 private class AcceptThread extends Thread {

        private BluetoothServerSocket serverSocket;

        AcceptThread(String name, String uuidStr) {
            btAdapter.cancelDiscovery();
            try{
                serverSocket = btAdapter.listenUsingInsecureRfcommWithServiceRecord(name, UUID.fromString(uuidStr));
            } catch (IOException ex){
                onStatusListener.OnStatus("server.error.COULD_NOT_LISTEN");
                Log.e(TAG, "Could not open socket", ex);
            }
        }

        public void run() {
            onStatusListener.OnStatus("server.listening");
            while (connections.size() < maxConnections) {
                setState(STATE_LISTENING);
                try {
                    BluetoothSocket socket = serverSocket.accept();
                    if (socket != null) {
                        ConnectedThread conn = new ConnectedThread(socket);
                        setState(STATE_CONNECTING);
                        conn.start();
                        connections.add(conn);
                        conn.setOnDisconnectEvent(() -> {
                            onStatusListener.OnStatus("server.disconnected." + socket.getRemoteDevice().getAddress());
                            connections.remove(conn);
                        });
                        onStatusListener.OnStatus("server.connected." + socket.getRemoteDevice().getAddress());
                    }
                } catch (IOException ex) {
                    onStatusListener.OnStatus("server.error.COULD_NOT_ACCEPT");
                    Log.e(TAG, "Socket's accept() method failed", ex);
                    break;
                }
            }
            onStatusListener.OnStatus("server.not_listening");
            cancel();
        }

        void cancel(){
            try {
                setState(STATE_NONE);
                serverSocket.close();
            } catch (IOException e) {
                Log.e(TAG, "Could not close server socket", e);
            }
        }
    }

什么会导致我的代码在 T3 平板电脑上运行而不是在 T5 上运行?

我有什么不同的方法可以让我的 6 个同时连接同时使用两台平板电脑吗?

4

1 回答 1

1

当涉及到设备允许的最大连接数时,限制通常与硬件有关,而不是与软件有关。换句话说,是 T5 上的蓝牙硬件阻止您创建进一步的连接。两台平板电脑都运行相同的操作系统,但仍然表现出这种差异,这一点就很明显了。

我觉得奇怪的是,当您尝试超过可能的连接数时,您没有收到任何错误响应。不幸的是,我认为没有办法增加 T3 的限制。如果可能,我会联系华为,因为他们能够确认这种差异。

于 2020-12-17T09:10:35.540 回答