我有一个充当外围设备的应用程序和另一个充当中央设备的应用程序。 中央应用程序正在读取外围设备上的特征:
[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/