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

android自定义可写服务的可写特性在发现时总是返回写权限零

越开畅
2023-03-14

我正在Android上创建一个定制的BLE服务,它只有一个可以读/写的特性。代码如下所示:

public static UUID MY_SERVICE = UUID.fromString("e0ec8d9c-5e4d-470a-b87f-64f433685301");
public static UUID MY_CHARACTERISTIC    = UUID.fromString("e0ec8d9c-5e4d-470a-b87f-64f433685302");

/**
 * Return a configured {@link BluetoothGattService} instance for the
 * Custom Service.
 */
public static BluetoothGattService createCustomBleService() {
    BluetoothGattService service = new BluetoothGattService(MY_SERVICE,
            BluetoothGattService.SERVICE_TYPE_PRIMARY);

    // Current Configuration characteristic
    BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(MY_CHARACTERISTIC,
            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE,
            BluetoothGattCharacteristic.PERMISSION_READ |BluetoothGattCharacteristic.PERMISSION_WRITE);


    boolean serviceAdded = service.addCharacteristic(characteristic);
    Log.i(TAG, "Building BLE service addCharacteristic returned "+serviceAdded);

    return service;
}

对add特征(...)的调用返回true。服务本身被创建,可以被广告,服务及其特性可以被客户发现。在客户端代码的其他地方,在定位所述服务的BLE扫描之后,运行的发现代码如下所示:

            for (BluetoothGattService service : gatt.getServices()) {

                serviceUuid = service.getUuid().toString();

                if( MY_SERVICE.toString().equals(serviceUuid)  ) {
                    List<BluetoothGattCharacteristic> gattCharacteristics = service.getCharacteristics();
                    for( BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics ) {
                        characteristicUuid = gattCharacteristic.getUuid().toString();
                        Log.d(TAG, "onServicesDiscovered() - found characteristic uuid="+characteristicUuid);
                        int cProps = gattCharacteristic.getProperties();
                        Log.d(TAG, "onServicesDiscovered() - found characteristic properties "+cProps);
                        if ((( MY_CHARACTERISTIC.toString().equals(characteristicUuid)  ))&&((cProps & BluetoothGattCharacteristic.PROPERTY_WRITE)>0)) {

                         writeCharacteristic(gatt,gattCharacteristic,"configStringLiteral");
                        }

                    }
                }

            }

正如我所提到的,当这个服务发现代码运行时,它会发现定制服务和定义的特征。我为特征属性设置的任何值都会在客户端发现时正确显示。该特性显示为可写。

问题是,即使属性表示其可写,特征写入也总是失败。

有人见过这个吗?。。。或者我在做一些愚蠢的事情,并且已经看了太久。

(顺便说一句,运行时托管自定义服务的设备是三星银河7,客户端是银河6...反之亦然,行为相同)

共有1个答案

赵英资
2023-03-14

发现服务时,权限信息不会通过BLE发送。因此,权限属性不应用于远程特征。

客户应该只检查特征属性来决定可以做什么。如果它收到一个错误,例如需要加密,蓝牙堆栈应启动加密,然后重试请求。

因此,特征属性是向客户机声明可以使用它做什么的正确方法。特征权限只告诉本地GATT服务器实现它应该如何响应传入的GATT请求。

 类似资料:
  • 我正在为在线游戏运行Netty服务器,但是我遇到了一些奇怪的行为: 随机地,通道只是停止能够从服务器写入,即用户仍然连接,传入的数据被接收,但传出的数据没有到达客户端。 我花了时间来调试这个问题,我发现channel.isWriteable()为连接有问题的客户端返回false。 有人能解释一下为什么会发生这种情况吗? 通道无法写入的原因是什么? 顺便说一句,这在本地主机连接上也会发生。 编码器:

  • 现在我知道这个问题已经被问了十亿次了。 我已经通读了其中的大部分(这个网站对我的问题没有太大帮助),我已经通读了文档,我已经通读了示例和教程。 我想做的是: 将hello world发送到可移动设备(连接到arduino) 到目前为止我所做的: 与使用内置设置的设备配对(我的应用程序中没有编程逻辑) 使用GATT服务器与设备连接。 然而,当我试图编写一个特征时,相应的状态返回布尔值总是false。

  • 在我们的Spring Boot应用程序中,我们使用Spring Cloud AWS: Spring-Cloud-Starter-AWS Spring-Cloud-AWS-AutoConfigure Spring-Cloud-AWS-Messaging 若要从SQS队列接收消息,请执行以下操作。然而,我们需要能够启动应用程序,即使队列不可访问(即“(服务:AmazonSQS;状态代码:403;错误代

  • 问题内容: 我正在尝试创建一个仅用户可读且可写的文件()。 这样做是唯一的方法吗? 理想情况下,我希望能够使用关键字,以便我可以自动关闭对象。有没有更好的方法来做我在上面做的事情? 问题答案: 有什么问题?即使已使用打开文件,也将关闭文件。

  • 有什么建议吗?它不工作在模拟器或当我在我的手机上运行它。

  • 我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。 首先,我试着阅读 健康温度计服务(UUID=00001809-0000-1000-8000-00805F9B34FB) 从服务列表中恢复特征并访问其描述符: 在这种情况下,我可以看到测量的结果在