基于iOS的蓝牙低能耗数据传输

基于iOS的蓝牙低能耗数据传输,ios,bluetooth,bluetooth-lowenergy,core-bluetooth,Ios,Bluetooth,Bluetooth Lowenergy,Core Bluetooth,我最近在做一个使用蓝牙低能量的项目。我实现了大部分通信协议,但我开始担心,实际上我不知道数据传输是如何工作的,我实现的解决方案是否会以相同的方式在所有设备上运行 所以我主要关心的是,当我从外围设备(uuxUpdateValueFor:error:)收到通知时,会收到什么样的数据块?它是否仅与协商的MTU大小一样大?或者,iOS可能会接收到有关块大小的信息,并在触发外围设备之前等待接收所有信息(u:didUpdateValueFor:error:) 当一个外设发送块(比如说每个块100字节)时,我

我最近在做一个使用蓝牙低能量的项目。我实现了大部分通信协议,但我开始担心,实际上我不知道数据传输是如何工作的,我实现的解决方案是否会以相同的方式在所有设备上运行

所以我主要关心的是,当我从
外围设备(uuxUpdateValueFor:error:)
收到通知时,会收到什么样的数据块?它是否仅与协商的MTU大小一样大?或者,iOS可能会接收到有关块大小的信息,并在触发
外围设备之前等待接收所有信息(u:didUpdateValueFor:error:)

当一个外设发送块(比如说每个块100字节)时,我能假设我总是在一个通知中得到100字节吗?或者它可能是前一块的最后50个字节,下一块的前50个字节?这将是相当棘手的,很难发现我的帧的开始

我试图在苹果的文档中找到更多的信息,但什么都没有


我的猜测是,我总是收到一个单一的特征状态。因此,这意味着块依赖于外围端的实现。但如果特征大于MTU大小怎么办?

首先,请记住,通过特征发送流式数据并不是特征的设计目的。特征点是表示一些小的(约20字节)信息,如当前电池电量、设备名称或当前心跳。其思想是,仅当参考底图值更改时,特征才会更改。它从未被设计成串行协议。所以你默认的假设应该是,这一切都由你来管理

向特征写入的数据不应超过从
maximumWriteValueLength(for:)
获得的值。分块是你的工作

您写入的每个值都将以原子方式显示给接收器。请记住,这些是单独的值,而不是较大数据流中的数据块,因此重叠来自同一特征的值是没有意义的。“原子性”意味着它要么全部到达,要么一个也没有。因此,如果您的MTU可以处理100个字节,而您写入100个字节,那么另一方将接收100个字节,或者什么也不接收

这就是说,BLE中几乎没有错误检测,您完全可以丢弃数据包。由您来验证数据是否正确到达

如果你能瞄准iOS 11+,一定要看看L2CAP,它是为串行协议而设计的,而不是使用GATT


如果您不能做到这一点,我建议您观看WWDC 2013会话703,其中详细介绍了这个用例。(不过,我很难再找到它的链接。)

谢谢您宝贵的回答。这就是我所认为的特性不是设计用来流式传输数据的。然而,有一些制造商为BLE提供串行端口服务,如:我相信L2CAP在ios11+Thank Paul中可用;是的,你说得对。“我忘了是因为iOS10而耽搁了。”沃伊切科利克许多人使用GATT来传输数据。我以这种方式传输大文件,并在GATT上运行双向串行协议。苹果公司甚至曾经有一些示例代码来引导您完成它(如果您可以找到上面列出的会话I)。它不是为这个目的而设计的:这里是会议: