0

최대 처리량을 달성하기 위해 OnCharacteristicWrite 콜백 조건을 기반으로 다음 패킷을 동 기적으로 쓰려고합니다. 하지만 몇 가지 이유 때문에 1-2 초가 지난 후 매우 초기에 OnCharacteristicWrite 콜백을 트리거하는 것을 멈추고 패킷을 재전송한다고해서 결코 호출되지 않습니다. 패킷 당 지연을 추가하면 잘 작동하지만 최대 처리량을 달성하기 위해 지연을 추가하고 싶지는 않습니다.몇 초 후 Android BLE 콜백 OnWriteCallback이 중지됩니다.

지연을 추가하지 않고 최대 처리량을 얻을 수있는 방법이 있습니까?

또한 정확하게 연결 간격마다 여러 패킷을 보내는 것은 (그리고 내가 주변 장치를 통해 얻을 수있는 방법이 있습니까?) 의미합니까?

+0

어떤 Android 기기/OS 버전이 있습니까? – Emil

+0

Android 4.4.2 kitkat –

+0

@Emil 또한 내 BLE 버전은 4.2입니다. 하지만 conn 간격마다 여러 개의 패킷을 보내는 방법을 얻지 못하고 있습니다. onCharacteristicWrite 콜백이 각 패킷에 대해 수신되는 시점을 기준으로 패킷을 하나씩 보내고 있습니다. 그러나 특정 기간 (onCharacteristicWrite 콜백 상태 0 성공으로 약 300 패킷 이후) 콜백이 갑자기 멈추고 패킷 재송신시에도 결코 트리거되지 않습니다. 따라서 모든 패킷을 콜백 상태 0으로 성공적으로 쓰는 두 개의 패킷 사이에 8ms의 지연을 추가하고 있지만 실제로 처리량이 낮아집니다. 이것을 구현하는 더 좋은 방법이 있습니까? –

답변

1

응답없이 쓰기 (https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int) 참조)를 사용하면 연결 간격마다 여러 개의 패킷을 보낼 수 있습니다.

"Write Without Response"를 사용하여 여러 패킷을 보낼 때 안타깝게도 Android KitKat에서 흐름 제어가 끊어졌습니다. 최신 Android 기기를 사용하려고하면 제대로 작동합니다.

writeCharacteristic 메서드가 true를 반환하면 패킷이 Bluetooth 프로세스로 전달되었음을 의미합니다. 소스 코드의 정확한 로직을 https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081으로 볼 수 있습니다. 기본적으로 특성에 쓰기 특성이 있고 gatt 객체가 유효하고 진행중인 다른 보류중인 GATT 연산이없는 경우 true를 반환합니다.

쓰기 응답이 도착한 경우 (Write With Response) 또는 Bluetooth 스택이 준비되어 있고 새 패킷을 수신 할 수있는 버퍼 공간이있는 경우 (Write Without Response의 경우) onCharacteristicWrite 콜백은 status = 0을 보냅니다.

나는 최근에 여기에 대한 게시물을 썼습니다 : onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?.

KitKat에 대한 간단한 해결 방법을 원하면 10 개의 패킷을 Write Without Response로 쓰고 11 번째 패킷을 Write With Response로 쓰고 응답없이 Write로 다시 시작할 수 있습니다. 그것은 당신에게 훌륭한 성능을 제공해야합니다.

+0

자세한 정보 주셔서 감사합니다. 짧은 기간 내에 응답없이 패킷을 쓸 수 있지만 데이터 무결성을 확인하려면 BLE의 Tx 및 Rx 핀을 루프 백하고 같은 데이터가 OnCharacteristicChange calback 후 수신 중이며 동일한 특성을 읽는 지 확인하십시오. 이 데이터 비교를 기반으로 다음 패킷을 보내고 있습니다. 그러나 동일한 특성을 가진 OnCharacteristicChanges를 기반으로 패킷을 읽는 것은 매우 느린 프로세스 인 것으로 보입니다. 또한 쓰기/보내기 및 읽기 및 방법에 대해 다른 두 가지 특성을 사용할 수 있습니까? 감사! –