我有一个充当外围设备的应用程序和另一个充当中心的应用程序。 中央应用程序正在读取外围设备的特征:
[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文档/指南,找不到任何可能发生这种情况的内容。
这可能与字节序有关吗?
好的,所以我做了一些测试,发现以下内容......
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。
好的,想通了。
在我的假设中,我是半正确的。 CoreBluetooth呼叫peripheralManager:didReceiveReadRequest:
N次,直到发送的数据小于MTU。如果发送的数据等于或大于MTU,CoreBluetooth将继续调用peripheralManager:didReceiveReadRequest:
,直到N x MTU覆盖最大大小(512字节)。如果最后一次调用data % MTU == 0
然后peripheralManager:didReceiveReadRequest:
,则必须返回0个字节。
答案 0 :(得分:5)
回答我自己的问题。 编辑#2。