Ios 使用蓝牙时如何设置超时间隔

Ios 使用蓝牙时如何设置超时间隔,ios,bluetooth,Ios,Bluetooth,当我使用蓝牙写入数据时,我希望得到响应。但是当外围设备出现故障时,它不会发送通知。我需要设置一个超时间隔来处理这个错误的交互。就像我们使用URL请求一样: /// Creates and initializes a URLRequest with the given URL and cache policy. /// - parameter: url The URL for the request. /// - parameter: cachePolicy The ca

当我使用蓝牙写入数据时,我希望得到响应。但是当外围设备出现故障时,它不会发送通知。我需要设置一个超时间隔来处理这个错误的交互。就像我们使用URL请求一样:

    /// Creates and initializes a URLRequest with the given URL and cache policy.
    /// - parameter: url The URL for the request. 
    /// - parameter: cachePolicy The cache policy for the request. Defaults to `.useProtocolCachePolicy`
    /// - parameter: timeoutInterval The timeout interval for the request. See the commentary for the `timeoutInterval` for more information on timeout intervals. Defaults to 60.0
    public init(url: URL, cachePolicy: CachePolicy = .useProtocolCachePolicy, timeoutInterval: TimeInterval = 60.0) {
        _handle = _MutableHandle(adoptingReference: NSMutableURLRequest(url: url, cachePolicy: cachePolicy, timeoutInterval: timeoutInterval))
    }
我该怎么做。

通过“当外围设备出错时”-如果您的意思是外围设备崩溃或停止工作,那么您应该得到一个可中断的断开事件来指示崩溃:

(centralManager:didDisconnectPeripheral:) 
如果情况并非如此,并且您只是在一段时间后停止接收通知,并且BLE连接仍然处于活动状态,则无法说明外围设备停止发送通知的原因。原因是没有与通知关联的特定“时间”。有些外围设备每1秒发送一次通知,有些则每1周发送一次通知。一些外围设备会发送值更改通知(例如,如果温度升高1度),一些外围设备会发送用户操作通知(例如,用户按下按钮)

唯一的解决方法是,如果您在中央设备中添加计时器,则每次收到通知时,使用以下方法:

peripheral(_:didUpdateValueFor:error:)
您可以重置该计时器(如果它正是您希望超时的通知)。然后,如果计时器过期,您知道没有按预期的时间收到通知,因此可以标记错误或强制断开连接。这只是一个示例,您可以创建一些变体(例如,在外围设备上设置一个标志(uu:didUpdateValueFor:error:),每30秒检查并重置一次)。您可以在以下链接中找到有关计时器的更多信息:-


我希望这能有所帮助。

这是一个有趣的问题

在检查CoreBooth后,我发现他们的列表中已经有超时错误。

但这只是第一次连接到外围设备才起作用

所以我认为,如果你发送了一个请求,但没有得到任何响应,那么你必须创建自己的计时器管理器

超时的概念相当复杂。你需要排队等待计时器,这是FIFO。每个请求都需要一个唯一的ID,并且必须将其与预期的响应进行映射

例:

你打电话:

  • 通过BLE(任何线程)调用以获取健康信息
  • 通过BLE(任何线程)调用以获取高度信息
  • 通过BLE(任何线程)调用以获取健康信息
  • 你的答复:

  • 高度信息
  • 健康信息
  • 在将请求与响应映射之后,您将注意到缺少一个预期的响应。因此,如何知道请求1或请求3缺少响应。这是你的选择


    总之,我认为您需要一个队列请求、一个队列预期响应和一个计时器队列。管理这些队列并不是一个很大的问题。

    如果我需要观察许多通知,是否应该添加许多计时器。如果是,我认为很难管理这么多的计时器您可以这样做,或者您只能有一个计时器和多个标志-默认情况下,这些标志将为0,并在收到通知时设置为1。当计时器过期时,它会检查所有标志,如果所有标志都为1,则表示一切正常,计时器处理程序可以在重新启动之前再次将标志设置为零。我在不同的时间写入数据。因此,通知的过期时间不同。仅依靠一个计时器就可以做到这一点?这真的取决于你的应用程序,所以我不确定我能回答这个问题。您可以设置预期所有通知到达的“最长”时间(例如,如果您有一个通知应在30秒后收到,另一个通知应在2分钟后收到,请将超时设置为2分钟)。这样,您就可以确定到那时所有通知都已到达。您还可以使用计数器而不是标志,即每次收到通知时,计数器都会递增,然后在超时时检查此计数器以确保收到X个通知。如果这对您不起作用,则您必须使用多个计时器。iOS非常快,所以我无法想象这是一个主要问题,但你至少可以测试一下。