在 Android 中读取绑定到蓝牙 LE 描述符的数据结构值
Read Data Structure value binded to Bluetooth LE Descriptor in Android
我正在编写一个 android 应用程序,它通过 BLE 读取从 arm 处理器发送的数据(具有特征和描述符)。在硬件部分,我使用以下功能:
tBleStatus aci_gatt_add_char_desc ( uint16_t serviceHandle,
uint16_t charHandle,
uint8_t descUuidType, //16 or 128 bit
const uint8_t * uuid, //descriptor uuid
uint8_t descValueMaxLen,
uint8_t descValueLen,
const void * descValue, //actual data
uint8_t secPermissions,
uint8_t accPermissions,
uint8_t gattEvtMask,
uint8_t encryKeySize,
uint8_t isVariable,
uint16_t * descHandle
)
如果我们将 descValue
作为字符串或众所周知的类型值传递,我们可以很容易地提取 android 端的值,如下所示:
byte[] descValue = Descriptor.getValue();
String DescString = new String(descValue, "ISO_8859_1");
或者我使用的浮点数:
float wrapped = ByteBuffer.wrap(descValue).order(ByteOrder.LITTLE_ENDIAN).getFloat();
但是,我想发送 C 中的结构而不是字符串或任何单一数据类型(例如 Characteristic Presentation Format (0x2904 UUID):
typedef __packed struct _charactFormat {
uint8_t format;
int8_t exp;
uint16_t unit;
uint8_t name_space;
uint16_t desc;
} PACKED charactFormat;
但问题是当我们在 Android 中调用 getValue()
函数时它 returns 一个字节数组,我不知道如何解释这个字节数组并将数据提取出来其中
我正在寻找发送 struct
的方法,而不是严格地寻找 Char Pres。形式。 (这是可能的,因为 nRF connect 应用程序可以读取数据结构,但源代码不可用(即使在他们的 nRF 工具箱中)
如有任何帮助,我们将不胜感激
我找到了答案。由于数据是在 android 端使用字节数组接收的,只要我们知道数据结构,我们就可以翻译每一位。例如,关于格式的第一个字节可以解释为 int。如果我们有字符串(例如,在将字符串添加到上述结构的情况下),我们的字符串将从第 8 个字节或字节 7 开始。因此在 Android 端,我们必须将字节从 7 到最后一个解码为字符串。
我正在编写一个 android 应用程序,它通过 BLE 读取从 arm 处理器发送的数据(具有特征和描述符)。在硬件部分,我使用以下功能:
tBleStatus aci_gatt_add_char_desc ( uint16_t serviceHandle,
uint16_t charHandle,
uint8_t descUuidType, //16 or 128 bit
const uint8_t * uuid, //descriptor uuid
uint8_t descValueMaxLen,
uint8_t descValueLen,
const void * descValue, //actual data
uint8_t secPermissions,
uint8_t accPermissions,
uint8_t gattEvtMask,
uint8_t encryKeySize,
uint8_t isVariable,
uint16_t * descHandle
)
如果我们将 descValue
作为字符串或众所周知的类型值传递,我们可以很容易地提取 android 端的值,如下所示:
byte[] descValue = Descriptor.getValue();
String DescString = new String(descValue, "ISO_8859_1");
或者我使用的浮点数:
float wrapped = ByteBuffer.wrap(descValue).order(ByteOrder.LITTLE_ENDIAN).getFloat();
但是,我想发送 C 中的结构而不是字符串或任何单一数据类型(例如 Characteristic Presentation Format (0x2904 UUID):
typedef __packed struct _charactFormat {
uint8_t format;
int8_t exp;
uint16_t unit;
uint8_t name_space;
uint16_t desc;
} PACKED charactFormat;
但问题是当我们在 Android 中调用 getValue()
函数时它 returns 一个字节数组,我不知道如何解释这个字节数组并将数据提取出来其中
我正在寻找发送 struct
的方法,而不是严格地寻找 Char Pres。形式。 (这是可能的,因为 nRF connect 应用程序可以读取数据结构,但源代码不可用(即使在他们的 nRF 工具箱中)
如有任何帮助,我们将不胜感激
我找到了答案。由于数据是在 android 端使用字节数组接收的,只要我们知道数据结构,我们就可以翻译每一位。例如,关于格式的第一个字节可以解释为 int。如果我们有字符串(例如,在将字符串添加到上述结构的情况下),我们的字符串将从第 8 个字节或字节 7 开始。因此在 Android 端,我们必须将字节从 7 到最后一个解码为字符串。