(Android studios) Как подключить 2 arduino к android-приложению
Привет,
Я перепробовал много способов подключения 2 Arduino к приложению, но до сих пор не могу заставить его работать гладко. Есть ли там какие-нибудь эксперты, которые могут мне помочь? Я просто хочу подключить один Arduino в течение 5 секунд и отключиться, а затем непрерывно подключаться к другому Arduino. Мой код работает, но иногда он вообще не подключается или где-то через 5 секунд первый Arduino BT отключается, а другой Arduino не подключается. Или оба Arduino начинают подключаться сразу же после запуска приложения.
Большая помощь ценится!!
Спасибо!
Что я уже пробовал:
Я уже пробовал этот код:
<pre>package com.busapp.simple.lcdlightsensor; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.CountDownTimer; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class MainActivity extends AppCompatActivity { private static final String TAG = "ArduinoBT"; //Light private static final String BT_NAME = "RNBT-E341"; String incomingMsg; TextView lightConn; BluetoothAdapter mBluetoothAdapter; BluetoothDevice mDevice; Set<BluetoothDevice> pairedDevices; ConnectThread mConnectThread; ConnectedThread mConnectedThread; //LCD TextView lcdConn; private static final String BT_NAME_LCD = "RNBT-E34E"; BluetoothAdapter BluetoothAdapterforLCD; BluetoothDevice DeviceforLCD; Set<BluetoothDevice> pairedDevicesforLCD; ConnectThread_LCD ConnectThreadforLCD; ConnectedThread_LCD ConnectedThreadforLCD; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothAdapterforLCD = BluetoothAdapter.getDefaultAdapter(); if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1); } pairedDevicesforLCD = BluetoothAdapterforLCD.getBondedDevices(); if (pairedDevicesforLCD.size() > 0) { for (BluetoothDevice device : pairedDevicesforLCD) { if (device.getName().equals(BT_NAME_LCD)) { DeviceforLCD = device; } } } pairedDevices = mBluetoothAdapter.getBondedDevices(); if (pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { if (device.getName().equals(BT_NAME)) { mDevice = device; } } } Toast.makeText( this, "" + DeviceforLCD.getName() + " & " + mDevice.getName(), Toast.LENGTH_LONG).show(); CountDownTimer countDownTimer = new CountDownTimer(10000, 1000) { @Override public void onTick(long millisUntilFinished) { // ConnectThreadforLCD = new ConnectThread_LCD(DeviceforLCD); // ConnectThreadforLCD.start(); Log.i(TAG, "Countdown start"); } @Override public void onFinish() { if ((ConnectedThreadforLCD != null) && (ConnectThreadforLCD != null)) { ConnectThreadforLCD.cancel(); ConnectedThreadforLCD.cancel(); Log.i(TAG, "LCD Cancelled"); } } }; countDownTimer.start(); ConnectThreadforLCD = new ConnectThread_LCD(DeviceforLCD); ConnectThreadforLCD.start(); // mConnectThread = new ConnectThread(mDevice); // mConnectThread.start(); // Log.i(TAG, "Connect to device: " + mDevice.getName()); } // public class ConnectThread_LCD extends Thread { private BluetoothSocket lcdSocket; private BluetoothDevice lcdDevice; private UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); public ConnectThread_LCD(BluetoothDevice device) { BluetoothSocket tmp = null; lcdDevice = device; if (tmp == null) { try { tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } } else { lcdSocket = tmp; } // try { // tmp = device.createRfcommSocketToServiceRecord(MY_UUID); // } catch (IOException e) { } lcdSocket = tmp; } public void run() { Log.i(TAG, "LCD Discover"); if (BluetoothAdapterforLCD.isDiscovering()) { BluetoothAdapterforLCD.cancelDiscovery(); } try { Log.i(TAG, "LCD Connected"); lcdSocket.connect(); } catch (IOException connectException) { try { lcdSocket.close(); Log.i(TAG, "LCD Socket Closed"); } catch (IOException closeException) { } return; } Log.i(TAG, "LCD ConnectedThread start"); ConnectedThreadforLCD = new ConnectedThread_LCD(lcdSocket); ConnectedThreadforLCD.start(); } public void cancel() { try { if (lcdSocket.isConnected()) { lcdSocket.close(); lcdSocket = null; } } catch (IOException e) { } } } public class ConnectedThread_LCD extends Thread { private BluetoothSocket lcdSocket; private InputStream lcdInstream; private OutputStream lcdOutstream; public ConnectedThread_LCD(BluetoothSocket socket) { Log.i(TAG, "Connected Thread"); lcdSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; try { tmpIn = lcdSocket.getInputStream(); tmpOut = lcdSocket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } lcdInstream = tmpIn; lcdOutstream = tmpOut; write(1); lcdHandler.obtainMessage(0, 0).sendToTarget(); Log.i(TAG, "InputStream contains tmpIn"); } public void run() { byte[] buffer = new byte[2048]; int bytes; } public void cancel() { try { if (lcdSocket.isConnected()) { lcdInstream.close(); lcdOutstream.close(); lcdSocket.close(); lcdSocket = null; } } catch (IOException e) { } } public void write (int bytes) { try { lcdOutstream.write(bytes); } catch (IOException e) { } } } Handler lcdHandler = new Handler() { String s; @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: // ConnectThreadforLCD.cancel(); // ConnectedThreadforLCD.cancel(); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mConnectThread = new ConnectThread(mDevice); mConnectThread.start(); Log.i(TAG, "LCD BT Cancelled"); break; } } }; //Arduino Code public class ConnectThread extends Thread { private BluetoothSocket mmSocket; private BluetoothDevice mmDevice; private UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); public ConnectThread(BluetoothDevice device) { BluetoothSocket tmp = null; mmDevice = device; if (tmp == null) { try { tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } } else { mmSocket = tmp; } // try { // tmp = device.createRfcommSocketToServiceRecord(MY_UUID); // } catch (IOException e) { } mmSocket = tmp; } public void run() { if (mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); } Log.i(TAG, "Discovering"); try { mmSocket.connect(); Log.i(TAG, "Socket Connected"); } catch (IOException connectException) { try { mmSocket.close(); } catch (IOException closeException) { } return; } mConnectedThread = new ConnectedThread(mmSocket); mConnectedThread.start(); Log.i(TAG, "Connect Started"); } public void cancel() { try { if (mmSocket.isConnected()) { mmSocket.close(); mmSocket = null; } } catch (IOException e) { } } } public class ConnectedThread extends Thread { private BluetoothSocket mmSocket; private InputStream mmInstream; private OutputStream mmOutstream; public ConnectedThread(BluetoothSocket socket) { Log.i(TAG, "Connected Thread"); mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; try { Log.i(TAG, "(aaa6)"); tmpIn = mmSocket.getInputStream(); tmpOut = mmSocket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } Log.i(TAG, "(aaa7)"); mmInstream = tmpIn; mmOutstream = tmpOut; write(1); Log.i(TAG, "InputStream contains tmpIn"); } public void run() { byte[] buffer = new byte[2048]; //String incomingMsg; int bytes; while (true) { Log.i(TAG, "While true"); try { bytes = mmInstream.read(buffer); //Log.i(TAG, "Buffer read" + String.valueOf(bytes)); byte[] buff = new byte[bytes]; Log.i(TAG, "Buffer read" + bytes); System.arraycopy(buffer, 0, buff, 0, bytes); incomingMsg = new String(buff); if(incomingMsg.equals(" ")) { continue; } Log.i(TAG, "(aaa11)"); mHandler.obtainMessage(1, incomingMsg).sendToTarget(); Log.i(TAG, "InputStream " + incomingMsg); } catch (IOException e) { e.printStackTrace(); Log.i(TAG, "Error reading input " + e.getMessage()); } } } public void cancel() { try { if (mmSocket.isConnected()) { mmInstream.close(); mmOutstream.close(); mmSocket.close(); mmSocket = null; } } catch (IOException e) { } } public void write (int bytes) { try { mmOutstream.write(bytes); } catch (IOException e) { } } } // Handler mHandler = new Handler() { String s; @Override public void handleMessage(Message msg) { switch(msg.what) { // case 0: //// ConnectThreadforLCD.cancel(); //// ConnectedThreadforLCD.cancel(); // // aConnectThread = new ConnectThread(aDevice); // aConnectThread.start(); // // Log.i(TAG, "LCD BT Cancelled"); // break; case 1: Log.i(TAG, "Message handled"); s = (String) incomingMsg; if (s!=null) { // lightValue.setText(s); // if ((Integer.parseInt(s) <= 300) || (Integer.parseInt(s) >= 500)) { // sendRequest(lightOn); // Log.i(TAG, "Send IFTTT request"); // } // else { // sendRequest(lightOff); // Log.i(TAG, "Send IFTTT request"); // } } break; } } }; @Override protected void onDestroy() { super.onDestroy(); ConnectedThreadforLCD.cancel(); ConnectThreadforLCD.cancel(); mConnectThread.cancel(); mConnectedThread.cancel(); } }
David Crow
Рассматривали ли вы возможность задать этот тип вопроса, с его большим дампом кода, на самом форуме Android? Это раздел "Быстрые ответы".
Можете ли вы подключиться и общаться с обоими Arduinos индивидуально? Возникает ли проблема только тогда, когда вы пытаетесь подключиться и общаться с обоими Arduinos одновременно?
dansica
Извини, я об этом не подумал.
Да, я могу общаться с обоими Arduinos индивидуально, и только тогда, когда я хочу подключиться одновременно, проблема всплывет на поверхность.