У меня есть реклама приложений для Android с широковещательными данными с сервисным uuid и локальным именем. Проблема заключается в том, что это "локальное имя" (например, имя устройства Bluetooth) ограничено 8 символами, каждый из которых представляет собой 16-разрядное уникодальное представление, таким образом, 2 байта на символ. В любое время, когда я пытаюсь изменить имя устройства на 9 символов, не удается запустить широковещательную передачу из-за ошибки 1, которая
public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;
Я знаю, что широковещательный пакет профиля GAP имеет длину 27 байтов, а 7 - заголовки, поэтому 20 должны оставаться свободными для использования, а не только 16?
Здесь настоящий рассол, который щекочет мой никель:
Когда iOS транслирует заголовок рекламы, я получаю полное локальное имя устройства как часть ScanRecord, а не только 16 байт. Только часть трансляции, я не устанавливаю соединение GATT здесь.
Как iOS может это сделать? Например, на моем Android я смог получить 14-значный уникальный 28-байтовый идентификатор из рекламной рекламы iOS. 28 байтов длиннее 27-байтового ограничения, установленного стандартом bluetooth 4.0. Как получилось, что Android смог получить полную трансляцию длиной более 27 байтов? И как получилось, что мое "локальное имя" или имя устройства может содержать не более 8 символов или 16 байтов, или он не сможет начать вещание?
Это мой код:
final BluetoothLeAdvertiser advertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
//advertise settings
final AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
settingsBuilder.setConnectable(true);
settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
//advertise data
AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
ParcelUuid uuid = new ParcelUuid(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
dataBuilder.addServiceUuid(uuid);
mBluetoothAdapter.setName("12345678"); //8 characters works, 9+ fails
dataBuilder.setIncludeDeviceName(true);
if (advertiser!=null) {
advertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), mAdvertiseCallback);
}
mAdvertiseCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
Log.d(LOGN, "BLE STARTED ADVERTISING BROADCAST "+settingsInEffect);
}
@Override
public void onStartFailure(int errorCode) {
super.onStartFailure(errorCode);
Log.d(LOGN, "BLE ADVERTISING FAILED TO START: "+errorCode);
}
};
Есть ли способ, чтобы Android включал полное локальное имя как часть трансляции, например iOS?
Спасибо!