Как организовать Bluetooth подключение к двум платам с HC-06?

Как из ANDROID организовать двусторонний обмен данными с двумя платами ARDUINO с подключенными к ним Bluetooth модулями HC-06.
С одной платой связь устанавливаю, передача данных работает. Не пойму, каким образом сделать подключение ко второму приемнику.
  • Вопрос задан
  • 1118 просмотров
Решения вопроса 1
@Afdenis Автор вопроса
Вопрос снят, решение найдено, немного изменил найденный в сети пример, где было реализовано единичное подключение:
package ru.bltmulti;

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.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 btn1On, btn1Off, btn1Reset, btn2On, btn2Off, btn2Reset;
  TextView txtArduino;
  Handler h;
   
  private static final int REQUEST_ENABLE_BT = 1;
  final int RECIEVE_MESSAGE = 1;		// Статус для Handler
  private BluetoothAdapter btAdapter = null;
  private BluetoothSocket btSocket = null;
  private BluetoothSocket btSocket2 = null;
  private StringBuilder sb = new StringBuilder();
  
  private ConnectedThread mConnectedThread;
  private ConnectedThread mConnectedThread2;
   
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
 
  private static String address = "98:D3:31:60:2F:13";
  private static String address2 = "98:D3:31:20:43:5F";
   
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    setContentView(R.layout.activity_main);
 
    btn1On = (Button) findViewById(R.id.btn1On);					// кнопка включения
    btn1Off = (Button) findViewById(R.id.btn1Off);				// кнопка выключения
    btn1Reset = (Button) findViewById(R.id.btn1Reset);
    btn2On = (Button) findViewById(R.id.btn2On);					// кнопка включения
    btn2Off = (Button) findViewById(R.id.btn2Off);				// кнопка выключения
    btn2Reset = (Button) findViewById(R.id.btn2Reset);
    txtArduino = (TextView) findViewById(R.id.txtArduino);		// для вывода текста, полученного от Arduino
    
    h = new Handler() {
    	public void handleMessage(android.os.Message msg) {
    		switch (msg.what) {
            case RECIEVE_MESSAGE:													
            	byte[] readBuf = (byte[]) msg.obj;
            	String strIncom = new String(readBuf, 0, msg.arg1);
            	sb.append(strIncom);											
            	int endOfLineIndex = sb.indexOf("\r\n");							
            	if (endOfLineIndex > 0) { 										
            		String sbprint = sb.substring(0, endOfLineIndex);				
                    sb.delete(0, sb.length());										
                	txtArduino.setText("Ответ от Arduino: " + sbprint); 	      
                	btn1Off.setEnabled(true);
                	btn1On.setEnabled(true);
                    btn2Off.setEnabled(true);
                    btn2On.setEnabled(true);
                }
            	//Log.d(TAG, "...Строка:"+ sb.toString() +  "Байт:" + msg.arg1 + "...");
            	break;
    		}
        };
	};
     
    btAdapter = BluetoothAdapter.getDefaultAdapter();		
    checkBTState();
 
    btn1On.setOnClickListener(new OnClickListener() {       
      public void onClick(View v) {
        btn1On.setEnabled(false);
        mConnectedThread.write("w");    
        
      }
    });
 
    btn1Off.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        btn1Off.setEnabled(false);
        mConnectedThread.write("s");   
        
      }
    });

    btn1Reset.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        //btn1Reset.setEnabled(false);
        mConnectedThread.write("x");   
      }
    });

    btn2On.setOnClickListener(new OnClickListener() {        
      public void onClick(View v) {
        btn2On.setEnabled(false);
        mConnectedThread2.write("e");   
      }
    });

    btn2Off.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        btn2Off.setEnabled(false);
        mConnectedThread2.write("d");  
      }
    });

    btn2Reset.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        //btn2Reset.setEnabled(false);
        mConnectedThread2.write("c");   
      }
    });
  }
   
  @Override
  public void onResume() {
    super.onResume();
 
    Log.d(TAG, "...onResume - попытка соединения...");
   
    
    BluetoothDevice device = btAdapter.getRemoteDevice(address);
    BluetoothDevice device2 = btAdapter.getRemoteDevice(address2);
   
    try {
      btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
      btSocket2 = device2.createRfcommSocketToServiceRecord(MY_UUID);
    } catch (IOException e) {
      errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
    }

   btAdapter.cancelDiscovery();
   
    Log.d(TAG, "...Соединяемся...");
    try {
      btSocket.connect();
      Log.d(TAG, "...Соединение 1 установлено и готово к передачи данных...");
    } catch (IOException e) {
      try {
        btSocket.close();
      } catch (IOException e2) {
        errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
      }
    }
    try {
      btSocket2.connect();
      Log.d(TAG, "...Соединение 2 установлено и готово к передачи данных...");
    } catch (IOException e) {
      try {
        btSocket2.close();
      } catch (IOException e2) {
        errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
      }
    }

    Log.d(TAG, "...Создание Socket...");
   
    mConnectedThread = new ConnectedThread(btSocket);
    mConnectedThread.start();
    mConnectedThread2 = new ConnectedThread(btSocket2);
    mConnectedThread2.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() + ".");
    }
    try     {
      btSocket2.close();
    } catch (IOException e2) {
      errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
    }
  }
   
  private void checkBTState() {
    if(btAdapter==null) { 
      errorExit("Fatal Error", "Bluetooth не поддерживается");
    } else {
      if (btAdapter.isEnabled()) {
        Log.d(TAG, "...Bluetooth включен...");
      } else {
        Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
      }
    }
  }
 
  private void errorExit(String title, String message){
    Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
    finish();
  }
 
  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;
	        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()
	        while (true) {
	        	try {
	                bytes = mmInStream.read(buffer);
                        h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();		
	            } catch (IOException e) {
	                break;
	            }
	        }
	    }
	 
	    public void write(String message) {
	    	Log.d(TAG, "...Данные для отправки: " + message + "...");
	    	byte[] msgBuffer = message.getBytes();
	    	try {
	            mmOutStream.write(msgBuffer);
	        } catch (IOException e) {
	            Log.d(TAG, "...Ошибка отправки данных: " + e.getMessage() + "...");     
	          }
	    }
	 
	    public void cancel() {
	        try {
	            mmSocket.close();
	        } catch (IOException e) { }
	    }
	}
  
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы