1

So habe ich mit Arduino für eine Weile gearbeitet und jetzt habe ich versucht, mit dem Bluetooth-Modul mit Android Studio zu verbinden. Ich war in der Lage, den Blue-Tooth zu verbinden, aber ich habe Probleme, die Blue-Tooth-Verbindung zu einem Service zu machen, so dass es auch laufen kann, wenn die App geschlossen ist. Immer wenn ich versuche, den Dienst auf meinem Handy laufen zu lassen, stürzt die App ab, sobald ich versuche, eine Verbindung zum Blue-Tooth-Modul herzustellen, wo es wie zuvor war, als es eine Aktivität war, es funktionierte perfekt. Ich habe mir viele Links und Anleitungen zur Nutzung von Diensten und Blue-Tooth angeschaut, aber keiner von ihnen macht genau das, was ich möchte.Einen Bluetooth-Dienst machen, der ein Signal an arduino Bluetooth-Modul sendet

Im Folgenden sind einige Code-Schnipsel, aber hier ist ein Link auf die gesamte GitHub project

Bluetooth Aktivität, die ich arbeite bekam:

package edu.memphis.teamhack.smart_nightlight; 

import android.Manifest; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.SharedPreferences; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.lang.reflect.Method; 
import java.util.Set; 
import java.util.UUID; 



public class BluetoothActivity extends AppCompatActivity { 

    // GUI Components 
    private TextView mBluetoothStatus; 
    private TextView mReadBuffer; 
    private Button mScanBtn; 
    private Button mOffBtn; 
    private Button mListPairedDevicesBtn; 
    private Button mDiscoverBtn; 
    private BluetoothAdapter mBTAdapter; 
    private Set<BluetoothDevice> mPairedDevices; 
    private ArrayAdapter<String> mBTArrayAdapter; 
    private ListView mDevicesListView; 
    private CheckBox mLED1; 

    private final String TAG = MainActivity.class.getSimpleName(); 
    private Handler mHandler; // Our main handler that will receive callback notifications 
    private ConnectedThread mConnectedThread; // bluetooth background worker thread to send and receive data 
    private BluetoothSocket mBTSocket = null; // bi-directional client-to-client data path 

    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // "random" unique identifier 


    // #defines for identifying shared types between calling functions 
    private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names 
    private final static int MESSAGE_READ = 2; // used in bluetooth handler to identify message update 
    private final static int CONNECTING_STATUS = 3; // used in bluetooth handler to identify message status 


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

     mBluetoothStatus = (TextView)findViewById(R.id.bluetoothStatus); 
     mReadBuffer = (TextView) findViewById(R.id.readBuffer); 
     mScanBtn = (Button)findViewById(R.id.scan); 
     mOffBtn = (Button)findViewById(R.id.off); 
     mDiscoverBtn = (Button)findViewById(R.id.discover); 
     mListPairedDevicesBtn = (Button)findViewById(R.id.PairedBtn); 
     mLED1 = (CheckBox)findViewById(R.id.checkboxLED1); 

     mBTArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 
     mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio 

     mDevicesListView = (ListView)findViewById(R.id.devicesListView); 
     mDevicesListView.setAdapter(mBTArrayAdapter); // assign model to view 
     mDevicesListView.setOnItemClickListener(mDeviceClickListener); 


     // Ask for location permission if not already allowed 
     if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); 


     mHandler = new Handler(){ 
      public void handleMessage(android.os.Message msg){ 
       if(msg.what == MESSAGE_READ){ 
        String readMessage = null; 
        try { 
         readMessage = new String((byte[]) msg.obj, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 
        mReadBuffer.setText(readMessage); 
       } 

       if(msg.what == CONNECTING_STATUS){ 
        if(msg.arg1 == 1) 
         mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj)); 
        else 
         mBluetoothStatus.setText("Connection Failed"); 
       } 
      } 
     }; 

     if (mBTArrayAdapter == null) { 
      // Device does not support Bluetooth 
      mBluetoothStatus.setText("Status: Bluetooth not found"); 
      Toast.makeText(getApplicationContext(),"Bluetooth device not found!",Toast.LENGTH_SHORT).show(); 
     } 
     else { 
      mLED1.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        SharedPreferences settings = getSharedPreferences("MyPref", 
          Context.MODE_PRIVATE); 
        Integer myInt = settings.getInt("colorHex", 0); 
        if(mConnectedThread != null){ //First check to make sure thread created 
         mConnectedThread.write(myInt.toString());} 
       } 
      }); 


      mScanBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        bluetoothOn(v); 
       } 
      }); 

      mOffBtn.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        bluetoothOff(v); 
       } 
      }); 

      mListPairedDevicesBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v){ 
        listPairedDevices(v); 
       } 
      }); 

      mDiscoverBtn.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        discover(v); 
       } 
      }); 
     } 
    } 

    private void bluetoothOn(View view){ 
     if (!mBTAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
      mBluetoothStatus.setText("Bluetooth enabled"); 
      Toast.makeText(getApplicationContext(),"Bluetooth turned on",Toast.LENGTH_SHORT).show(); 

     } 
     else{ 
      Toast.makeText(getApplicationContext(),"Bluetooth is already on", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    // Enter here after user selects "yes" or "no" to enabling radio 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent Data){ 
     // Check which request we're responding to 
     if (requestCode == REQUEST_ENABLE_BT) { 
      // Make sure the request was successful 
      if (resultCode == RESULT_OK) { 
       // The user picked a contact. 
       // The Intent's data Uri identifies which contact was selected. 
       mBluetoothStatus.setText("Enabled"); 
      } 
      else 
       mBluetoothStatus.setText("Disabled"); 
     } 
    } 

    private void bluetoothOff(View view){ 
     mBTAdapter.disable(); // turn off 
     mBluetoothStatus.setText("Bluetooth disabled"); 
     Toast.makeText(getApplicationContext(),"Bluetooth turned Off", Toast.LENGTH_SHORT).show(); 
    } 

    private void discover(View view){ 
     // Check if the device is already discovering 
     if(mBTAdapter.isDiscovering()){ 
      mBTAdapter.cancelDiscovery(); 
      Toast.makeText(getApplicationContext(),"Discovery stopped",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      if(mBTAdapter.isEnabled()) { 
       mBTArrayAdapter.clear(); // clear items 
       mBTAdapter.startDiscovery(); 
       Toast.makeText(getApplicationContext(), "Discovery started", Toast.LENGTH_SHORT).show(); 
       registerReceiver(blReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
      } 
      else{ 
       Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    final BroadcastReceiver blReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // add the name to the list 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       mBTArrayAdapter.notifyDataSetChanged(); 
      } 
     } 
    }; 

    private void listPairedDevices(View view){ 
     mPairedDevices = mBTAdapter.getBondedDevices(); 
     if(mBTAdapter.isEnabled()) { 
      // put it's one to the adapter 
      for (BluetoothDevice device : mPairedDevices) 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 

      Toast.makeText(getApplicationContext(), "Show Paired Devices", Toast.LENGTH_SHORT).show(); 
     } 
     else 
      Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
    } 

    private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) { 

      if(!mBTAdapter.isEnabled()) { 
       Toast.makeText(getBaseContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
       return; 
      } 

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

      // Spawn a new thread to avoid blocking the GUI one 
      new Thread() 
      { 
       public void run() { 
        boolean fail = false; 

        BluetoothDevice device = mBTAdapter.getRemoteDevice(address); 

        try { 
         mBTSocket = createBluetoothSocket(device); 
        } catch (IOException e) { 
         fail = true; 
         Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); 
        } 
        // Establish the Bluetooth socket connection. 
        try { 
         mBTSocket.connect(); 
        } catch (IOException e) { 
         try { 
          fail = true; 
          mBTSocket.close(); 
          mHandler.obtainMessage(CONNECTING_STATUS, -1, -1) 
            .sendToTarget(); 
         } catch (IOException e2) { 
          //insert code to deal with this 
          Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show(); 
         } 
        } 
        if(fail == false) { 

         mConnectedThread = new ConnectedThread(mBTSocket); 
         mConnectedThread.start(); 

         mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name) 
           .sendToTarget(); 
        } 
       } 
      }.start(); 
     } 
    }; 

    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { 
     try { 
      final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class); 
      return (BluetoothSocket) m.invoke(device, BTMODULEUUID); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not create Insecure RFComm Connection",e); 
     } 
     return device.createRfcommSocketToServiceRecord(BTMODULEUUID); 
    } 

    private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      // Get the input and output streams, using temp objects because 
      // member streams are final 
      try { 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer = new byte[1024]; // buffer store for the stream 
      int bytes; // bytes returned from read() 
      // Keep listening to the InputStream until an exception occurs 
      while (true) { 
       try { 
        // Read from the InputStream 
        bytes = mmInStream.available(); 
        if(bytes != 0) { 
         buffer = new byte[1024]; 
         SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed. 
         bytes = mmInStream.available(); // how many bytes are ready to be read? 
         bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read 
         mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
           .sendToTarget(); // Send the obtained bytes to the UI activity 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 

        break; 
       } 
      } 
     } 

     /* Call this from the main activity to send data to the remote device */ 
     public void write(String input) { 
      byte[] bytes = input.getBytes();   //converts entered String into bytes 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { } 
     } 

     /* Call this from the main activity to shutdown the connection */ 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

Hier ist der Bluetooth-Dienst Ich arbeite an :

package edu.memphis.teamhack.smart_nightlight; 

import android.app.Service; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 

public class BluetoothCommService extends Service { 


    // #defines for identifying shared types between calling functions 
    private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names 
    private BluetoothAdapter mBTAdapter; 
    private ArrayAdapter<String> mBTArrayAdapter; 

    public BluetoothCommService() { 
    } 

    public void onCreate(Bundle savedInstanceState){ 
     //super.onCreate(savedInstanceState); 
     mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio 
     mBTArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1); 

    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    void bluetoothOn(View view){ 
     if (!mBTAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      //startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

      //GUI 
      //mBluetoothStatus.setText("Bluetooth enabled"); 
      // Toast.makeText(getApplicationContext(),"Bluetooth turned on",Toast.LENGTH_SHORT).show(); 

     } 
     else{ 
      //Toast.makeText(getApplicationContext(),"Bluetooth is already on", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private void bluetoothOff(View view){ 
     mBTAdapter.disable(); // turn off 

     //GUI 
     //mBluetoothStatus.setText("Bluetooth disabled"); 
     //Toast.makeText(getApplicationContext(),"Bluetooth turned Off", Toast.LENGTH_SHORT).show(); 
    } 
    private void discover(View view){ 
     // Check if the device is already discovering 
     if(mBTAdapter.isDiscovering()){ 
      mBTAdapter.cancelDiscovery(); 
      Toast.makeText(getApplicationContext(),"Discovery stopped",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      if(mBTAdapter.isEnabled()) { 
       mBTArrayAdapter.clear(); // clear items 
       mBTAdapter.startDiscovery(); 
       Toast.makeText(getApplicationContext(), "Discovery started", Toast.LENGTH_SHORT).show(); 
       registerReceiver(blReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
      } 
      else{ 
       Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
    final BroadcastReceiver blReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // add the name to the list 
       mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       mBTArrayAdapter.notifyDataSetChanged(); 
      } 
     } 
    }; 
} 

Fühlen Sie sich frei, irgendwelche Fragen zu stellen.

+0

definieren "stürzt", zum Beispiel, was ist Ihre log sagen? Es ist unwahrscheinlich, dass es nur der beste Ansatz ist, Code auf uns zu kassieren, besonders wenn es eine Menge davon gibt. –

+0

Meine derzeit installierte APK-Version ist eigentlich BluetoothComm nicht Service zu erweitern. Es war nur ein kleines Experiment, um die GUI vom Backend zu trennen. Das Drücken einer Taste auf herkömmliche Weise, onClickListener, würde dann eine BluetoothComm-Objektmethode über btCom.bluetoothOn() aktivieren. Ich weiß, dass dieses Experiment etwas unorthodox sein könnte. Aber hier ist, was aussieht wie die Ausnahme geworfen: https://pastebin.com/ZDQzFb1u –

+0

Also was ist null, das sollte nicht sein? –

Antwort

0

dieses instructables Versuchen Sie, ich habe es von

http://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/

für weitere Idee zu diesem Tutorial reffering, auch verweisen

https://www.intorobotics.com/how-to-develop-simple-bluetooth-android-application-to-control-a-robot-remote/

+0

Danke. Ich werde das ausprobieren und sehen, ob es funktioniert. –

+0

Das war sehr hilfreich und ich konnte eine Verbindung herstellen, aber jedes Mal, wenn ich die App schließe, trennt sich das Bluetooth vom Arduino. Ich versuche, den Bluetooth-Code in einen Dienst zu implementieren, so dass das Arduino die Verbindung aufrechterhält, solange das Telefon eingeschaltet ist. –

Verwandte Themen