периферийный метод. DiscoverCharacteristic в Core Bluetooth — Xamarin

Я создаю приложение Xamarin.Ios Bluetooth, и мой вопрос следующий:

Есть ли способ узнать характеристики всех сервисов на периферии сразу. Я имею в виду, что если у меня есть три службы (a,b,c) и я вызываю периферийное.discoverCharacteristic(a); три раза a, b, c, а затем получить характерный обратный вызов для обнаружения характеристик всех обнаруженных характеристик всех услуг. Я знаю, что он может выполнять обратный вызов каждый раз, когда я вызываю периферийное. Это мое требование использования. Пожалуйста помоги !


person Bhupinder Singh    schedule 14.04.2014    source источник


Ответы (3)


Невозможно напрямую.

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

person Etan    schedule 14.04.2014

Хорошо, в xamarin это работает только с обнаружением характеристик для службы, а не с пакетным обнаружением. Мне нужно будет обнаружить характеристики для данной службы одну за другой, обработать их и снова обнаружить для следующей службы, как объяснил Итан в первом ответе. Это работает для меня и подумает о том, чтобы соответствующим образом изменить мои требования к варианту использования. Спасибо Всем за то, что поделились своими мыслями.

person Bhupinder Singh    schedule 15.04.2014

Когда я обнаруживаю службы CBPeripheral, я вызываю discoverCharacteristics один раз и сообщаю все характеристики, которые мне нужны;

for (CBService *service in peripheral.services)
{
    DDLogInfo(@"Kicking discovery of characteristics for servive %@", service);
    [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:CHARACTERISTIC_A],
                                          [CBUUID UUIDWithString:CHARACTERISTIC_B],
                                          [CBUUID UUIDWithString:CHARACTERISTIC_C],
                                          [CBUUID UUIDWithString:CHARACTERISTIC_D]]
                             forService:service];
}

Затем в didDiscoverCharacteristicsForService:error: я просматриваю обнаруженные результаты и сохраняю ссылки на характеристики, которые мне понадобятся позже, и все.

for (CBCharacteristic *characteristic in service.characteristics)
{
    if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:CHARACTERISTIC_A]])
        self.currentCharacteristicA = characteristic;
    else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:CHARACTERISTIC_B]])
        self.currentCharacteristicB = characteristic;
    else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:CHARACTERISTIC_C]])
        self.currentCharacteristicC = characteristic;
    else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:CHARACTERISTIC_D]])
        self.currentCharacteristicD = characteristic;
}

И, очевидно, хорошо очищать self.currentCharacteristic* при отключении.

person Markus Millfjord    schedule 15.04.2014
comment
Я предполагаю, что интерфейсы Xamarin более строгие, чем CoreBluetooth, и невозможно группировать запросы на обнаружение. - person allprog; 15.04.2014
comment
Так и есть, и я только сейчас понял, что вопрос был для Xamarin, а не для родной iOS. Виноват. Игнорируй меня! - person Markus Millfjord; 15.04.2014
comment
Привет, Маркус, я пытаюсь сейчас правильно. Поскольку у меня есть три обнаруженных сервиса a, b, c, но мне трудно вызывать метод периферии.discovercharacteristic один за другим. Сначала, когда я вызываю периферию.discovercharacteristic(для службы - a), я получил обратный вызов в методе discoverycharacteristic, но после этого, когда я пытаюсь обнаружить характеристику для второй службы (b), он не выполняет обратный вызов, - person Bhupinder Singh; 15.04.2014
comment
Вы можете пакетировать их, просто используйте CBPeripheral.DiscoverCharacteristics (новый CBUUID [] {myUid1, myUid2, myUid3}); См. API здесь: iosapi.xamarin.com/ - person miguel.de.icaza; 16.04.2014
comment
Это дает мне только обнаруженные характеристики первой службы в цикле for, а для остальных служб характеристики нулевые. - person Bhupinder Singh; 17.04.2014
comment
Вот что я делаю => for(int i=0; i‹peripheral.services.length;i++) { CBService service=peripheral.services[i]; Peripheral.discoverCharacteristics(новый CBUUID[]{a,b,c},service); } После этого я получаю ответ обратного вызова в методе DiscoverCharacteristic делегата cbperipheral. Public void override DiscoverCharacteristic(периферийное устройство CBPeripheral, служба CBService, ошибка NSError) { // Здесь я получаю характеристику только одной службы, но я обнаруживаю, что для всех служб в приведенном выше цикле for возникает проблема. } - person Bhupinder Singh; 17.04.2014