十六进制数据从BLE特性到字节数组,如何转换为字符串

时间:2018-11-24 19:53:33

标签: android hex bluetooth-lowenergy bluetooth-gatt

我的BLE android应用当前可以连接到我的BLE硬件并连接到GATT服务器。我还可以启用通知并读取特征。但是,广告的特性为HEX格式。 在我的服务中,我尝试接收String或Byte Array格式的数据,尝试了一些转换过程,但仍然得到了无意义的数据(例如?? x等)

关于如何接收/转换十六进制数据的任何想法? 服务:

private void broadcastUpdate(final String action,
        final BluetoothGattCharacteristic characteristic) {
    final Intent intent = new Intent(action);

    if (UUID_BLE_SHIELD_RX.equals(characteristic.getUuid())) {

        //final byte[] rx = characteristic.getValue();

        final String rx=characteristic.getStringValue(0);
        //final     char rx=raw(char.value)


        intent.putExtra(EXTRA_DATA, rx);
    }

主要活动:

   private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (Service.ACTION_GATT_DISCONNECTED.equals(action)) {
        } else if (Service.ACTION_GATT_SERVICES_DISCOVERED
                .equals(action)) {
                getGattService(mBluetoothLeService.getSupportedGattService());
        } else if (Service.ACTION_DATA_AVAILABLE.equals(action)) {
           displayData(intent.getExtras().getString(Service.EXTRA_DATA));
        }

在NRF连接中看到的来自BLE模块的数据:(0x)04-01-19-00-BE

2 个答案:

答案 0 :(得分:0)

通常用于特征特性:

String yourHexData = theValueOfYourHexData;
yourHexData.getBytes();

这是我用来将十六进制字符串正确转换为byte []的方法:

public static byte[] hexToByteData(String hex)
{
    byte[] convertedByteArray = new byte[hex.length()/2];
    int count  = 0;

    for( int i = 0; i < hex.length() -1; i += 2 )
    {
        String output;
        output = hex.substring(i, (i + 2));
        int decimal = (int)(Integer.parseInt(output, 16));
        convertedByteArray[count] =  (byte)(decimal & 0xFF);
        count ++;
    }
    return convertedByteArray;
}

我不知道您的意图,但是字节数组也“不可读”。为此,必须使用适当的十六进制到字符串的转换。但是,如果您需要十六进制到字节数组的转换,请尝试我的方法。

希望有帮助。

答案 1 :(得分:0)

在您的broadcastUpdate函数中,如下进行更改

if (UUID_BLE_SHIELD_RX.equals(characteristic.getUuid())) {
    final byte[] rx = characteristic.getValue();
    intent.putExtra(EXTRA_DATA, rx);
}

在MainActivity中

} else if (Service.ACTION_DATA_AVAILABLE.equals(action)) {
       displayData(intent.getByteArrayExtra(Service.EXTRA_DATA));
}

在displayData中,调用将byteArray转换为hexString的函数

public String bytesToHex(byte[] bytes) {
    try {
        String hex="";
        for (byte b : bytes) {
            String st = String.format("%02X", b);
            hex+=st;
        }
        return hex;
    } catch (Exception ex) {
        // Handler for exception
    }
}