相关疑难解决方法(0)

iOS蓝牙LE - 没有响应的正确写入方式

使用iOS CoreBluetooth时,在发送相对大量的数据时,将其分解为20个字节的块然后将它们一次写入外围对象是很重要的.使用WriteWithResponse特性时,这很容易做到:写20个字节,等待回调,写下20个字节,依此类推.

但是WriteWithoutResponse特性呢?我需要尽可能快地通过BLE发送1-2kB的数据.WriteWithResponse在执行此操作时效率非常低,因为它会响应每个20字节的数据包.我的应用层负责纠错和可靠性,所以我不需要BLE来处理数据.

问题是WriteWithoutResponse没有给你一个回调,因为CoreBluetooth无法知道数据的实际写入时间.所以问题是:我们如何使用WriteWithoutResponse正确地隔离发送大量数据?

我想到的唯一解决方案是执行以下操作:

  1. 获取连接间隔和每个连接间隔链路能够的数据包数.
  2. 立即写入每个20字节的X包,等待Y时间,然后重复,直到没有数据为止.(X =每个连接间隔的数据包数,Y =连接间隔)

这种方法有两个明显的问题:

  1. CoreBluetooth不向我们公开连接间隔(为什么??).所以有两种选择.第一个是:猜测.可能是更坏的情况或平均情况,取决于您的首选连接参数,我认为iOS喜欢选择30ms.但这是个坏主意,因为中心有权完全忽略建议的参数.第二个是您可以拥有外围存储并将商定的CI传输到iOS设备.这个问题是,在iOS设备完成发现服务和特性并订阅适当的通知之前,您无法发送CI.因此,在发送CI之前,您必须在连接后输入一些任意的固定延迟,或者从iOS设备发送少量数据,通知外围设备它已准备就绪.两者都会产生延迟并且是非常差的解决方案.
  2. 我们不知道每个连接间隔可以支持多少个数据包.理论上最大值为6.但平均情况可能为4或更小.它还取决于外围设备.

当然,发送大量数据的一个很好的选择是将MTU大小增加到大于20个字节以容纳我们的大量数据.但似乎很少有外围设备支持这一点; 我们没有.

任何人都有任何关于如何解决这个问题的见解?

iphone bluetooth ios core-bluetooth bluetooth-lowenergy

7
推荐指数
1
解决办法
2557
查看次数

Swift:为Bluetooth Central Manager选择队列

我正在开发将通过BLE与智能设备连接并与其通信的应用程序。

问题是:处理蓝牙事件的最佳实践是在哪个队列中?

我阅读了很多教程,在所有教程中我都发现了这一点:

centralManager = CBCentralManager(delegate: self, queue: nil)
Run Code Online (Sandbox Code Playgroud)

他们选择处理主队列(queue: nil)中的蓝牙事件,但我认为这不是一个好习惯。因为可能有很多查询从中央设备发送到外围设备,并且有很多答案从外围设备发送到中心设备。

我认为这可能是应用程序运行缓慢的原因,并且可能会对生产力产生不利影响,对吗?

这会淹没UI更新队列吗?

queue grand-central-dispatch ios core-bluetooth swift

5
推荐指数
1
解决办法
2448
查看次数