android - 如何设置 BLE 通告数据包的设备名称字段

标签 android bluetooth-lowenergy

我使用 API 来构建广告数据包。我将 true 传递给 setIncludeDeviceName

    AdvertiseData data = new AdvertiseData.Builder()
            .setIncludeDeviceName(true)
            .setIncludeTxPowerLevel(false)
            .addServiceUuid(new ParcelUuid(TimeProfile.TIME_SERVICE))
            .build();

API 对广告数据包中的设备型号进行编码。然而,对于我的应用程序,广告数据包的设备名称应该来自硬编码到应用程序中的字符串

private static final String DEVICE_NAME = "My_Device_Name";

有没有办法自定义广告包中的设备名称?我在 AdvertiseData 的文档中没有看到任何方法可以做到这一点或 AdvertiseData.Builder

最佳答案

您必须从您的数据 AdvertiseData 中删除“setIncludeDeviceName” 对象并定义扫描响应 AdvertiseData 对象

AdvertiseData scanResponse = new AdvertiseData.Builder()
        .setIncludeDeviceName(true)
        .build();

然后也使用 scanResponse 开始广告

bluetoothAdapter.getBluetoothLeAdvertiser()
          .startAdvertising(advSettings, data, scanResponse, advCallback);

完整示例:

AdvertiseSettings advSettings = new AdvertiseSettings.Builder()
    .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
    .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
    .setConnectable(true)
    .build();

AdvertiseData advData = new AdvertiseData.Builder()
    .setIncludeTxPowerLevel(true)
    .addServiceUuid(mCurrentServiceFragment.getServiceUUID())
    .build();

AdvertiseData advScanResponse = new AdvertiseData.Builder()
    .setIncludeDeviceName(true)
    .build();

AdvertiseCallback advCallback = new AdvertiseCallback() {
    @Override
    public void onStartFailure(int errorCode) {
        super.onStartFailure(errorCode);
        Log.e(TAG, "Not broadcasting: " + errorCode);
        int statusText;
        switch (errorCode) {
            case ADVERTISE_FAILED_ALREADY_STARTED:
                Log.w(TAG, "ADVERTISE_FAILED_ALREADY_STARTED");
                break;
            case ADVERTISE_FAILED_DATA_TOO_LARGE:
                Log.w(TAG, "ADVERTISE_FAILED_DATA_TOO_LARGE");
                break;
            case ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
                Log.w(TAG, "ADVERTISE_FAILED_FEATURE_UNSUPPORTED");
                break;
            case ADVERTISE_FAILED_INTERNAL_ERROR:
                Log.w(TAG, "ADVERTISE_FAILED_INTERNAL_ERROR");
                break;
            case ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
                Log.w(TAG, "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS");
                break;
            default:
                Log.wtf(TAG, "Unhandled error: " + errorCode);
        }
    }

    @Override
    public void onStartSuccess(AdvertiseSettings settingsInEffect) {
        super.onStartSuccess(settingsInEffect);
        Log.v(TAG, "Advertising started");
    }
};

bluetoothAdapter.getBluetoothLeAdvertiser()
          .startAdvertising(advSettings, advData, advScanResponse, advCallback);

关于android - 如何设置 BLE 通告数据包的设备名称字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229859/

相关文章:

ios - iOS什么时候显示 "need to bond"对话框?

android - 对包含两种数据类的 ArrayList<Any> 进行排序

java - Android 中的序列化?

android - 使用 Kotlin 协程替换 BLE 回调

c++ - Qt Bluetooth Low Energy - 使用非标准 GATT 的问题

java - 如何解析蓝牙服务的128位uuid?

Android:将边距设置为单选按钮可绘制的左侧

android - 从 ListView 中删除项目 onlongclick

java - android,从长字符串中提取值

java - 无需连接设备的 Ble 扫描服务