如何检测外围设备何时停止广告日期,以便我可以删除该外围设备形式发现的设备列表?
How to detect when a peripheral stops advertisement Date so that i can remove that peripheral form discovered device list?
当您连接到蓝牙中央管理器 (CM) 并开始扫描具有特定服务的设备时,CM 会在找到设备时通知您。
func centralManager(
central: CBCentralManager,
didDiscoverPeripheral peripheral: CBPeripheral,
advertisementData: [String : AnyObject],
RSSI: NSNumber)
但是没有对应的“didUndiscoverPeripheral”类型的函数。对于我的应用程序,我需要显示一个说明屏幕,检测设备何时打开(发现),显示已发现设备的列表并让用户 select 它。如果设备超时或关闭(停止广播广告日期),我需要从发现的设备列表中删除该设备。
如果能举例说明就更好了
在扫描开始前将CBCentralManagerScanOptionAllowDuplicatesKey设置为true,这样didDiscover peripheral callBack方法就会在每次收到广告包时执行。
创建一个字典和一个计时器来跟踪发现的设备列表。字典的键是外设标识符,当第一次发现外设时,计数器的值初始设置为 5 之后,当收到来自外设的广告数据包时,我们继续在 didDiscover 外设回调方法中将计数器值更新为 5。
var discoveredPeripherals : [String: Int] = [String: Int]()
var discoveryTimer : Timer = Timer()
扫描开始时的计划定时器:
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: [=13=].identifier.uuidString) != nil
{
if discoveredPeripherals[[=13=].identifier.uuidString]! != 0
{
discoveredPeripherals[[=13=].bleDeviceGetId()]! -= 1
}
else{
if [=13=].state != CBPeripheralState.connected
{
removeDevice([=13=])
}
}
}
}
}
感谢@Paulw11 提出这种方法。
当您连接到蓝牙中央管理器 (CM) 并开始扫描具有特定服务的设备时,CM 会在找到设备时通知您。
func centralManager(
central: CBCentralManager,
didDiscoverPeripheral peripheral: CBPeripheral,
advertisementData: [String : AnyObject],
RSSI: NSNumber)
但是没有对应的“didUndiscoverPeripheral”类型的函数。对于我的应用程序,我需要显示一个说明屏幕,检测设备何时打开(发现),显示已发现设备的列表并让用户 select 它。如果设备超时或关闭(停止广播广告日期),我需要从发现的设备列表中删除该设备。
如果能举例说明就更好了
在扫描开始前将CBCentralManagerScanOptionAllowDuplicatesKey设置为true,这样didDiscover peripheral callBack方法就会在每次收到广告包时执行。
创建一个字典和一个计时器来跟踪发现的设备列表。字典的键是外设标识符,当第一次发现外设时,计数器的值初始设置为 5 之后,当收到来自外设的广告数据包时,我们继续在 didDiscover 外设回调方法中将计数器值更新为 5。
var discoveredPeripherals : [String: Int] = [String: Int]()
var discoveryTimer : Timer = Timer()
扫描开始时的计划定时器:
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: [=13=].identifier.uuidString) != nil
{
if discoveredPeripherals[[=13=].identifier.uuidString]! != 0
{
discoveredPeripherals[[=13=].bleDeviceGetId()]! -= 1
}
else{
if [=13=].state != CBPeripheralState.connected
{
removeDevice([=13=])
}
}
}
}
}
感谢@Paulw11 提出这种方法。