>
<>
<>
package com.example.bluetoothesp32;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private BluetoothSocket bluetoothSocket;
private OutputStream outputStream;
// UUID estándar SPP
private static final UUID MY_UUID =
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// CAMBIA esto por la MAC de tu ESP32
private static final String DEVICE_ADDRESS = "XX:XX:XX:XX:XX:XX";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Button btnConectar = findViewById(R.id.btnConectar);
Button btnA = findViewById(R.id.btnA);
Button btnB = findViewById(R.id.btnB);
Button btnC = findViewById(R.id.btnC);
btnConectar.setOnClickListener(v -> conectarESP32());
btnA.setOnClickListener(v -> enviarDato("A"));
btnB.setOnClickListener(v -> enviarDato("B"));
btnC.setOnClickListener(v -> enviarDato("C"));
}
private void conectarESP32() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.BLUETOOTH_CONNECT)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.BLUETOOTH_CONNECT},
1);
return;
}
}
try {
BluetoothDevice device =
bluetoothAdapter.getRemoteDevice(DEVICE_ADDRESS);
bluetoothSocket =
device.createRfcommSocketToServiceRecord(MY_UUID);
bluetoothSocket.connect();
outputStream = bluetoothSocket.getOutputStream();
Toast.makeText(this,
"Conectado al ESP32",
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this,
"Error al conectar",
Toast.LENGTH_SHORT).show();
}
}
private void enviarDato(String dato) {
if (outputStream != null) {
try {
outputStream.write(dato.getBytes());
Toast.makeText(this,
"Enviado: " + dato,
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
if (bluetoothSocket != null) {
bluetoothSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
<>
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
SerialBT.begin("ESP32_BT");
}
void loop() {
if (SerialBT.available()) {
char c = SerialBT.read();
Serial.println(c);
}
}
<>
package com.example.bluetoothesp32;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private ConnectThread connectThread;
private ConnectedThread connectedThread;
private static final UUID MY_UUID =
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static final String DEVICE_ADDRESS = "XX:XX:XX:XX:XX:XX"; // MAC ESP32
private Handler handler = new Handler(Looper.getMainLooper());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Button btnConectar = findViewById(R.id.btnConectar);
Button btnA = findViewById(R.id.btnA);
Button btnB = findViewById(R.id.btnB);
Button btnC = findViewById(R.id.btnC);
btnConectar.setOnClickListener(v -> conectarESP32());
btnA.setOnClickListener(v -> enviar("A"));
btnB.setOnClickListener(v -> enviar("B"));
btnC.setOnClickListener(v -> enviar("C"));
}
private void conectarESP32() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.BLUETOOTH_CONNECT)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.BLUETOOTH_CONNECT},
1);
return;
}
}
BluetoothDevice device =
bluetoothAdapter.getRemoteDevice(DEVICE_ADDRESS);
connectThread = new ConnectThread(device);
connectThread.start();
}
private void enviar(String mensaje) {
if (connectedThread != null) {
connectedThread.write(mensaje.getBytes());
} else {
Toast.makeText(this, "No conectado", Toast.LENGTH_SHORT).show();
}
}
// =========================
// HILO DE CONEXIÓN
// =========================
private class ConnectThread extends Thread {
private final BluetoothDevice device;
private BluetoothSocket socket;
public ConnectThread(BluetoothDevice device) {
this.device = device;
try {
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
bluetoothAdapter.cancelDiscovery();
try {
socket.connect();
handler.post(() ->
Toast.makeText(MainActivity.this,
"Conectado al ESP32",
Toast.LENGTH_SHORT).show());
connectedThread = new ConnectedThread(socket);
connectedThread.start();
} catch (IOException connectException) {
handler.post(() ->
Toast.makeText(MainActivity.this,
"Error al conectar",
Toast.LENGTH_SHORT).show());
try {
socket.close();
} catch (IOException closeException) {
closeException.printStackTrace();
}
}
}
}
// =========================
// HILO DE COMUNICACIÓN
// =========================
private class ConnectedThread extends Thread {
private final BluetoothSocket socket;
private final OutputStream outputStream;
public ConnectedThread(BluetoothSocket socket) {
this.socket = socket;
OutputStream tmp = null;
try {
tmp = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
outputStream = tmp;
}
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
handler.post(() ->
Toast.makeText(MainActivity.this,
"Enviado",
Toast.LENGTH_SHORT).show());
} catch (IOException e) {
e.printStackTrace();
}
}
public void cancel() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connectedThread != null) {
connectedThread.cancel();
}
}
}