CoreBluetooth: количество отправленных байтов!= Количество полученных байтов - программирование
Подтвердить что ты не робот

CoreBluetooth: количество отправленных байтов!= Количество полученных байтов

У меня есть приложение, которое действует как периферийное и другое приложение, которое действует как центральное. Центральное приложение читает характеристику на периферии:

    [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 байт.

4b9b3361

Ответ 1

Отвечая на мой вопрос. Посмотрите на редактирование # 2.