Android中的BLE广告,带有自定义BT适配器名称,无需触摸系统

时间:2016-09-24 09:57:31

标签: android bluetooth bluetooth-lowenergy advertisement

我们为BLE通信建立了一个自定义协议。 在此协议中,我们使用设备名称作为智能手机和信标之间通信的区分值,并使用UUID作为数据有效负载。

所以在我的代码中我有:

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//Needed for let the protocol work
bluetoothAdapter.setName("CUSTOMAA");

//Get Advertiser
BluetoothLeAdvertiser bluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser();

//Configure advertiser
AdvertiseSettings settings = new AdvertiseSettings.Builder()
                        .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
                        .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
                        .setConnectable(true)
                        .build();

//Uuid is another important part of our protocol
AdvertiseData advertiseData = new AdvertiseData.Builder()
                                .setIncludeDeviceName(true)
                                .addServiceUuid(getUuid())
                                .build();

//Start Advertising
bluetoothLeAdvertiser.startAdvertising(settings, advertiseData, advertiseCallback);

它工作正常但是,当应用程序打开时,如果我用其他设备搜索智能手机蓝牙,出现的名称是" CUSTOMAA"而不是我在蓝牙设置页面中设置的那个(例如" Marco")。 如果我关闭应用程序然后关闭蓝牙或重新启动手机,原来的名称就会恢复。

有没有办法发送带有自定义设备名称的广告数据而不触及其他通信的原始数据(例如,用于广告的系统BluetoothAdapter的"副本")

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,这是我的想法

我从这里使用了这个示例项目: https://developer.android.com/samples/BluetoothAdvertisements/index.html

在课程AdvertiserService.java中,方法buildAdvertiseData()

我添加这一行:

dataBuilder.addServiceData(Constants.Service_UUID,"my_device_name".getBytes());

这个将使用service_UUID进行广泛使用 我添加了service_UUID数据" my_device_name"在bytes[]

SampleScanCallback内的内部ScannerFragment.java, 方法onScanResult

我可以通过get service_UUID数据获取ScanResult

ScanResult.getScanRecord().getServiceData().get(Constants.Service_UUID)

那是我的解决方案

希望这个帮助

答案 1 :(得分:0)

这不是最大的解决方案,当然很难保证它可以在所有设备上正常工作,但是您可以尝试以下方法:

  1. 根据问题中的说明,准备AdvertiseSettingsAdvertiseData
  2. BluetoothAdapter的当前名称保存到某个临时变量中。
  3. 设置BluetoothAdapter的目标广告名称。请等待,直到该名称“下沉”并应用:您可以在某个while周期内执行此操作,但要使用已应用适配器名称的中断条件:bluetoothAdapter.name == "TARGET_DEVICE_NAME_FOR_ADVERTISING"。当然,最好将此循环放置在主线程之外的某个位置,并有一个回调函数来完成该循环。
  4. 应用了目标设备名称后,按照问题中所述开始广告。
  5. 以第三步中描述的方式恢复在第二步中保存的适配器名称。

如果用户在第三步和第四步中手动更改适配器名称,则可能存在争用情况。