你如何从蓝牙LE设备获取数据?

我有一个蓝牙条形码扫描器,支持蓝牙LE,我试图从扫描时得到它的条形码信息。

我可以连接到它很好onServicesDiscovered调用我的BluetoothGattCallback但我不知道该怎么做。

使用经典的蓝牙连接,您将从BluetoothSocket获得一个InputStream ,并且您只需等待read()给您提供数据,但我不确定它如何与Bluetooth LE配合使用。 我尝试通过检查属性的BluetoothGattCharacteristic循环,如果它读取属性,我称之为gatt.readCharacteristic(characteristic); 但这只是给我无用的信息,甚至在我试图扫描一些东西之前。

那么如何从扫描仪获取条形码数据呢?

这是扫描仪我有https://www.zebra.com/us/en/support-downloads/scanners/ultrarugrug-scanners/li3608-li3678.html

Solutions Collecting From Web of "你如何从蓝牙LE设备获取数据?"

BLE设备提供的数据称为“ 特性” 。 这些数据包是专门形成的,紧密排列的字节数组,它为特定的服务编码特定的值。 您可以在官方蓝牙网站上查看服务 。 在这里您可以find定义的(权威的)GATT服务和所有权特征。

例如,您有一台报告速度和节奏的BLE自行车电脑。 您可以查看列表中的单车速度和节奏项目。 该条目包含服务的UUID(0x1816)以及包含特征的数据表的链接。 现在,如果您转到“ 服务特征”表格,您会发现一些条目。 您需要速度和节奏,因此您将打开CSC测量 (input项的“ types”字段),将其带到特性数据表中。 在这里你会看到Value Fields表格,它定义了可以从特性中读取的特定值。

一般来说,这是蓝牙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字段需要检查特定的位,因为设备可能不会报告每种types的数据,例如它不计算轮子的转数。 所选特征的工作表始终包含有关此字段的相关信息(如果存在)。

还有一点值得注意的是,文档说明了这一点

CSC测量特性(CSC是指循环速度和节奏)是一个可变长度结构,包含一个标志字段,根据标志字段的内容,可能包含一个或多个附加字段[…]

这就是为什么你不能假设在7个字节(分别是8 + 32 + 16位; 1 + 4 + 2字节 )的偏移量处find累积曲柄转数值,并且当你沿着这些区域前进时应该计算偏移量。


这是从BLE设备读取循环速度和踏频值的例子。 您必须为您的应用程序支持的每个设备(或者说服务)查找这些可用的字段和值。 如果设备是一个特殊的设备,并且无法在此GATT目录中find该设备,则需要查阅设备的手册,SDK或供应商以获取更多信息。