Как сделать так, чтобы приложение Bluetooth подключалось только к исходному периферийному устройству? - PullRequest
0 голосов
/ 30 июня 2019

Мой текущий проект - простое приложение для одометра велосипедов, использующее датчик скорости Bluetooth. Я использовал датчики «Wahoo», «Xoss», «CycPlus» (периферийные) для тестирования. Приложение предназначено для IOS - iPhone.

Приложение работает хорошо - с помощью CoreBluetooth - упрощенный поток

  • инициализация центрального менеджера

  • сканирование периферийных устройств со службами

  • использование обнаруженного периферийного устройства> подключение к периферийному устройству

  • с использованием подключенного периферийного устройства> службы обнаружения

  • с использованием службы поиска> обнаружение характеристик

  • с использованием обнаруженных характеристик> установите для уведомлений значение да для периферийных устройств

  • с использованием обновленного значения для признака> извлечь мои данные и рассчитать пробег

Все работает хорошо - пока велосипед продолжает двигаться. Но когда периферийное устройство (датчик bt) прекращает вещание в течение нескольких минут отдыха, периферийное устройство отключается - как и должно быть.

Проблема в том, что если поблизости будет запущен еще один велосипед с поддержкой Bluetooth, приложение попытается подключиться к этому другому периферийному устройству.

Как я могу -

  1. Обязательно подключайте только к исходному периферийному устройству.

или

  1. Убедитесь, что я никогда не отсоединяюсь от оригинального периферийного устройства.

Спасибо

JDay

1 Ответ

0 голосов
/ 01 июля 2019

Paulw11

Мои извинения за публикацию комментария в качестве ответа - слишком много, чтобы сказать.

Спасибо за предложения.Я использовал ваши ключевые вещи, и немного приправил мои не упомянутые особенности.Я полагаю, что у меня есть рабочее решение, основанное на ваших рекомендациях.

Вместо retievePeripheralWithIdentifiers я просто получаю и сохраняю CBUUID при первом подключении.

Затем при подключении я фильтрую входящие периферийные устройства для соответствияисходный CBUUID.

Полагаю, мне нужно использовать сканирование, а не просто подключиться, потому что я не знаю, когда гонщик снова начнет движение.Я не хочу просить гонщика нажать кнопку.Мне нужно продолжать сканирование, чтобы обнаружить его движение.

Вот краткий список моего добавленного кода:

...in implementation
bool preferredPeripheralExists = false;

...in peripheral didDiscoverCharacteristicsForService
NSString *founduuid = [NSString stringWithFormat:@"%@", [peripheral.identifier  UUIDString]] ;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:founduuid forKey:@"rememberFoundUUID"];
[prefs synchronize];
preferredPeripheralExists = true ;

 ... in didDiscoverPeripheral   
NSString *newuuid     = [NSString stringWithFormat:@"%@", [peripheral.identifier  UUIDString]] ;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *olduuid     = [prefs objectForKey:@"rememberFoundUUID"]  ;

if ((!preferredPeripheralExists) || (preferredPeripheralExists && [newuuid isEqualToString:olduuid])){  
  if (self.discoveredPeripheral != peripheral) {
     self.discoveredPeripheral = peripheral;
     [self.centralManager connectPeripheral:peripheral options:nil];
  } // if self
}   // if !preferred

Что касается вашего комментария об экране настройки и пользовательского выбораПериферийные устройства -

Моя схема работы основана на примере проекта xcode на сайте разработчика Apple.Это не упоминает интерфейс настройки.Кроме того, проект «Монитор сердца» Ray Wenderlich с поддержкой Bluetooth не позволяет пользователю выбирать устройство.

Считается ли плохой практикой не включать экран выбора устройства?

Спасибо

J.Day

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...