CoreBluetooth:发送的字节数!=接收的字节数

时间:2014-04-03 18:24:32

标签: 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字节 然后中央接收委托电话:

    - (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文档/指南,找不到任何可能发生这种情况的内容。 这可能与字节序有关吗?

编辑#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个字节。

1 个答案:

答案 0 :(得分:5)

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