2016-09-24 14 views
4

Мы создали специальный протокол для связи BLE. В этом протоколе мы используем имя устройства как различающее значение при обмене данными между смартфоном и маяками и используем UUID в качестве полезной нагрузки данных.BLE Реклама на Android с пользовательским адаптером BT Название без касания системы

Так что в моем коде у меня есть:

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); 

Она работает правильно, но, когда приложение находится, если я искать смартфон Bluetooth с другим устройством, имя, которое появляется «CUSTOMAA» и не тот, который я установил на странице настроек Bluetooth (например, «Android от Marco»). Исходное имя вернулось, если я закрою приложение и выключись, затем в Bluetooth или перезагрузите телефон.

Есть ли способ отправить рекламные данные с пользовательским именем устройства, не касаясь оригинала для других сообщений (например, «копия» системного Bluetooth-адаптера для использования только для рекламы)?

ответ

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

я могу получить ScanResult с прибудете service_UUID данных

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

Это мой раствор

Надеюсь, что это h elp