2012-11-19 11 views
24

Jestem nowy na Androida. Projektuję aplikację na Androida, która odbiera dane szeregowe z urządzenia sprzętowego przez bluetooth. Pracuję nad Htc desire S. Wykorzystałem przykładowy kod czatu Bluetooth do odbioru danych. Ale otrzymane dane są nieprawidłowe. Tęskni za niektórymi wartościami. Czy ktoś może podać mi inny przykładowy kod, aby otrzymać dużą ilość danych przez bluetooth i zapisać go w pliku.Jak otrzymać dane szeregowe za pomocą android bluetooth

+0

muszę coś podobnego w jedności :-( – mindmyweb

Odpowiedz

54

wypróbować ten kod:

aktywny:

package Android.Arduino.Bluetooth; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 
import android.widget.Button; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Set; 
import java.util.UUID; 

public class MainActivity extends Activity 
{ 
TextView myLabel; 
EditText myTextbox; 
BluetoothAdapter mBluetoothAdapter; 
BluetoothSocket mmSocket; 
BluetoothDevice mmDevice; 
OutputStream mmOutputStream; 
InputStream mmInputStream; 
Thread workerThread; 
byte[] readBuffer; 
int readBufferPosition; 
int counter; 
volatile boolean stopWorker; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button openButton = (Button)findViewById(R.id.open); 
    Button sendButton = (Button)findViewById(R.id.send); 
    Button closeButton = (Button)findViewById(R.id.close); 
    myLabel = (TextView)findViewById(R.id.label); 
    myTextbox = (EditText)findViewById(R.id.entry); 

    //Open Button 
    openButton.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      try 
      { 
       findBT(); 
       openBT(); 
      } 
      catch (IOException ex) { } 
     } 
    }); 

    //Send Button 
    sendButton.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      try 
      { 
       sendData(); 
      } 
      catch (IOException ex) { } 
     } 
    }); 

    //Close button 
    closeButton.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      try 
      { 
       closeBT(); 
      } 
      catch (IOException ex) { } 
     } 
    }); 
} 

void findBT() 
{ 
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    if(mBluetoothAdapter == null) 
    { 
     myLabel.setText("No bluetooth adapter available"); 
    } 

    if(!mBluetoothAdapter.isEnabled()) 
    { 
     Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBluetooth, 0); 
    } 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
    if(pairedDevices.size() > 0) 
    { 
     for(BluetoothDevice device : pairedDevices) 
     { 
      if(device.getName().equals("MattsBlueTooth")) 
      { 
       mmDevice = device; 
       break; 
      } 
     } 
    } 
    myLabel.setText("Bluetooth Device Found"); 
} 

void openBT() throws IOException 
{ 
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID 
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);   
    mmSocket.connect(); 
    mmOutputStream = mmSocket.getOutputStream(); 
    mmInputStream = mmSocket.getInputStream(); 

    beginListenForData(); 

    myLabel.setText("Bluetooth Opened"); 
} 

void beginListenForData() 
{ 
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character 

    stopWorker = false; 
    readBufferPosition = 0; 
    readBuffer = new byte[1024]; 
    workerThread = new Thread(new Runnable() 
    { 
     public void run() 
     {     
      while(!Thread.currentThread().isInterrupted() && !stopWorker) 
      { 
       try 
       { 
        int bytesAvailable = mmInputStream.available();       
        if(bytesAvailable > 0) 
        { 
         byte[] packetBytes = new byte[bytesAvailable]; 
         mmInputStream.read(packetBytes); 
         for(int i=0;i<bytesAvailable;i++) 
         { 
          byte b = packetBytes[i]; 
          if(b == delimiter) 
          { 
    byte[] encodedBytes = new byte[readBufferPosition]; 
    System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
    final String data = new String(encodedBytes, "US-ASCII"); 
    readBufferPosition = 0; 

           handler.post(new Runnable() 
           { 
            public void run() 
            { 
             myLabel.setText(data); 
            } 
           }); 
          } 
          else 
          { 
           readBuffer[readBufferPosition++] = b; 
          } 
         } 
        } 
       } 
       catch (IOException ex) 
       { 
        stopWorker = true; 
       } 
      } 
     } 
    }); 

    workerThread.start(); 
} 

void sendData() throws IOException 
{ 
    String msg = myTextbox.getText().toString(); 
    msg += "\n"; 
    mmOutputStream.write(msg.getBytes()); 
    myLabel.setText("Data Sent"); 
} 

void closeBT() throws IOException 
{ 
    stopWorker = true; 
    mmOutputStream.close(); 
    mmInputStream.close(); 
    mmSocket.close(); 
    myLabel.setText("Bluetooth Closed"); 
} 
} 

a tu układ:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
tools:ignore="TextFields,HardcodedText" > 

<TextView 
    android:id="@+id/label" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Type here:" /> 

<EditText 
    android:id="@+id/entry" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/label" 
    android:background="@android:drawable/editbox_background" /> 

<Button 
    android:id="@+id/open" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_below="@id/entry" 
    android:layout_marginLeft="10dip" 
    android:text="Open" /> 

<Button 
    android:id="@+id/send" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@id/open" 
    android:layout_toLeftOf="@id/open" 
    android:text="Send" /> 

<Button 
    android:id="@+id/close" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@id/send" 
    android:layout_toLeftOf="@id/send" 
    android:text="Close" /> 

Tutaj na manifeście: dodać do aplikacji

// permission must be enabled complete 
<manifest ....> 
    <application> 
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
     <uses-permission android:name="android.permission.BLUETOOTH" /> 

    </application> 
</manifest> 
+0

Dzięki kod naprawdę pomógł mi – ppumkin

+3

otrzymuję NullPointerException na linii mmSocket = mmDevice.createRfcommSocketToServiceRecord (UUID). Każda pomoc, proszę? –

+0

Tomas myślę, że może mieć nieprawidłową UUID dla urządzenia? Jaką wartość używasz? – bbill

5

Próbowałem tego do przesyłania danych ciągłych (wartości zmiennoprzecinkowe konwertowane na ciąg) z mojego komputera (MATLAB) na mój telefon. Ale nadal moja aplikacja błędnie odczytuje separator "\ n", a dane nadal są zniekształcone. Więc użyłem znaku "N" jako ogranicznika zamiast "\ n" (może to być jakakolwiek postać, która nie występuje jako część danych) i osiągnąłem lepszą prędkość transmisji - dałem zaledwie 0,1 sekundy opóźnienia między transmisją kolejnych próbek - z ponad 99% integralnością danych w odbiorniku, tj. z 2000 próbek (wartości zmiennoprzecinkowych), które przesłałem, tylko 10 nie zostało prawidłowo zdekodowanych w mojej aplikacji.

Moja odpowiedź w skrócie brzmi: Wybierz ogranicznik inny niż "\ r" lub "\ n", ponieważ powodują one więcej problemów w transmisji danych w czasie rzeczywistym w porównaniu do innych znaków, takich jak ten, którego używałem. Jeśli będziemy więcej pracować, możemy jeszcze bardziej zwiększyć szybkość transmisji. Mam nadzieję, że moja odpowiedź pomoże komuś!

4

Problem z zerowym połączeniem jest związany z funkcją findBT(). należy zmienić nazwę urządzenia z "MattsBlueTooth" na nazwę urządzenia, a także potwierdzić identyfikator UUID dla swojej usługi/urządzenia. Użyj czegoś podobnego do aplikacji BLEScanner, aby konferować zarówno na Androidzie.

+0

jak potwierdzić numer UUID dla dowolnego urządzenia/usługi? –

0

Spójrz na niesamowitą klasę Bluetooth Serial, która ma zdolność onResume(), która bardzo mi pomogła. Mam nadzieję, że to pomoże;)

Powiązane problemy