Ios 如何检测外设何时停止播发日期,以便我可以删除该外设窗体发现的设备列表?
当您连接到Bluetooth Central Manager(CM)并开始扫描具有特定服务的设备时,CM会在找到设备时通知您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) 但是,没有相应的“未经验证”
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的输入。我将实施它。