Как настроить рекламу в android для ios для обнаружения - PullRequest
0 голосов
/ 02 апреля 2020

При моей текущей конфигурации другое устройство android может считывать установленный UUID просто отлично, но когда дело доходит до iOS, мой коллега получает варианты UUID из этой рекламы / трансляции GATT. Мне действительно нужно транслировать ГАТТ для iOS, чтобы обнаружить меня?

Запуск рекламы:

@ReactMethod
private void advertise(Callback advCallBack) {
    ...
    private static UUID myUUID = UUID.fromString("A85A30E5-93F3-42AE-86EB-33BFD8133597");

    AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH).setConnectable(false).build();

    ParcelUuid pUuid = new ParcelUuid(myUUID);

    AdvertiseData data = new AdvertiseData.Builder().setIncludeDeviceName(false).addServiceUuid(pUuid)
            .setIncludeTxPowerLevel(true).build();

    AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);
        }

        @Override
        public void onStartFailure(int errorCode) {
            super.onStartFailure(errorCode);
        }
    };

    advertiser.startAdvertising(settings, data, advertisingCallback);
}

Запуск сервера ГАТТ:

@ReactMethod
private void startServer(Callback srvCallBack) {
    mBluetoothGattServer = mBluetoothManager.openGattServer(getReactApplicationContext(), mGattServerCallback);
    if (mBluetoothGattServer == null) {
        srvCallBack.invoke(false);
        return;
    }

    mBluetoothGattServer.addService(new BluetoothGattService(myUUID, BluetoothGattService.SERVICE_TYPE_PRIMARY));

    srvCallBack.invoke(true);
}

private BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
    @Override
    public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            return;
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            return;
        }
    }
};

Мы не нам не нужно соединяться друг с другом, нам просто нужно отсканировать его существование и, возможно, передать биты информации, которые я не могу сделать прямо сейчас с android, потому что простое включение имени устройства дает мне код ошибки 1, который в основном означает, что полезная нагрузка превышает разрешенные 31 байт для рекламного пакета. Любой совет?

1 Ответ

0 голосов
/ 03 апреля 2020

Я решил проблему, включив в данные сервиса serviceData.

      AdvertiseData advertiseData = new AdvertiseData.Builder().setIncludeDeviceName(true)
                .addServiceUuid(new ParcelUuid(SERVICE_UUID)).addServiceData(new ParcelUuid(SERVICE_UUID), serviceData)
                .setIncludeTxPowerLevel(true).build();
...