Подпишитесь на ANCS на Android

На основе перечисленных служб здесь, я пытаюсь подписаться на услугу с устройства Android, но не могу заставить работать часть запроса. Пытался рекламировать с помощью 7905F431-B5CE-4E99-A40F-4B1E122D00D0, но периферийное устройство не отображается в списке Bluetooth-устройств iPhone. Также играл со сканированием (LE) и фильтрами, чтобы обнаружить сервер ANCS без везения. Любой намек?

редактировать: код

BleService.java

public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
                                          boolean enabled) {
    Log.d(TAG, "setCharacteristicNotification");
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.DESCRIPTOR));
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor)
}

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
    }
}

SampleGattAttributes.java

public class SampleGattAttributes {
    public static String ANCS_SERVICE = "7905F431-B5CE-4E99-A40F-4B1E122D00D0";
    public static String NOTIFICATION_SOURCE = "9FBF120D-6301-42D9-8C58-25E699A21DBD";
    public static String DATA_CONTROL = "22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB";
    public static String DESCRIPTOR = "00002902-0000-1000-8000-00805f9b34fb";
}

MainActivity.java

private void displayServices(List<BluetoothGattService> services) {
    for (BluetoothGattService service : services) {
        if (service.getUuid().compareTo(UUID.fromString(ANCS_SERVICE)) == 0) {
            for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
                Log.d(TAG, "charac: " + characteristic.getUuid());
                for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
                    Log.d(TAG, "desc: " + descriptor.getUuid());
                }
                if (characteristic.getUuid().compareTo(UUID.fromString(NOTIFICATION_SOURCE)) == 0) {
                    bleService.setCharacteristicNotification(characteristic, true);
                }
            }
        }
    }
}

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BleService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            displayServices(bleService.getSupportedGattServices());
        }
    }
};

обновление: я могу найти службы и характеристики после подключения к службе, рекламируемой на iPhone. Однако подписка на уведомления не вызывает onCharacteristicChanged при получении уведомления на iPhone.

update2: все вызовы записи descriptor.setValue успешны и выполняются последовательно.

update3: использована часть кода из этого примера.

update4: тестовые устройства: Nexus 5X Android 6.0.1; iPhone 6S+ iOS 10.3.1

update5: журналы BT

запрос на запись введите здесь описание изображения

написать ответ введите здесь описание изображения


person mbmc    schedule 18.04.2017    source источник
comment
Ну, в устройствах Nexus перейдите в параметры разработчика, есть один флажок, который включает журнал отслеживания Bluetooth HCI. Когда вы включите его, устройство будет регистрировать все, что происходит в стеке Bluetooth... см. журнал, хранящийся на SD-карте, который называется HCIsnoop.log. Когда у вас есть файл на жестком диске, загрузите это программное обеспечение (бесплатно): fte.com/support/, чтобы просмотреть этот файл журнала BT. Благодаря этому вы можете видеть любой пакет, который был передан с одного устройства на другое (например, Wireshark для BT).   -  person PN10    schedule 21.04.2017
comment
Как вы можете опубликовать это приложение на Github? Простой клиент ANCS для Android был бы потрясающим   -  person Jason    schedule 05.12.2017
comment
Удалось ли вам получать уведомления с iOS на Android?   -  person Solvek    schedule 28.08.2019


Ответы (2)


О, у меня была похожая проблема, убедитесь, что вы не используете локальные уведомления при тестировании на iOS, так как они не будут распространяться через ANCS. Вам нужны настоящие push-уведомления по любой причине.

person Keith    schedule 21.04.2017

Недавно я столкнулся с похожей проблемой. Что я в конечном итоге сделал, чтобы решить эту проблему, так это добавил writeDescriptor к моему BluetoothGatt. Мой setCharacteristicNotification теперь выглядит так:

public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
    Log.w(TAG, "BluetoothAdapter not initialized");
    return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
}

Возможно, если бы вы могли опубликовать/связать свой код, я смог бы дополнительно диагностировать вашу точную проблему, но приведенный выше код был решением моей проблемы.

person lax1089    schedule 20.04.2017