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

Android BLE外围设备模式:未检测到自定义特征

李奕
2023-03-14

我正在尝试在Sony SmartWatch 3上实现BluetoothGattServer。

我可以成功地打开Gatt服务器并做广告。

使用BLE扫描仪应用程序,我在发现我的自定义服务及其自定义特征时得到不一致的结果。

  1. 在三星Galaxy Note 8-Android 4.4-上,我可以正确检测自定义服务和自定义特性

这是我在Wear设备上运行的代码:

public final class BluetoothServer extends BluetoothGattServerCallback{
    private final static String TAG = BluetoothServer.class.getSimpleName();
    private final static String BASE_UUID = "0000%s-0000-1000-8000-00805f9b34fb";


    public final static UUID MAIN_SERVICE = UUID.fromString(String.format(BASE_UUID, "FEE0"));
    public final static UUID CHARAC_REQUEST = UUID.fromString(String.format(BASE_UUID, "FEE01"));
    public final static UUID CHARAC_RECORDING = UUID.fromString(String.format(BASE_UUID, "FEE02"));


    private final BluetoothGattServer gattServer;

    private final BluetoothGattService mainServer;
    private final BluetoothGattCharacteristic requestCharacteristic;
    private final BluetoothGattCharacteristic recordingCharacteristic;

    public BluetoothServer(@NonNull final Context context) {
        final BluetoothManager btManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
        final BluetoothAdapter btAdapter = btManager.getAdapter();

        this.gattServer = btManager.openGattServer(context.getApplicationContext(), this);

        this.mainService= new BluetoothGattService(MAIN_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);


    this.requestCharacteristic = new BluetoothGattCharacteristic(CHARAC_REQUEST, BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);
    this.recordingCharacteristic = new BluetoothGattCharacteristic(CHARAC_RECORDING, BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);

        this.mainService.addCharacteristic(this.requestCharacteristic);
        this.mainService.addCharacteristic(this.recordingCharacteristic);

        this.gattServer.addService(this.mainService);

        final BluetoothLeAdvertiser advertiser = btAdapter.getBluetoothLeAdvertiser();
        btAdapter.setName("Test Wear");
        final AdvertiseSettings settings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
                .setConnectable(false)
                .build();

        final ParcelUuid pUuid = new ParcelUuid(MAIN_SERVICE);
        final AdvertiseData data = new AdvertiseData.Builder()
                .setIncludeDeviceName(true)
                .addServiceUuid(pUuid)
                .build();

        final AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
            @Override
            public final void onStartSuccess(final AdvertiseSettings settingsInEffect) {
                super.onStartSuccess(settingsInEffect);
                Log.i(TAG, "Started advertisement with success");
            }

            @Override
            public final void onStartFailure(final int errorCode) {
                Log.e(TAG, "Advertising onStartFailure: " + errorCode );
                super.onStartFailure(errorCode);
            }
        };

        advertiser.startAdvertising(settings, data, advertisingCallback );
    }

    //[... the rest of the callbacks implementation ...]
}

我还尝试使用自定义生成的UUID从https://www.uuidgenerator.net/,但这样做是更糟糕:要么我不能与名称包括广告,或者如果我不包括名称,那么BLE扫描仪应用程序将不会在所有设备上拾取我的自定义服务。

我做错了什么?

共有1个答案

吴高峰
2023-03-14

是否检查了onStartFailure()方法?

还有一件事,不要在AdvertiseData中添加UUID,而是在此处添加代码。。!

public BluetoothServer(@NonNull final Context context) {
    final BluetoothManager btManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
    final BluetoothAdapter btAdapter = btManager.getAdapter();

   this.mainService= new BluetoothGattService(MAIN_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);


this.requestCharacteristic = new BluetoothGattCharacteristic(CHARAC_REQUEST, BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);
this.recordingCharacteristic = new BluetoothGattCharacteristic(CHARAC_RECORDING, BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);

    this.mainService.addCharacteristic(this.requestCharacteristic);
    this.mainService.addCharacteristic(this.recordingCharacteristic);

    this.gattServer.addService(this.mainService);

    final BluetoothLeAdvertiser advertiser = btAdapter.getBluetoothLeAdvertiser();
    btAdapter.setName("Test Wear");
    final AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
            .setConnectable(true) //Set it true
            .build();

    final ParcelUuid pUuid = new ParcelUuid(MAIN_SERVICE);
    final AdvertiseData data = new AdvertiseData.Builder()
            .setIncludeDeviceName(true)
    //Remove this line
            .addServiceUuid(pUuid)
            .build();

    final AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
        @Override
        public final void onStartSuccess(final AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);
            Log.i(TAG, "Started advertisement with success");
        }

        @Override
        public final void onStartFailure(final int errorCode) {
            Log.e(TAG, "Advertising onStartFailure: " + errorCode );
            super.onStartFailure(errorCode);
        }
    };

   //Line 1 Changed
   this.gattServer = btManager.openGattServer(context.getApplicationContext(), this);

    advertiser.startAdvertising(settings, data, advertisingCallback );
}
 类似资料:
  • 我正在尝试为log4j2.0创建一个自定义appender,但是在获取log4j配置以识别appender时遇到问题。我知道log4j 2.0不支持配置属性中的包。因此,正如这里所建议的,我尝试使用纯javac运行代码,但即使如此,它也会出现以下错误: 这是我的自定义附件: 和我的配置xml: 提前感谢您提供的有用信息

  • 问题内容: 我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID FFF0中的FFF1)读取一些数据。 如果要查找其信息的特征是,我可以使用以下代码请求特征的读取: 我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。 例如:如果发现的值为X,则执行其他操作;

  • 我的应用程序无法检测外设。我用浅蓝色来模拟蓝牙低能量外设,我的应用程序就是感觉不到。我甚至在两台设备上安装了浅蓝色,以确保它能正确地生成外围信号,并且是正确的。有什么建议吗?我的标签正在更新,NSLog显示扫描正在开始。 提前谢谢。

  • 获取设备配置信息 根据业务需求获取设备 配置的各种信息。 参数说明 字段 类型 必须 备注 device RKDevice 是 设备 namespace String 是 存储空间、根据业务填写 key String 是 信息存储Key 示例代码 Swift: RokidMobileSDK.device.getServiceInfo(device: RKDevice, namespace: Str

  • 获取设备配置信息 根据业务需求获取设备 配置的各种信息。 参数说明 字段 类型 必须 备注 deviceId String 是 设备Id namespace String 是 存储空间、根据业务填写 key String 是 信息存储Key 示例代码: Kotlin val deviceId: String = "XXX" val namespace: String = "YYY" val ke

  • 问题内容: 我已经将我的log4j2自定义插件打包到一个单独的jar中(仅包含插件类),并将其放在应用程序类路径中。但是不会被检测到。 我用谷歌搜索发现它是一个错误-“ packages”参数不再使用。还有一些链接建议了一些替代方案,其中将maven pom.xml和log4j2插件dat文件放入上下文中。问题是我不熟悉Maven,并且不知道如何生成dat文件。我只知道它包含在log4j-2.1-