当前位置: 首页 > 知识库问答 >
问题:

外设模式下的Nexus 9不接受来自客户端的连接或不响应客户端请求?

罗奇文
2023-03-14

我在外设模式下使用Nexus 9。我创建了一个GATT服务器实例:

mGattServer = mBluetoothManager.openGattServer(this, mBluetoothGattServerCallback);

我创建了一个BluetoothGattService

BluetoothGattService service =new BluetoothGattService(SERVICE_UUID,
            BluetoothGattService.SERVICE_TYPE_PRIMARY);

BluetoothGattCharacteristic offsetCharacteristic =
            new BluetoothGattCharacteristic(CHARACTERISTIC_NUM_UUID,
                    //Read+write permissions
                    BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE,
                    BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PERMISSION_WRITE);

service.addCharacteristic(offsetCharacteristic);

mGattServer.addService(service);

BluetoothGattServerCallBack的实例:

private BluetoothGattServerCallback mBluetoothGattServerCallback = new BluetoothGattServerCallback() {
    @Override
    public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
        //super.onConnectionStateChange(device, status, newState);
        Log.i(TAG, "onConnectionStateChange "
                + getStatusDescription(status) + " "
                + getStateDescription(newState));

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.i(TAG, "Connected..");

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i(TAG, "Disconnected..");
        }
    }

    @Override
    public void onServiceAdded(int status, BluetoothGattService service) {
        //super.onServiceAdded(status, service);
        Log.i(TAG, "onServiceAdded");
    }

    @Override
    public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
        super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
        Log.i(TAG, "onCharacteristicWriteRequest");
    }

    @Override
    public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
        super.onCharacteristicReadRequest(device, requestId, offset, characteristic);
        Log.i(TAG, "onCharacteristicReadRequest");
    }

    @Override
    public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) {
        super.onDescriptorReadRequest(device, requestId, offset, descriptor);
        Log.i(TAG, "onDescriptorReadRequest");
    }

    @Override
    public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
        super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
        Log.i(TAG, "onDescriptorWriteRequest");
    }

    @Override
    public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
        super.onExecuteWrite(device, requestId, execute);
        Log.i(TAG, "onExecuteWrite");
    }

    @Override
    public void onNotificationSent(BluetoothDevice device, int status) {
        super.onNotificationSent(device, status);
        Log.i(TAG, "onNotificationSent");
    }
};

现在,当我尝试将GATThtml" target="_blank">客户端连接到此服务器时,BluetoothGattServerCallback的onConnectionStateChange()方法从未被调用。

来自客户端应用程序的代码:

连接到运行在Nexus 9上的GATT服务器

mConnectedGatt = device.connectGatt(this, false, mGattCallback); 

BluetoothGattCallback的实例:

private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) {
            Log.i(TAG, "Connected to server");
            gatt.discoverServices();
        } else if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i(TAG, "Disconnected from server");
        } else if (status != BluetoothGatt.GATT_SUCCESS) {
            gatt.disconnect();
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {         
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {        
    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {         
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { 
    }

    @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {

    }
};

设备(Nexus 9)被发现

我试图从一些第三方应用程序连接,如“B-BLE”、“BLE扫描仪”、“蓝牙4.0浏览器”。在这些应用程序中可以发现Nexus 9,但是当我试图连接到GATT服务器时,onConnectionStateChange()中的状态总是STATE_DISCONNECTED。

任何类型的帮助将不胜感激。

提前感谢。

共有1个答案

蒋典
2023-03-14

作为第一步,检查addService(…)方法返回true-只有这样服务才能成功添加。

另外,尝试从onConnectionStateChange()方法中删除GATT_SUCCESS检查。据我所知,你不需要在那里测试...

 类似资料:
  • 按照这里的讨论,我使用以下步骤使外部客户端(基于 kafkajs)连接到 OpenShift 上的 Strimzi。这些步骤从这里开始。 被编辑为如下所示。 要提取证书并在客户端中使用它,我运行了以下命令: 请注意,我必须在我的macOS上使用,而不是,如留档所示。 这是从他们的 页面和他们的文档改编的客户端。 当我从具有的文件夹运行时,我收到一条连接拒绝消息。 我错过了什么?

  • 在Netty中创建客户端连接时,我有一个问题。 这里,为什么我们没有一个bind方法,将通道绑定到发起客户端连接的端口(在客户端)?我们唯一需要提供的就是给出服务器地址和端口如下: 这是在客户端还是服务器端创建了一个新的通道?此通道绑定在客户端的哪个端口? 我们在执行服务器端引导时进行绑定,如下所示 我很困惑,不明白客户端从哪个端口向服务器发送数据,使用的是什么通道?

  • 我在实现UDP连接时遇到了麻烦,因为当我在局域网内尝试它时,它是有效的,但是当NAT内部的人试图连接到公共服务器地址时,它会失败,因为从服务器作为响应发送的数据包永远不会到达客户端。 我的协议如下: 客户端A向服务器发送一个字节作为连接请求 服务器B为客户端创建一个新的套接字,并从那里向recvfrom()调用中报告的客户端端口响应一个字节。永远不会联系到客户 我也试过: 执行许多调用,每个调用在

  • 我使用Java.NET套接字创建了一个服务器,我尝试通过localhost客户端访问它,它正在接受请求并响应客户端,但当我尝试通过LAN电缆连接从另一台计算机远程访问它时,它不接受任何连接,即使它正在监听本地端口(9999),然后为了查看端口是否不工作,我将Apache Web Server配置为监听端口(9999),它确实工作,所以我将它设置为监听不同的端口,但没有运气,并尝试打开防火墙上的各种

  • 我刚刚开始使用Sockets,对于我当前的项目,我需要能够从客户端控制我的程序,但是如果我的项目合作伙伴想同时使用他的客户端,服务器不会向他发送“您已连接”消息,如连接类所示。所以我假设服务器不同时接受多个客户端。我尝试过使用类Connection的Thread,但这也不会向第二个客户端发送消息“您已连接”。我在这里做错了什么? 这是我用来同时连接多个用户的线程: 编辑:附加信息 在第一个客户端连

  • 我正在制作一个加密聊天应用程序,在终端中,使用socket.io-client和socket.io。客户机能够连接到服务器,但在输入用户名时不发出用户名。 客户: 服务器代码,是基于socket.io聊天示例中的代码: 我添加了一个错误事件,如果与服务器的连接失败,这将关闭客户端,所以我知道它的连接,任何帮助都很感激,我已经对这个主题进行了研究,并尝试了许多其他方法,但都无济于事。 另外,连接是在