2014-08-28 3 views
2

HC-05 블루투스 모듈을 통해 Arduino Mega 2560에 연결된 앱을 만들었습니다. 나는 블루투스를 통해 Arduino에게 명령을 내리는 데 성공하지만, 그 반대의 통신은 분명히 작동하지 않는다. 문제가 Arduino 또는 Android 측에 있는지 나는 모른다.Arduino Android 블루투스 통신

Arduino는 다음과 같은 간단한 지침으로 메시지를 보냅니다. #include ... SoftwareSerial 블루투스 (12, 11);

void setup(){ 
    Serial.begin(9600); 
    bluetooth.begin(9600); 
    ... 
} 

void loop(){ 
    ... 
    bluetooth.listen(); 
    while (bluetooth.available() > 0) { 
     char inByte = bluetooth.read();  
     if(inByte == '0') { 
      bluetooth.print('a'); 
      delay(500); 
     } 
    } 
    ... 

} 

대신 안드로이드 코드는 다음과 같습니다 :

package com.example.arduo; 

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.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ToggleButton; 

public class MainActivity extends Activity implements OnClickListener { 

    Button Connect; 
    ToggleButton OnOff; 
    TextView Result; 
    private String dataToSend; 

    private static final String TAG = "Jon"; 
    private BluetoothAdapter mBluetoothAdapter = null; 
    private BluetoothSocket btSocket = null; 
    private OutputStream outStream = null; 
    private static String address = "00:14:02:13:00:10"; 
    private static final UUID MY_UUID = UUID 
        .fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    private InputStream inStream = null; 
    Handler handler = new Handler(); 
    byte delimiter = 10; 
    boolean stopWorker = false; 
    int readBufferPosition = 0; 
    byte[] readBuffer = new byte[1024]; 

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

      Connect = (Button) findViewById(R.id.connect); 
      OnOff = (ToggleButton) findViewById(R.id.tgOnOff); 
      Result = (TextView) findViewById(R.id.msgJonduino); 

      Connect.setOnClickListener(this); 
      OnOff.setOnClickListener(this); 

      CheckBt(); 
      BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
      Log.e("Jon", device.toString()); 

    } 

    @Override 
    public void onClick(View control) { 
      switch (control.getId()) { 
      case R.id.connect: 
          Connect(); 
        break; 
      case R.id.tgOnOff: 
        if (OnOff.isChecked()) { 
          dataToSend = "1"; 
          writeData(dataToSend); 
        } else if (!OnOff.isChecked()) { 
          dataToSend = "0"; 
          writeData(dataToSend); 
        } 
        break; 
      } 
    } 

    private void CheckBt() { 
      mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

      if (!mBluetoothAdapter.isEnabled()) { 
        Toast.makeText(getApplicationContext(), "Bluetooth Disabled !", 
            Toast.LENGTH_SHORT).show(); 
      } 

      if (mBluetoothAdapter == null) { 
        Toast.makeText(getApplicationContext(), 
            "Bluetooth null !", Toast.LENGTH_SHORT) 
            .show(); 
      } 
    } 

      public void Connect() { 
        Log.d(TAG, address); 
        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
        Log.d(TAG, "Connecting to ... " + device); 
        mBluetoothAdapter.cancelDiscovery(); 
        try { 
          btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 
          btSocket.connect(); 
          Log.d(TAG, "Connection made."); 
          Toast.makeText(getApplicationContext(), "Connessione effettuata", 
            Toast.LENGTH_SHORT).show(); 
        } catch (IOException e) { 
          try { 
            btSocket.close(); 
          } catch (IOException e2) { 
            Log.d(TAG, "Unable to end the connection"); 
            Toast.makeText(getApplicationContext(), "Impossibile terminare la connessione", 
              Toast.LENGTH_SHORT).show(); 
          } 
          Log.d(TAG, "Socket creation failed"); 
          Toast.makeText(getApplicationContext(), "Creazione socket fallita.", 
            Toast.LENGTH_SHORT).show(); 
        } 

        beginListenForData(); 
      } 

    private void writeData(String data) { 
      try { 
        outStream = btSocket.getOutputStream(); 
      } catch (IOException e) { 
        Log.d(TAG, "Bug BEFORE Sending stuff", e); 
        Toast.makeText(getApplicationContext(), "Bug prima di mandare i dati", 
          Toast.LENGTH_SHORT).show(); 
      } 

      String message = data; 
      byte[] msgBuffer = message.getBytes(); 

      try { 
        outStream.write(msgBuffer); 
        Toast.makeText(getApplicationContext(), "Dati inviati correttamente", 
          Toast.LENGTH_SHORT).show(); 
      } catch (IOException e) { 
        Log.d(TAG, "Bug while sending stuff", e); 
        Toast.makeText(getApplicationContext(), "Bug mandando i dati", 
          Toast.LENGTH_SHORT).show(); 
      } 
    } 

    @Override 
    protected void onDestroy() { 
      super.onDestroy(); 
      try { 
       btSocket.close(); 
      } catch (IOException e) { 
      } 
    } 

    public void beginListenForData() { 
      try { 
       inStream = btSocket.getInputStream(); 
      } catch (IOException e) { 
      } 

      Thread workerThread = new Thread(new Runnable() 
      { 
       public void run() 
       {     
        while(!Thread.currentThread().isInterrupted() && !stopWorker) 
        { 
         try 
         { 
          int bytesAvailable = inStream.available();       
          if(bytesAvailable > 0) 
          { 
           byte[] packetBytes = new byte[bytesAvailable]; 
           inStream.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() 
              { 

                //  if(Result.getText().toString().equals("..")) { 
                  Result.setText(data); 
                                 // } else { 
                //  Result.append("\n"+data); 
                //} 

                /* You also can use Result.setText(data); it won't display multilines 
                */ 

              } 
             }); 
            } 
            else 
            { 
             readBuffer[readBufferPosition++] = b; 
            } 
           } 
          } 
         } 
         catch (IOException ex) 
         { 
          stopWorker = true; 

         } 
        } 
       } 
      }); 

      workerThread.start(); 
     } 

}

안드로이드 아두 이노가 보낸 문자를 수신하거나 표시하지 않는 이유

아무도 알고 있나요? 감사합니다 모두!

답변

2

나는 그것이 작동하는 방법을 찾았습니다. 이 코드로 Android 코드를 변경 했으므로 동일한 문제가있는 사용자에게 유용 할 수 있습니다.

package bt.andard.btandard; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.lang.reflect.Method; 
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.Build; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
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 { 
    private static final String TAG = "bluetooth2"; 

    Button btnOn, btnOff; 
    TextView txtArduino; 
    Handler h; 

    final int RECEIVE_MESSAGE = 1; //1 // Status for Handler 
    private BluetoothAdapter btAdapter = null; 
    private BluetoothSocket btSocket = null; 
    private StringBuilder sb = new StringBuilder(); 

    private ConnectedThread mConnectedThread; 

    // SPP UUID service 
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

    // MAC-address of Bluetooth module (you must edit this line) 
    private static String address = "00:14:02:13:00:10"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    btnOn = (Button) findViewById(R.id.btnOn);     // button LED ON 
    btnOff = (Button) findViewById(R.id.btnOff);    // button LED OFF 
    txtArduino = (TextView) findViewById(R.id.txtArduino);  // for display the received data    from the Arduino 

    h = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     switch (msg.what) { 
     case RECEIVE_MESSAGE:         // if receive massage 
      byte[] readBuf = (byte[]) msg.obj; 
      String strIncom = new String(readBuf, 0, msg.arg1); // create string from bytes array 
      Toast.makeText(getBaseContext(), strIncom, Toast.LENGTH_LONG).show(); 

      sb.append(strIncom);            // append string 
      int endOfLineIndex = sb.indexOf("\r\n");       // determine the end-of-line 
      if (endOfLineIndex > 0) {           // if end-of-line, 
       String sbprint = sb.substring(0, endOfLineIndex);    // extract string 
       sb.delete(0, sb.length());          // and clear 
       txtArduino.setText("Data from Arduino: " + strIncom);   // update TextView 
       // btnOff.setEnabled(true); 
       // btnOn.setEnabled(true); 
      } 
      //Log.d(TAG, "...String:"+ sb.toString() + "Byte:" + msg.arg1 + "..."); 
      break; 
     } 
    }; 
}; 

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

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

btnOff.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    // btnOff.setEnabled(false); 
     mConnectedThread.write("0"); // Send "0" via Bluetooth 
    //Toast.makeText(getBaseContext(), "Turn off LED", Toast.LENGTH_SHORT).show(); 
    } 
    }); 
} 

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { 
    if(Build.VERSION.SDK_INT >= 10){ 
     try { 
      final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class }); 
      return (BluetoothSocket) m.invoke(device, MY_UUID); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not create Insecure RFComm Connection",e); 
    } 
    } 
    return device.createRfcommSocketToServiceRecord(MY_UUID); 
} 

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

    Log.d(TAG, "...onResume - try connect..."); 

    // Set up a pointer to the remote node using it's address. 
    BluetoothDevice device = btAdapter.getRemoteDevice(address); 

    // Two things are needed to make a connection: 
    // A MAC address, which we got above. 
    // A Service ID or UUID. In this case we are using the 
    //  UUID for SPP. 

    try { 
     btSocket = createBluetoothSocket(device); 
    } catch (IOException e) { 
     errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + "."); 
} 

// Discovery is resource intensive. Make sure it isn't going on 
// when you attempt to connect and pass your message. 
btAdapter.cancelDiscovery(); 

// Establish the connection. This will block until it connects. 
Log.d(TAG, "...Connecting..."); 
try { 
    btSocket.connect(); 
    Log.d(TAG, "....Connection ok..."); 
} catch (IOException e) { 
try { 
    btSocket.close(); 
} catch (IOException e2) { 
    errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); 
} 
} 

// Create a data stream so we can talk to server. 
Log.d(TAG, "...Create Socket..."); 

mConnectedThread = new ConnectedThread(btSocket); 
mConnectedThread.start(); 
} 

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

    Log.d(TAG, "...In onPause()..."); 

    try  { 
    btSocket.close(); 
    } catch (IOException e2) { 
    errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); 
    } 
} 

private void checkBTState() { 
    // Check for Bluetooth support and then check to make sure it is turned on 
    // Emulator doesn't support Bluetooth and will return null 
    if(btAdapter==null) { 
     errorExit("Fatal Error", "Bluetooth not support"); 
    } else { 
    if (btAdapter.isEnabled()) { 
     Log.d(TAG, "...Bluetooth ON..."); 
    } else { 
     //Prompt user to turn on Bluetooth 
     Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, 1); 
    } 
    } 
} 

private void errorExit(String title, String message){ 
    Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); 
    finish(); 
} 

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

    public ConnectedThread(BluetoothSocket 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[256]; // 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.read(buffer);  // Get number of bytes and message in "buffer" 
       h.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();  // Send to message queue Handler 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 

    /* Call this from the main activity to send data to the remote device */ 
    public void write(String message) { 
     Log.d(TAG, "...Data to send: " + message + "..."); 
     byte[] msgBuffer = message.getBytes(); 
     try { 
      mmOutStream.write(msgBuffer); 
     } catch (IOException e) { 
      Log.d(TAG, "...Error data send: " + e.getMessage() + "...");  
      } 
    } 
    } 
}