5

제퍼 HxM 스마트 하트 모니터에 액세스하는 블루투스 LE 앱을 작성하려고합니다. 이 모니터에는 여러 개의 Bluetooth 서비스가 있지만 Battery Service, Heart Rate Service 및 Activity 및 Peak Acceleration이있는 Custom Service에 관심이 있습니다. 배터리 수준, (BAT), 심박수 측정 (HR) 및 사용자 정의 측정 (CUS) 각각에 대해 하나의 특성이 있습니다. HxM은 초당 약 1 회 업데이트됩니다.Android 블루투스 LE 알림 문제

Android 4.4가 탑재 된 Galaxy S4에서이 작업을 수행하고 있습니다.

설명서에서 예상대로 작동하지 않습니다.

내 초기 접근 할이었다

Read BAT 
Set notification for HR 
Set notification for CUS. 

그런 다음 콜백 기다립니다. 설정 알림

BluetoothGatt.setCharacteristicNotification(Characteristic char , boolean enabled) 

를 호출 의미한다 (그러나이 필요하지 않습니다 사양이 지원되어야 하나는 또한 BAT에 대한 통지를 할 수 있습니다. HXM는, 그러나, 그것을 지원하지 않습니다.)

이하지 않았다 작업. HR에 대한 BAT 및 알림은 있지만 CUS는 아닙니다. 두 번째 단계를 생략하면 CUS에 대한 알림이 표시됩니다. 나는 둘 다 얻을 수 없었다. (이는 특성을 올바르게 읽음으로써 문제가 아닐 수 있음을 나타냅니다.)

Android 용 Bluetooth 스택에 문제가 있다는 것을 발견했지만 하드 설명서 없음이 없습니다. 나는 다음을 시도했다 :

Read BAT. 
Wait for the BAT reading, then set notification for HR, 
Get HR, then disable notification for HR, and start notification for CUS. 
Get CUS, then disable notification for CUS, and start notification for HR. 
And continue to loop. 

나는 그것이 BAT를 얻었습니다.

(. 이상하지만 알림을 해제하지 않고 동일)
Read BAT. 
Wait for the BAT reading, then set notification for HR, 
Get HR, then start notification for CUS. 
Get CUS, then start notification for HR. 
And continue to loop. 

는 일반적으로, 내가하는 HR 독서를 얻을 수 200 밀리 초 안에 다음 CUS 하나 시행 착오

, 나는 다음과 같은 작품을 발견했다. 동일한 업데이트에서 온 것으로 가정 할 수 있습니다. (데이터에는 타임 스탬프가 없으므로 LE로 짧게 유지해야합니다.) 실제로는 논리가 복잡합니다. 예상 판독 값이 들어오지 않을 경우 타이머가 필요하기 때문입니다.이 논리는 훨씬 복잡합니다. 더 많은 오류가 발생하기 쉬운) 내 첫 시도, 설명서가 무엇을 말하고있는 것입니다 적절한 무엇입니까.

나는 제퍼에게 연락했으며, HxM Smart는 Windows에서 광범위하게 테스트되었으며, 필요한대로 동시 통보를 할 것이라고 말했습니다. iOS에서 작동해야한다는 표시도 있습니다.

내가 이해할 수없는 또 다른 문제가 있습니다. 알림을 취득하기 위하여는, 당신은 같은 뭔가 통지를 로컬 특성을 활성화해야합니다 :

BluetoothGattDescriptor descriptor = characteristic 
     .getDescriptor(UUID_CLIENT_CHARACTERISTIC_CONFIG); 
resSet = descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 
resWrite = mBluetoothGatt.writeDescriptor(descriptor); 

이것은이 특성 설정에 따라, 그리고해야에만 특성이 처음 수신 될 때, 한 번 수행해야합니다. 대신 알림을 설정할 때마다해야한다는 것을 알았습니다. 이것은 단지 일을하기에 충분한 시간 지연을 유발할 수 있습니다. 나는 모른다. 이 시행 착오는 많은 시간을 소비합니다. 그것이 어떻게 작동하는지에 대한 명확한 진술을하는 것이 좋을 것입니다.

결과를 반환하는 모든 호출의 결과는 true (성공)입니다.

나는 긴 진술에 대해 사과드립니다. 내 질문 :

설명 된 일을해야한다는 문서가 없습니다. 모든 징후는 알림을 설정하고 콜백을 기다리는 것입니다. 설명서가 있습니까? 아니면 버그입니까, 아니면 구현이 잘못 되었습니까? (또는 내 오류입니까?) 특히 내가해야 할 일에 대한 문서가 어디에 있는지 알고 싶습니다.

둘째로, 더 복잡한 문제가 있습니다. 나는 루틴을 디버그하여 코드가 실제로 무엇을하는지 확인하려고 노력했다. BluetoothGatt.class에 도달하면 소스 행이 디버그 스택에서 말하는 것과 일치하지 않습니다. 그래서 나는 S4가 표준 안드로이드를 사용하지 않는다고 가정한다. 나는 거기에서 어디로 가야할지 모른다. 나는 좌절감을 느꼈다. 나는 작동하는 것처럼 보이지만, 힘이없고 거의 확실하지 않다.

도움 주셔서 감사합니다.

+0

좋은 질문입니다. 나는 notifiaction을 통해 두 가지 특성을 듣고 세 번째 것에 글을 써야하는 비슷한 문제가있었습니다. 안드로이드에서 제대로 작동하지 못했지만 iOS에서 잘 작동했습니다. 나는 기회가 있다면 다른 (브랜드) 안드로이드 장치에서 시도하는 것이 좋습니다 것입니다. 4.4.4에서도 BLE는 여전히 불안정합니다. 많은 것들이 예상대로 작동하지 않으며, 문서가 부족하고, 다른 모바일 장치에서 여전히 다른 결과를 제공합니다. – benka

+0

알림을 사용하도록 설정하고 알림을 계속 수신하지 않고 알림을 수신 할 수 있어야합니다. 실현해야 할 점은 한 번에 writeDescriptor와 같은 하나의 백 엔드 작업 만 수행 할 수 있다는 것입니다. 아직 진행 중이며 다른 것을 시도하면 새로운 요청을 무시합니다. 이것은 잘 문서화되어 있지 않으며 고통도 없습니다. 큐잉 방법론의 어떤 형태를 설정해야합니다. http://stackoverflow.com/questions/21278993/android-ble-how-to-read-multiple-characteristics – Ifor

+0

Ifor, Thanks. 나는 내 문제가 writeDescriptor를 기다리지 않는다고 생각한다. 여기에도 http://stackoverflow.com/questions/17910322/android-ble-api-gatt-notification-not-received에서 기사가 있지만 알림은 고려하지 않습니다. 당신이 말하는 것에서 나는 그들에 대해 걱정할 필요가 없다. (writeDescriptor로 적절히 사용 가능하게 한 후에). 나는 컴퓨터에서 멀리 떨어져 있지만 내가 돌아 오면 곧바로 시도 할 것이다. 다시 한번 감사드립니다. –

답변

1

여러 개의 값을 순서대로 쓰는 것과 같은 문제가 있습니다. 그 사이에 Thread.sleep (200)을 넣어 문제를 해결했습니다. 알림을받는 데 도움이 될지도 모릅니다. 는 넥서스 5에 안드로이드 4.4.2에서이 작업을 테스트 아니, 4.4

1

임은 아마 매우 늦게뿐만 알림을 보낼 특성을 설정하기위한 큐잉 아키텍처를 구현해야합니다 ... 모든 문제가 해결되지 않습니다. 비슷한 기술을 게시물 https://stackoverflow.com/a/18207869/3314615에서 miznick에 사용하고 BLE를 사용하는 몇 가지 앱이 있기 때문에 원시 BLE 스택에 대한 래퍼 코드를 작성했습니다. 그 이후로 나는 알림을 수신하는 데 문제가 없었습니다. 안드로이드 BLE 문서에는 BLE Stack이 동기가 아닌지에 대한 정보 나 경고가 있어야한다는 것에 동의합니다. 솔직히, 나는 그것이 동기 쓰기 호출을 처리하고 그냥 대기열에 다시 작성해야한다고 생각합니다.

+0

2014 년에 stackoverflow.com/questions/17910322/에서 Miznick에 설명 된대로 writeDescriptor 및 readCharacteristic에 대한 대기열을 구현했습니다. 원래 게시물에 대한 의견을 참조하십시오. 그것은 계속해서 일 해왔다. 이 노력에 대한 크레딧이 있다면 Ifor로 가야합니다. –

0

첫 번째 특성에 대해 알림 (예 : setCharacteristicNotification 및 설명자)을 설정합니다.

그리고 onDescriptorWrite 콜백 함수에서 두 번째 특성에 대한 알림을 설정하십시오.

관련 문제