2016-10-19 4 views
0

안드로이드의 BLE API (그리고 가능한 한 모든 BLE API)는 비동기식이며 대기열에 없습니다.안드로이드에서 보류중인 BLE 작업이 있는지 확인하십시오.

characteristic.write("a"); 
characteristic.write("b"); 

두 번째 쓰기는 즉시 전송되지 않습니다 첫 번째를 대체한다 : 즉, (의사)을 할 경우입니다.

characteristic.write("a"); 

void onCharacteristicWrite() { 
    characteristic.write("b"); 
} 

내 질문은 : 실제로이 같은 것을 할 가지고 읽거나 쓰기 작업을 보류 한 BluetoothGatt 여부를 확인하기 위해 안드로이드에 방법이 있나요를, 그래서 내가 덮어 쓰기할지 여부를 알 수 기존 작업? 아니면 수동으로 추적해야합니까?

답변

1

나는 당신에게 제안 할 다른 방법이 있습니다. 블루투스 요청을 전송을 담당하는 클래스 내부

선언 :

private PriorityBlockingQueue<QueueRequest> queueRequestList; 

이 그런 요청을 보낼 방법을 선언

public void send(byte[] bytes, BTDelegate delegate) { 
    QueueRequest queueRequest = new QueueRequest(bytes); 
    if (queueRequestList.size() > 0) { 
     putOnQueueEnd(queueRequest); 
     return; 
    } 
    putOnQueueEnd(queueRequest); 
    sendRequest(queueRequest); 
} 

대기중인 요청이있는 경우이 수준의 검사를 볼 수 있듯이. 있다면 대기열에 넣고 마지막 요청이 완료 될 때까지 기다립니다. 대기열에 요소가 없으면 대기열에 넣고 (대기중인 요청이 있음을 알기 위해 대기중인 요청이 있음을 알리기 위해) 즉시 대기열에 넣습니다. 큐에서 다음 요소로 얻을 : 수단

public void sendNextRequestAgain() { 
    popFirst(); 
    QueueRequest request = peekFirst(); 
    sendRequest(request); 
} 

: 응답 BLE 기기에서 온

함수를 호출한다.

장점 :

  • 큐는

몇 가지 추가에게 (.. 데이터, 대표자, 시간 등)

  • 당신이 QueueRequest 내부에 원하는 데이터를 유지하기 위해 할 수 있습니다 스레드 간의 동기화 방법 :

    private void putOnQueueEnd(QueueRequest queueRequest) { 
        queueRequestList.put(queueRequest); 
    } 
    
    private QueueRequest popFirst() { 
        return queueRequestList.poll(); 
    } 
    
    private QueueRequest peekFirst() { 
        return queueRequestList.peek(); 
    } 
    
  • +0

    네, 이것은 [Nordic이 한 일]과 유사합니다 (https : //github.com/NordicSemiconductor/puck-central-android/blob/master/PuckCentral/app/src/main/java/no/nordicsemi/puckcentral/bluetooth/gatt/GattManager.java#L53). 아마도 가장 좋은 방법 일 것입니다. 대안이 있는지 궁금 해서요. – Timmmm

    관련 문제