블루투스 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
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] 삭제
몇 마디 만하겠습니다