Bluetooth LE 장치에서 데이터를 가져 오는 방법

블루투스 LE를 지원하는 블루투스 바코드 스캐너가 있는데 스캔 할 때 바코드 정보를 가져 오려고합니다.

나는 잘 연결할 수 onServicesDiscovered내에서 호출되는 BluetoothGattCallback하지만 난 거기에서 무엇을 모르겠습니다.

고전적인 블루투스 연결을 사용하면 a InputStream에서 얻을 수 있으며 데이터를 제공 BluetoothSocket하기 read()기다릴 것이지만 Bluetooth LE와 어떻게 작동하는지 모르겠습니다. 나는 BluetoothGattCharacteristic속성을 확인하는 동안 반복을 시도 했으며 읽기 속성이 내가 호출 gatt.readCharacteristic(characteristic);하면 쓸모없는 정보를 제공하며 무언가를 스캔하려고 시도하기 전에도 마찬가지입니다.

그렇다면 스캐너에서 바코드 데이터를 얻으려면 어떻게해야합니까?

이것이 제가 가지고있는 스캐너입니다. https://www.zebra.com/us/en/support-downloads/scanners/ultra-rugged-scanners/li3608-li3678.html

Gergely Kőrössy

BLE 장치에서 제공하는 데이터를 특성 이라고 합니다. 이러한 데이터 패키지는 특정 서비스에 대한 특정 값을 인코딩하는 특수하게 형성되고 단단히 압축 된 바이트 배열입니다 . 공식 블루투스 웹 사이트에서 서비스확인할 수 있습니다 . 여기에서 정의 된 (권한있는) GATT 서비스와 해당 특성을 찾을 수 있습니다.

예를 들어 속도와 케이던스를보고하는 BLE 사이클링 컴퓨터가 있습니다. 목록에서 Cycling Speed ​​및 Cadence 항목을 찾습니다 . 이 항목에는 서비스의 UUID (0x1816)와 특성이 포함 된 데이터 시트에 대한 링크가 포함되어 있습니다. 이제 서비스 특성 테이블 로 이동 하면 몇 가지 항목을 찾을 수 있습니다. 속도와 케이던스를 원하므로 특성의 데이터 시트로 이동하는 CSC 측정 ( 항목 유형 필드)을 엽니 다 . 여기 에서 특성에서 읽을 수있는 특정 값을 정의 하는 값 필드 테이블을 수 있습니다.

이것은 일반적으로 Bluetooth LE 부분이었으며 이제 Android로 돌아갑니다. 특성에서 값을 가져 오려면 이러한 필드를 찾아야합니다. 나는 당신이 이미 데이터를 얻고 자하는 특성을 가지고 있다고 가정 할 것입니다. 다음은 휠 및 크랭크 회전을 검색하는 빠른 샘플입니다 (사용 가능한 경우).

BluetoothGattCharacteristic characteristic = ... ;

int offset = 0; // we define the offset that is to be used when reading the next field

// FORMAT_* values are constants in BluetoothGattCharacteristic
// these represent the values you can find in the "Value Fields" table in the "Format" column
int flags = characteristic.getIntValue(FORMAT_UINT8, offset);

offset += 1; // UINT8 = 8 bits = 1 byte

// we have to check the flags' 0th bit to see if C1 field exists 
if ((flags & 1) != 0) {
    int cumulativeWheelRevolutions = characteristic.getIntValue(FORMAT_UINT32, offset);
    offset += 4; // UINT32 = 32 bits = 4 bytes

    int lastWheelEventTime = characteristic.getIntValue(FORMAT_UINT16, offset);
    offset += 2; // UINT16 = 16 bits = 2 bytes
}

// we have to check the flags' 1st bit to see if C2 field exists 
if ((flags & 2) != 0) {
    int cumulativeCrankRevolutions = characteristic.getIntValue(FORMAT_UINT16, offset);
    offset += 2;

    int lastCrankEventTime = characteristic.getIntValue(FORMAT_UINT16, offset);
    offset += 2;
}

flags는 장치가 모든 데이터 유형을보고하지 않는 예는 휠의 회전 수를 카운트하지 않는 것이 가능하기 때문에 현장의 요구는 특정 비트를 검사한다. 선택한 특성의 시트에는 항상이 필드에 대한 관련 정보가 포함됩니다 (존재하는 경우).

문서에 다음과 같이 나와 있다는 점도 주목할 가치가 있습니다.

CSC 측정 특성 (CSC는 사이클링 속도 및 케이던스를 나타냄)은 플래그 필드를 포함하는 가변 길이 구조이며 플래그 필드의 내용을 기반으로 하나 이상의 추가 필드를 포함 할 수 있습니다. [...]

이것이 누적 크랭크 회전 값이 7 바이트 (각각 8 + 32 + 16 비트, 1 + 4 + 2 바이트 ) 오프셋에서 발견되고 필드를 따라 진행하면서 오프셋이 계산되어야 한다고 가정 할 수없는 이유 입니다.


이것은 BLE 장치에서 Cycling Speed ​​및 Cadence 값을 읽는 예입니다. 애플리케이션에서 지원하려는 모든 장치 (또는 서비스)에 대해 이러한 사용 가능한 필드 및 값을 찾아야합니다. 장치가 특수한 장치이고이 GATT 디렉토리에서 찾을 수없는 경우 장치 설명서, SDK 또는 공급 업체에 자세한 정보를 문의해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Windows 장치에서 장치 로그를 가져 오는 방법 _

장치 및 프린터 창에서 Bluetooth 장치 이름 가져 오기

R에서 벡터로 데이터를 가져 오는 방법

ManyToMany 엔터티에서 데이터를 가져오는 방법

Linux 커널이 장치 트리에서 데이터를 가져 오는 방법은 무엇입니까?

API에서 데이터를 가져오는 가장 좋은 방법

Firebase에서 데이터를 가져 오는 가장 효율적인 방법

C #에서 Cassandra Cluster로 데이터를 가져 오는 가장 좋은 방법

Azure Machine Learning에서 MongoDB 데이터를 가져 오는 가장 좋은 방법

PHP에서 Tableview로 데이터를 가져 오는 가장 좋은 방법

HTML 테이블에서 데이터를 가져 오는 방법

Android에서 XML에서 데이터를 가져 오는 방법

Flutter에서 FutureProvider에서 데이터를 가져 오는 방법

PHP에서 JSON에서 데이터를 가져오는 방법

데이터 저장소에서 이름 / 키를 가져 오는 방법

SQL에서 @ 다음에 데이터를 가져오는 방법

장치 시작시 adafruit에서 MQTT 주제 데이터를 가져 오는 방법

가져오기 API에서 특정 데이터를 가져오는 방법

axios에서 div로 데이터를 가져 오는 방법

문자열에서 데이터를 가져 오는 방법

웹 API Angular 6에서 데이터를 가져 오는 방법

내 Android 앱에서 Facebook 데이터를 가져 오는 방법

Angular에서 특정 JSON 데이터를 가져 오는 방법

모든 RecyclerView EditText에서 데이터를 가져 오는 방법

중첩 배열에서 데이터를 가져 오는 방법

DataSource.Factory에서 데이터를 가져 오는 방법

OnSuccessListener<QuerySnapshot>()에서 데이터를 가져오는 방법

netlogo에서 매번 데이터를 가져 오는 방법 (틱)?

ParseObject에서 특정 데이터를 가져 오는 방법

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관