通过蓝牙连接并将不同的arduino数据传递给android studio中的其他活动

时间:2016-03-01 18:39:28

标签: android bluetooth

我使用android studio制作了一个应用程序,它使用蓝牙hc-06从arduino获取数据。在我的Android应用程序中,首先我在我的手机中搜索配对设备,然后使用蓝牙连接hc06,数据开始显示在#MainActivity上。

但是,当我去另一个活动时,我的蓝牙连接丢失,数据没有显示在SecondActivity上如何将蓝牙连接传递到另一个活动并显示来自arduino的数据,就像#MainActivity一样。

这是我的#MainActivity代码

package com.example.umair.bluetooth;

import android.support.v7.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
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.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


int j1=0,j2=0,j3=0,j4=0,j5=0;
String smoke="",humi="",tempc="",tempf="",lat="",lng="";
TextView txtArduino, txtString, txtStringLength, sensorView0, sensorView1, sensorView2, sensorView3, sensorView4, sensorView5;
Handler bluetoothIn;
ImageButton btngps,pulseb;
final int handlerState = 0;                        //used to identify handler message
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder recDataString = new StringBuilder();
//Button btnn,btnn1;

private ConnectedThread mConnectedThread;

double lati=0;
double lngi=0;

// 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;
public static String address1 = "com.example.sheikh.bluetooth.address1";


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

    setContentView(R.layout.activity_main);


    sensorView0 = (TextView) findViewById(R.id.sensorView0);
    sensorView1 = (TextView) findViewById(R.id.sensorView1);
    sensorView2 = (TextView) findViewById(R.id.sensorView2);
    sensorView3 = (TextView) findViewById(R.id.sensorView3);
    sensorView4 = (TextView) findViewById(R.id.sensorView4);
    sensorView5 = (TextView) findViewById(R.id.sensorView5);
    pulseb = (ImageButton)findViewById(R.id.pulsebutton);
    btngps = (ImageButton)findViewById(R.id.btnShow);


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

                    for(int i=0;i<endOfLineIndex;i++)
                    {

                        if(recDataString.charAt(i)=='A')
                        {
                            smoke = recDataString.substring(1, i);
                            j1=i+1;
                        }
                        else if(recDataString.charAt(i)=='B')
                        {
                            humi = recDataString.substring(j1, i);
                            j2=i+1;
                        }
                        else if(recDataString.charAt(i)=='C')
                        {
                            tempc = recDataString.substring(j2, i);
                            j3=i+1;
                        }
                        else if(recDataString.charAt(i)=='D')
                        {
                            tempf = recDataString.substring(j3, i);
                            j4=i+1;
                        }
                        else if(recDataString.charAt(i)=='E')
                        {
                            lat = recDataString.substring(j4, i);
                            j5=i+1;
                        }
                        else if(recDataString.charAt(i)=='F')
                        {
                            lng = recDataString.substring(j5, i);

                        }

                    }
                    if (recDataString.charAt(0) == '#')                             //if it starts with # we know it is what we are looking for
                    {
                        sensorView0.setText(smoke);
                        sensorView1.setText(humi);
                        sensorView2.setText(tempc);
                        sensorView3.setText(tempf);
                        sensorView4.setText(lat);
                        sensorView5.setText(lng);
                        lati = Double.parseDouble(lat);
                        lngi = Double.parseDouble(lng);

                    }
                    recDataString.delete(0, recDataString.length());                    //clear all string data

                }
            }
        }
    };

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



    btngps.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(getBaseContext(), MapsActivity1.class);

            // Passing latitude and longitude to the MapActiv
            intent.putExtra("lat", lati);
            intent.putExtra("lng", lngi);

            startActivity(intent);


        }
    });

    pulseb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent i = new Intent(MainActivity.this, showpulse.class);
            i.putExtra(address1, address);
            startActivity(i);

        }
    });





}

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

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

        }
    }
}
}

这是我的DeviceListActivity代码

package com.example.umair.bluetooth;

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.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

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.activity_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_paired).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);
    }
};


//method to check if the device has Bluetooth and if it is on.
//Prompts the user to turn it on if it is off
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);

        }
    }
}
}

如何通过蓝牙连接并在第3次活动中显示arduino数据

0 个答案:

没有答案