Как определить, когда периферийное устройство останавливает объявление Дата, чтобы я мог удалить список обнаруженных устройств этого периферийного устройства? - PullRequest
1 голос
/ 26 февраля 2020

Когда вы подключаетесь к центральному диспетчеру Bluetooth (CM) и запускаете сканирование для устройства с определенными службами, CM сообщит вам, когда найдет устройство.

func centralManager(
    central: CBCentralManager, 
    didDiscoverPeripheral peripheral: CBPeripheral, 
    advertisementData: [String : AnyObject], 
    RSSI: NSNumber)

Однако нет соответствующий «didUndiscoverPeripheral» тип функции. В случае моего приложения мне нужно было показать экран с инструкциями, определить, когда устройство было включено (обнаружено), показать список обнаруженных устройств и позволить пользователю выбрать его. Если для устройства истекло время ожидания или оно было выключено (прекращается трансляция даты объявления), мне нужно было удалить устройство из списка обнаруженных устройств.

Будет лучше, если вы сможете объяснить это с помощью рабочего примера.

1 Ответ

0 голосов
/ 27 февраля 2020

Установите для CBCentralManagerScanOptionAllowDuplicatesKey значение true до начала сканирования, чтобы периферийный метод callDack для didDiscover запускался каждый раз при получении рекламного пакета.

создать словарь и таймер для отслеживания списка обнаруженных устройств. Ключом словаря является идентификатор периферийного устройства, а значение - счетчик, изначально установленный на 5, когда периферийное устройство обнаруживается впервые, после чего, когда получен рекламный пакет от периферийного устройства, мы продолжаем обновлять значение счетчика до 5 в методе обратного вызова didDiscover периферийного устройства.

    var discoveredPeripherals : [String: Int] = [String: Int]()
    var discoveryTimer : Timer =  Timer()

ScheduledTimer при запуске сканирования:

    discoveryTimer =  Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateDiscoveredDevices), userInfo: nil, repeats: true)

остановка таймера при остановке сканирования.

    discoveryTimer.invalidate()

, если устройство прекращает рекламу и не подключено затем удалите устройство через 5 сек c из списка обнаруженных устройств.

@objc func updateDiscoveredDevices() {
        peripherals.forEach{
            if discoveredPeripherals.index(forKey: $0.identifier.uuidString) != nil
            {
                if discoveredPeripherals[$0.identifier.uuidString]! != 0
                {
                    discoveredPeripherals[$0.bleDeviceGetId()]! -= 1
                }
                else{
                    if $0.state != CBPeripheralState.connected
                    {
                        removeDevice($0)
                    }
                }
            }
        }
    }

Спасибо @ Paulw11 за предложение такого подхода.

...