我的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
答案 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
}
}