通过蓝牙从arduino接收关于android的数据

时间:2015-01-29 17:16:52

标签: android bluetooth arduino

您好我的问题是我无法从arduino获取数据到android。这个概念是在android上显示arduino的值。你有从arduino接收android数据的代码吗?

这是我的代码

package com.example.arduinosensors;

import java.util.Set;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;


public class DeviceListActivity extends Activity {
// Debugging for LOGCAT
private static final String TAG = "DeviceListActivity";
private static final boolean D = true;



 // declare button for launching website 
and textview for connection status
Button tlbutton;
TextView textView1;

// EXTRA string to send on to mainactivity
public static String EXTRA_DEVICE_ADDRESS = "device_address";

// Member fields
private BluetoothAdapter mBtAdapter;
private ArrayAdapter<String> mPairedDevicesArrayAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.device_list);
}

@Override
public void onResume()
{
    super.onResume();
    //***************
    checkBTState();

    textView1 = (TextView) findViewById(R.id.connecting);
    textView1.setTextSize(40);
    textView1.setText(" ");

    // Initialize array adapter for paired devices
    mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);

    // Find and set up the ListView for paired devices
    ListView pairedListView = (ListView)  

    findViewById(R.id.paired_devices);
    pairedListView.setAdapter(mPairedDevicesArrayAdapter);
    pairedListView.setOnItemClickListener(mDeviceClickListener);

    // Get the local Bluetooth adapter
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    // Get a set of currently paired devices and append to '
    pairedDevices'
    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

    // Add previosuly paired devices to the array
    if (pairedDevices.size() > 0) {




   findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE)
   ;//make title viewable
        for (BluetoothDevice device : pairedDevices) {
            mPairedDevicesArrayAdapter.add(device.getName() + "\n" +   
   device.getAddress());
        }
    } else {
        String noDevices = 
   getResources().getText(R.string.none).toString();
        mPairedDevicesArrayAdapter.add(noDevices);
    }
    }

   // Set up on-click listener for the list (nicked this - unsure)
   private OnItemClickListener mDeviceClickListener = new 
   OnItemClickListener() {
   public void onItemClick(AdapterView<?> av, View v, int arg2, long 
   arg3) {

        textView1.setText("Connecting...");
        // Get the device MAC address, which is the last 17 chars 
   in the View
        String info = ((TextView) v).getText().toString();
        String address = info.substring(info.length() - 17);

        // Make an intent to start next activity while taking 
    an extra which is the MAC address.
        Intent i = new Intent(DeviceListActivity.this, 
    MainActivity.class);
        i.putExtra(EXTRA_DEVICE_ADDRESS, address);
        startActivity(i);  
    }
    };

    private void checkBTState() {
    // Check device has Bluetooth and that it is turned on
     mBtAdapter=BluetoothAdapter.getDefaultAdapter(); 
    // CHECK THIS OUT THAT IT WORKS!!!
    if(mBtAdapter==null) {
        Toast.makeText(getBaseContext(), 
    "Device does not support Bluetooth", Toast.LENGTH_SHORT).show();
    } else {
      if (mBtAdapter.isEnabled()) {
        Log.d(TAG, "...Bluetooth ON...");
      } else {
        //Prompt user to turn on Bluetooth
        Intent enableBtIntent = new  
     Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, 1);

        }
      }
      }
      }

主要活动

package com.example.arduinosensors;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

Button btnOn, btnOff;
TextView txtArduino, txtString, txtStringLength, sensorView0,   
sensorView1, sensorView2, sensorView3;
Handler bluetoothIn;

final int handlerState = 0;                        //used to identify 
handler message
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder recDataString = new StringBuilder();

private ConnectedThread mConnectedThread;

// SPP UUID service - this should work for most devices
private static final UUID BTMODULEUUID =   
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

// String for MAC address
private static String address;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//Link the buttons and textViews to respective views
btnOn = (Button) findViewById(R.id.buttonOn);
btnOff = (Button) findViewById(R.id.buttonOff);
txtString = (TextView) findViewById(R.id.txtString);
txtStringLength = (TextView) findViewById(R.id.testView1);
sensorView0 = (TextView) findViewById(R.id.sensorView0);
sensorView1 = (TextView) findViewById(R.id.sensorView1);
sensorView2 = (TextView) findViewById(R.id.sensorView2);
sensorView3 = (TextView) findViewById(R.id.sensorView3);

bluetoothIn = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if (msg.what == handlerState)    

 {                                     //if message is what we want
            String readMessage = (String)
 msg.obj;                                                                
 // msg.arg1 = bytes from connect thread

 recDataString.append(readMessage);                                      
 //   keep appending to string until ~
            int endOfLineIndex =   
 recDataString.indexOf("~");                 
 // determine the end-of-line
            if (endOfLineIndex > 0) 
 {                                           // make sure there data  
 before ~
                String dataInPrint = 
 recDataString.substring(0, endOfLineIndex);    // extract string
                txtString.setText("Data Received = " + dataInPrint);

 int dataLength = dataInPrint.length();                        
 //get   length of data received
                txtStringLength.setText("String Length = " + 
 String.valueOf(dataLength));

                if (recDataString.charAt(0) == 

      '#')                            
 //if it starts with # we know it is what we are looking for
                {

 String sensor0 = recDataString.substring(1, 5);             
 //get  sensor value from string between indices 1-5

 String sensor1 = recDataString.substring(6, 10);           
 //same again...
                    String sensor2 = recDataString.substring(11, 15);
                    String sensor3 = recDataString.substring(16, 20);


sensorView0.setText(" Sensor 0 Voltage = " + sensor0 + "V");  
//update the textviews with sensor values

 sensorView1.setText(" Sensor 1 Voltage = " + sensor1 + "V");

 sensorView2.setText(" Sensor 2 Voltage = " + sensor2 + "V");

 sensorView3.setText(" Sensor 3 Voltage = " + sensor3 + "V");
                }

 recDataString.delete(0, recDataString.length());                      
 //clear all string data
               // strIncom =" ";
                dataInPrint = " ";
            }
        }
    }
 };

btAdapter = BluetoothAdapter.getDefaultAdapter();      
// get Bluetooth adapter
checkBTState();

// Set up onClick listeners for buttons to send 1 or 0 to turn on/off LED
btnOff.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    mConnectedThread.write("0");    // Send "0" via Bluetooth
    Toast.makeText(getBaseContext(), 
"Turn off LED", Toast.LENGTH_SHORT).show();
  }
});

btnOn.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    mConnectedThread.write("1");    // Send "1" via Bluetooth
    Toast.makeText(getBaseContext(), 
"Turn on LED", Toast.LENGTH_SHORT).show();
  }
});
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)  
throws IOException {

  return  device.createRfcommSocketToServiceRecord(BTMODULEUUID);
  //creates secure outgoing connecetion with BT device using UUID
}

@Override
public void onResume() {
super.onResume();

//Get MAC address from DeviceListActivity via intent
Intent intent = getIntent();

//Get the MAC address from the DeviceListActivty via EXTRA
address = intent.getStringExtra(DeviceListActivity.EXTRA_DEVICE_ADDRESS);

//create device and set the MAC address
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
    btSocket = createBluetoothSocket(device);
} catch (IOException e) {
    Toast.makeText(getBaseContext(), "Socket creation failed", 
Toast.LENGTH_LONG).show();
}
// Establish the Bluetooth socket connection.
try
{
  btSocket.connect();
} catch (IOException e) {
  try
  {
    btSocket.close();
  } catch (IOException e2)
  {
    //insert code to deal with this
  }
}
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();

//I send a character when resuming.beginning transmission to check  
device is connected
//If it is not an exception will be thrown in the write method and  
finish() will be called
mConnectedThread.write("x");
}

@Override
public void onPause()
{
super.onPause();
try
{
//Don't leave Bluetooth sockets open when leaving activity
  btSocket.close();
} catch (IOException e2) {
    //insert code to deal with this
}
} 

//Checks that the Android device Bluetooth is available and prompts to  
be turned on if off
private void checkBTState() {

if(btAdapter==null) {
    Toast.makeText(getBaseContext(), 
"Device does not support bluetooth", Toast.LENGTH_LONG).show();
 } else {
  if (btAdapter.isEnabled()) {
  } else {

  Intent enableBtIntent = new   
  Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, 1);
  }
  }
  }

  //create new class for connect thread
  private class ConnectedThread extends Thread {
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    //creation of the connect thread
    public ConnectedThread(BluetoothSocket socket) {
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        try {
            //Create I/O streams for connection
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        byte[] buffer = new byte[256];
        int bytes;

        // Keep looping to listen for received messages
        while (true) {
            try {
                bytes = mmInStream.read(buffer);          
   //read bytes from input buffer
                String readMessage = new String(buffer, 0, bytes);
                // Send the obtained bytes to the UI Activity via handler

  bluetoothIn.obtainMessage(handlerState, bytes, -1,   
  readMessage).sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }
    //write method
    public void write(String input) {
        byte[] msgBuffer = input.getBytes();           
 //converts entered String into bytes
        try {
            mmOutStream.write(msgBuffer);              
   //write bytes over BT connection via outstream
        } catch (IOException e) {
            //if you cannot write, close the application
            Toast.makeText(getBaseContext(), 
  "Connection Failure", Toast.LENGTH_LONG).show();
            finish();

          }
        }
    }
   }

这是LOGCAT上的错误

02-01 04:45:41.274: W/dalvikvm(1112): threadid=1: thread exiting with uncaught exception (group=0xb3aa8b90)
02-01 04:45:41.304: E/AndroidRuntime(1112): FATAL EXCEPTION: main
02-01 04:45:41.304: E/AndroidRuntime(1112): Process:  com.example.arduinosensors, PID: 1112
02-01 04:45:41.304: E/AndroidRuntime(1112): 
java.lang.RuntimeException:   
Unable to resume activity {com.example.arduinosensors/com.example.arduinosensors.DeviceListActivity}: java.lang.NullPointerException
 02-01 04:45:41.304: E/AndroidRuntime(1112):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2769)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2798)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2231)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.os.Looper.loop(Looper.java:137)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread.main(ActivityThread.java:4998)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at java.lang.reflect.Method.invokeNative(Native Method)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at java.lang.reflect.Method.invoke(Method.java:515)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at dalvik.system.NativeStart.main(Native Method)
02-01 04:45:41.304: E/AndroidRuntime(1112): Caused by: java.lang.NullPointerException
02-01 04:45:41.304: E/AndroidRuntime(1112):     at com.example.arduinosensors.DeviceListActivity.onResume(DeviceListActivity.java:66)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.Activity.performResume(Activity.java:5322)
02-01 04:45:41.304: E/AndroidRuntime(1112):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2759)
02-01 04:45:41.304: E/AndroidRuntime(1112):     ... 12 more

1 个答案:

答案 0 :(得分:0)

转到评论中提到的网页中指定的github link。下载zip并使用它从Eclipse中的现有代码创建一个新的Android应用程序项目。它应该工作而不会崩溃。我刚尝试过。

<强> 更新

空指针的原因是因为模拟器不支持蓝牙并且您正在尝试访问模拟器上的蓝牙适配器。您可以在the documentation中详细了解模拟器的限制。