java—创建、写入和保存csv文件,其中包含来自(bluetoothgattcharacteristic)characteristic.getvalue()的数据

sulc1iza  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(542)

我是andriod dev的新手,我正在尝试构建一个应用程序,该应用程序连接到一个ble设备,该设备可用于创建csv文件并存储具有notify属性的任何特征的值。我已经实现了oncharacteristicchanged(…),并且能够在订阅特征后接收原始字节。
然而,我不知道我应该如何创建一个csv文件,并写入这些原始字节,直到我取消订阅的特点或断开与设备。请帮忙。
edit:我正在尝试用csvwriter编写它,每次收到oncharacteristicchanged回调时都调用以下方法:

private void broadcastUpdate(final BluetoothGattCharacteristic characteristic, byte[] value){
       if(isCharacteristicNotifiable(characteristic)){
           String value_str =  bytesToHex(value);
           if(characteristic.getUuid().toString() == TX_CHARACTERISTIC){
              value_str =  bytestoformat(characteristic.getValue());
           }
           String[] line = value_str.split(" ");
           Log.i("broadcastUpdate",  value_str);
           try {
               CSVWriter writer = new CSVWriter(new FileWriter(csv, true));
               writer.writeNext(line);
               writer.close();

           } catch (FileNotFoundException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
    }

每次特性更改得到的字节数为2字节或4字节。所以csv文件应该在一行中打印4个十六进制值,当只有2个字节的数据时,将2个值留空。
但是,如果第一个通知提供2字节的数据,那么我的整个文件对于每个更改只显示2字节的数据(即使在第一个通知之后接收到4字节的数据)。如果第一个通知有4个字节的数据,那么我就得到了我想要的。

6psbrbz9

6psbrbz91#

csv文件可以像其他文件一样创建。首先打开要写入的文件:

String header = "";
File file = new File("/storage/emulated/0/CharNotifyData.csv");
if (!file.exists()) {
    file.createNewFile();
    header = "Characteristic;Value\n";
}
FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(header);

这样写下你的价值观:

bw.write(characteristicName + ";" + value + "\n");

别忘了关闭文件:

bw.close();

编辑:尝试区分两种可能的状态。一种方式可能是这样的:

private void broadcastUpdate(final BluetoothGattCharacteristic characteristic, byte[] value){
   if(isCharacteristicNotifiable(characteristic)){
       String value_str =  bytesToHex(value);
       if(characteristic.getUuid().toString() == TX_CHARACTERISTIC){
          value_str =  bytestoformat(characteristic.getValue());
       }
       String[] line = value_str.split(" ");
       String[] fullLine = new String[4];
       for(int i = 0; i < 4; ++i){
          if(i < line.length){
             fullLine[i] = line[i];
          }else{
             fullLine[i] = "";
          }
       }
       Log.i("broadcastUpdate",  value_str);
       try {
           CSVWriter writer = new CSVWriter(new FileWriter(csv, true));
           writer.writeNext(line);
           writer.close();

       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

相关问题