简体   繁体   中英

recieving of data on android from arduino via bluetooth

Hi my problem is I'm not able to get data from arduino to android. The concept is to display the value of arduino on android. Do you have a code for recieving data on android from arduino?

This is my codes

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

        }
      }
      }
      }

MAIN ACTIVITY

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();

          }
        }
    }
   }

THIS IS THE ERROR ON 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

Go to the github link specified in the web page you mentioned in your comment. Download the zip and use it to create a new android application project from existing code in Eclipse. It should work without crashing. I just tried it.

Update:

The reason for the null pointer is because the emulator doesn't support Bluetooth and you are trying to access the Bluetooth Adapter on the emulator. You can read more about the limitations of the emulator in the documentation .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM