# Bytes (Wertebereich 0-255) über BLE empfangen,lesen und speichern



## verstehIchNicht (13. Sep 2016)

Hallo zusammen.
Mein Android empfängt Daten über Bluetooth (Messwerte, Rohformat), bei dem Versuch diese korrekt zu lesen/speichern drehe ich mich leider im Kreis.


```
byte[] readBuf = (byte[]) msg.obj;


                           int[] ret = new int[readBuf.length];
                            for (short i = 0; i < readBuf.length; i++)
                        {
                              ret[i] = (readBuf[i]&255);
                           }


                        String strIncom = new String(ret, 0, msg.arg1);                 // erstelle String aus Bytes Array
                            sb.append(strIncom);                                                // String anhängen
                            int endOfLineIndex;
                            String path = "sdcard/" + dateipfad.getText().toString() + ".txt";  //Environment.getExternalStorageDirectory().getPath()

                            while ((endOfLineIndex = sb.indexOf("|0|")) >= 0) {                  // wenn end-of-line,
                                String sbprint;                                                 // extrahiere String
                                sbprint = sb.substring(0, endOfLineIndex);
                                sb.delete(0, sb.length());                                      // und löschen

                                try {
                                    File myFile = new File(path);
                                    myFile.createNewFile();
                                    FileOutputStream fOut = new FileOutputStream(myFile, true);
                                    OutputStreamWriter myOutWriter =
                                            new OutputStreamWriter(fOut);
                                    myOutWriter.append(sbprint);
                                    myOutWriter.close();
                                    fOut.close();
```
Ich hab versucht jedes Element in meinem Input-stream mit 0&FF zu 
erweitern... die untere Hälfte des Wertebereichs ist alles richtig, aber 
statt einer 0x80 erhalte ich dann eine: c2 80,

für 0x81 eine c2 81, für 0x82 c2 82, usw.... Durch meine String-konvertierung läuft was falsch. Diese dient mir als Index um den Buffer richtig auszulesen.



```
byte[] readBuf = (byte[]) msg.obj;

                                try {
                                    File myFile = new File(path);
                                    myFile.createNewFile();
                                    FileOutputStream fOut = new FileOutputStream(myFile, true);
                                  
                                    fOut.write(readBuf);
                                    fOut.close();
```

Speichert die Werte richtig, dh. ich bekomme 0xFF aber der Buffer wird willkürlich gelesen, da der Index fehlt.

Es gelingt mir aber nicht diesen ohne Stringkovertierung richtig auszulesen...

Mein Ansatz wäre..

```
for (int i = 0; i < readBuf.length - 2; i++) {
  if (readBuf[i] == '|' && readBuf[i+1] == '0' && readBuf[i+2] == '|') {
    endePos = i;
    break
  }
}
```

Weiß jemand wie das richtig geht. Ohne eine String-konvertierung den Bitstream richtig auszulesen? mir, als Java-Neuling,gehen die Ideen aus... Danke im Voraus.


----------



## buggy84 (16. Sep 2016)

Bei BLE muss man die Specs vom Chip beachten. Hier geht es darum, dass man maximal in 20Byte Paketen schicken oder empfangen kann. geht es schneller, kann es durchaus sein, dass der BLE Controller einfach irgendwas abschneidet, und Du dann einen totalen Mist bekommst.
Zuerst musst Du also feststellen, ob die Bytes, die Du bekommst, auch die sind, die zu erwartest. Wenn nicht, dann kann der Fehler auch in der BLE Hardware liegen.
Ich benutze z.B. einen Chip, der alle 40ms 20Byte Pakete geschickt bekommen kann (Mobile -> Chip). In die andere Richtung kann ich deutlich mehr, da arbeitet der Controller die Daten in 20Byte Pakete um, der Puffer ist an dieser Stelle also deutlich größer.


----------

