ios - CoreBluetooth : number of bytes sent ! = 接收到的字节数

标签 ios objective-c core-bluetooth

我有一个充当外围设备的应用程序和另一个充当中央设备的应用程序。 中央应用程序正在读取外围设备上的特征:

    [self.service.peripheral readValueForCharacteristic:self.packetCharacteristic]

外设这样处理请求:

    - (void)peripheralManager:(CBPeripheralManager *)manager didReceiveWriteRequests:(NSArray *)requests
    {
        for (CBATTRequest *request in requests)
        {
            if ([request.characteristic.UUID isEqual:self.service.packetCharacteristic.UUID])
            {
                NSData *value = self.packets[0]; // This value's length logs at 512 bytes, tested 500 bytes too
                request.value = value;
                [self.peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];
            }
        }
    }

NSData *value 的大小等于 512 字节。请注意,我还用 500 字节对此进行了测试。
然后中央接收委托(delegate)调用:

    - (void)didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
    {
        if (characteristic == self.packetCharacteristic)
        {
            NSLog(@"PACKET RECEIVED: %lu bytes", (unsigned long)characteristic.value.length);
        }
    }

NSLog 声明指出无论我发送 500 字节还是 512 字节,接收到的值都是 536 字节。发送的字节和接收的字节在大约四分之一之前是相同的(通过查看 Xcode 提供的 HEX 值),其余字节完全不同。

题目如下:
1. 为什么我收到的字节数比发送的字节数多?
2. 这些字节是什么?它们代表什么?
3. 我在哪里可以找到这方面的文档?我一遍又一遍地查看了 CoreBluetooth 文档/指南,但找不到任何表明这可能发生的信息。 4. 这可能与字节顺序有关吗?

编辑#1

好的,所以我做了更多的测试并发现了以下... MTU 似乎是 134 字节(从 iOS 到 iOS)。只要发送的数据等于或大于 134 字节,CoreBluetooth 就会调用 peripheralManager:didReceiveReadRequest: 4 次。

我的假设是,因为正在发送的数据至少等于 MTU,所以 CoreBluetooth 不知道它是否已完成发送所有数据。因此,它会调用 peripheralManager:didReceiveReadRequest: N 次,直到 N x MTU 覆盖特征值的最大可能大小(512 字节)。在我的特定情况下,4 x 134 字节等于神奇的 536 字节。

请注意,每次都会更新请求的偏移量,在我的特定情况下为 0、134、268、402。

编辑#2

好的,明白了。 我的假设是对的。 CoreBluetooth 调用 peripheralManager:didReceiveReadRequest: N 次,直到发送的数据小于 MTU。如果发送的数据等于或大于 MTU,CoreBluetooth 将继续调用 peripheralManager:didReceiveReadRequest: 直到 N x MTU 覆盖最大大小(512 字节)。如果 data % MTU == 0 然后 peripheralManager:didReceiveReadRequest: 将最后一次调用,您必须返回 0 字节。

最佳答案

回答我自己的问题。 查看编辑#2。

关于ios - CoreBluetooth : number of bytes sent ! = 接收到的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845890/

相关文章:

ios - 没有在 Swift 中调用 CoreBluetooth didDiscoverPeripheral

ios - Objective C 中的蓝牙配对与连接

objective-c - 在 iOS 中从文本文件创建对象的最有效方法

ios - 类扩展的实现在哪里?

ios - 为什么我的预览图层没有覆盖整个 View ?

ios - 访问 UInavigationcontroller 嵌入式 View Controller ?

objective-c - 蓝牙核心框架回调例程 peripheralManagerIsReadyToUpdateSubscribers : isn't called

ios - 想知道如何知道仪器时间分析器中的符号,并且仅在 Xcode 中显示地址

ios - 无法访问 Swift 子类中的 oc 类别方法

ios - 委托(delegate)优势