Подтвердить что ты не робот

Как Android может передавать локальное имя BLE, например, в iOS?

У меня есть реклама приложений для 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?

Спасибо!

4b9b3361