2012-11-19 33 views
24

Tôi mới sử dụng Android. Tôi đang thiết kế một ứng dụng Android nhận dữ liệu nối tiếp từ thiết bị phần cứng thông qua bluetooth. Tôi đang làm việc trên mong muốn HTC S. Tôi đã sử dụng mã trò chuyện Bluetooth mẫu để nhận dữ liệu. Nhưng dữ liệu nhận được không chính xác. Nó bỏ lỡ một số giá trị. Bất cứ ai có thể vui lòng cung cấp cho tôi bất kỳ mã mẫu nào khác để nhận số lượng lớn dữ liệu qua bluetooth và lưu nó vào một tệp.Cách nhận dữ liệu nối tiếp bằng cách sử dụng android bluetooth

+0

tôi cần một cái gì đó tương tự như trong sự hiệp nhất :-( – mindmyweb

Trả lời

54

thử mã này:

Hoạt động:

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"); 
} 
} 

VÀ Ở đây bố trí:

<?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" /> 

đây cho Manifest: thêm vào ứng dụng

// 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

Nhờ mã của bạn thực sự đã giúp tôi ra – ppumkin

+3

tôi nhận được một NullPointerException trên dòng mmSocket = mmDevice.createRfcommSocketToServiceRecord (uuid);. Bất kỳ sự giúp đỡ, xin vui lòng? –

+0

Tomas Tôi nghĩ rằng bạn có thể có một UUID không chính xác cho thiết bị? Giá trị nào bạn đang sử dụng? – bbill

5

Tôi đã thử điều này để truyền dữ liệu liên tục (giá trị nổi được chuyển đổi thành chuỗi) từ PC (MATLAB) sang điện thoại của tôi. Tuy nhiên, vẫn còn ứng dụng của tôi misreads delimiter '\ n' và dữ liệu vẫn bị cắt xén. Vì vậy, tôi lấy ký tự 'N' làm dấu phân cách chứ không phải là '\ n' (nó có thể là bất kỳ ký tự nào không xuất hiện như một phần dữ liệu của bạn) và tôi đã đạt được tốc độ truyền tốt hơn - Tôi chỉ chậm trễ 0,1 giây giữa truyền các mẫu liên tiếp - với hơn 99% tính toàn vẹn dữ liệu tại ví dụ nhận trong số 2000 mẫu (giá trị float) mà tôi truyền đi, chỉ 10 mẫu không được giải mã đúng trong ứng dụng của tôi.

Câu trả lời của tôi ngắn gọn là: Chọn dấu tách khác với '\ r' hoặc '\ n' vì chúng tạo ra nhiều vấn đề hơn khi truyền dữ liệu theo thời gian thực khi so sánh với các ký tự khác. Nếu chúng ta làm việc nhiều hơn, có thể chúng ta có thể tăng tốc độ truyền tải nhiều hơn. Tôi hy vọng câu trả lời của tôi sẽ giúp ai đó!

4

Vấn đề với kết nối null có liên quan đến hàm findBT(). bạn phải thay đổi tên thiết bị từ "MattsBlueTooth" thành tên thiết bị của bạn cũng như xác nhận UUID cho dịch vụ/thiết bị của bạn. Sử dụng một cái gì đó như ứng dụng BLEScanner để confrim cả trên Android.

+0

cách xác nhận UUID cho bất kỳ thiết bị/dịch vụ nào? –

0

Hãy xem lớp học tuyệt vời Bluetooth Serial có khả năng onResume() đã giúp tôi rất nhiều. Tôi hy vọng điều này sẽ giúp;)

Các vấn đề liên quan