У меня есть приложение, которое действует как периферийное и другое приложение, которое действует как центральное. Центральное приложение читает характеристику на периферии:
[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 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
утверждает, что полученное значение равно 536 байтам, независимо от того, отправляю ли я 500 или 512 байт. Переданные байты и полученные байты идентичны примерно до четверти пути (смотря на значение HEX, предоставленное Xcode), остальные байты совершенно разные.
Вопросы заключаются в следующем:
1. Почему я получаю больше байтов, чем я отправил?
2. Каковы эти байты? Что они представляют?
3. Где я могу найти документацию по этому вопросу? Я снова и снова просматривал документы/руководства CoreBluetooth и не могу найти ничего, что могло бы случиться.
4. Может ли это быть связано с контентом?
EDIT # 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 байт.