Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检测外设何时停止播发日期,以便我可以删除该外设窗体发现的设备列表?_Ios_Swift_Bluetooth Lowenergy_Core Bluetooth - Fatal编程技术网

Ios 如何检测外设何时停止播发日期,以便我可以删除该外设窗体发现的设备列表?

Ios 如何检测外设何时停止播发日期,以便我可以删除该外设窗体发现的设备列表?,ios,swift,bluetooth-lowenergy,core-bluetooth,Ios,Swift,Bluetooth Lowenergy,Core Bluetooth,当您连接到Bluetooth Central Manager(CM)并开始扫描具有特定服务的设备时,CM会在找到设备时通知您 func centralManager( central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) 但是,没有相应的“未经验证”

当您连接到Bluetooth Central Manager(CM)并开始扫描具有特定服务的设备时,CM会在找到设备时通知您

func centralManager(
    central: CBCentralManager, 
    didDiscoverPeripheral peripheral: CBPeripheral, 
    advertisementData: [String : AnyObject], 
    RSSI: NSNumber)
但是,没有相应的“未经验证”类型的函数。在我的应用程序中,我需要显示一个指示屏幕,检测设备何时被打开(发现),显示发现设备的列表,并让用户选择它。如果设备超时或关闭(停止广播广告日期),我需要从查找到的设备列表中删除该设备

@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)
                    }
                }
            }
        }
    }

如果您可以用一个工作示例来解释它,那就更好了。

在扫描开始之前,将CBCentralManager CANoptionalLowDuplicateSKey设置为true,这样每次收到广告包时都会执行didDiscover外围回调方法

创建字典和计时器以跟踪发现的设备列表。字典的关键是外设标识符,当第一次发现外设时,计数器的值最初设置为5。在收到来自外设的广告包后,我们在didDiscover外设回调方法中将计数器值不断更新为5

    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秒后从查找到的设备列表中删除该设备

@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建议这种方法。

在扫描开始之前,将CBCentralManagerScanOptionAllowDuplicatesKey设置为true,以便每次收到广告包时都会执行didDiscover外围回调方法

创建字典和计时器以跟踪发现的设备列表。字典的关键是外设标识符,当第一次发现外设时,计数器的值最初设置为5。在收到来自外设的广告包后,我们在didDiscover外设回调方法中将计数器值不断更新为5

    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秒后从查找到的设备列表中删除该设备

@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提出这种方法。

您必须自己实施。使用
allowDuplicates
键开始扫描。每次收到外设的发现回调时,将[String:Int]`的字典设置为(比如)5,由外设标识符键入。使用计时器将所有字典值每秒递减1。当计数达到0时,如果发现外围设备,请从字典和列表中删除该外围设备。谢谢@Paulw11的输入。我会实施的,你必须自己实施。使用
allowDuplicates
键开始扫描。每次收到外设的发现回调时,将[String:Int]`的字典设置为(比如)5,由外设标识符键入。使用计时器将所有字典值每秒递减1。当计数达到0时,如果发现外围设备,请从字典和列表中删除该外围设备。谢谢@Paulw11的输入。我将实施它。