studio scanner recibir por para example dispositivos detectar datos conectar con app android bluetooth

scanner - Enviar comando a Bluetooth desde dispositivo Android



recibir datos bluetooth android (3)

Tengo un problema para enviar comandos desde mi dispositivo Android al dispositivo Bluetooth.

Bluetooth está asociado con un microcontrolador. Mi esfuerzo está abajo:

public class MainActivity extends AppCompatActivity { private static final int REQUEST_ENABLE_BT = 2; private BluetoothAdapter mBluetoothAdapter; public static final String TAG = "CustomPOC BLEEEEEEE"; private Button btn_send; private BluetoothDevice mdevice; private Handler mHandler; private ConnectThread mConnectThread; private ConnectedThread mConnectedThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); btn_send = (Button)findViewById(R.id.senddata); if (mBluetoothAdapter == null) { Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); finish(); return; } if (!mBluetoothAdapter.isEnabled()) { Log.i(TAG, "onClick - BT not enabled yet"); Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } pairedOrNot(); btn_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mConnectThread = new ConnectThread(mdevice); mConnectThread.start(); // new ConnectAsynk(mdevice).execute(); } }); } private void pairedOrNot() { Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); List<String> s = new ArrayList<String>(); for(BluetoothDevice bt : pairedDevices) { s.add(bt.getAddress()); s.add(bt.getName()); if("08:7C:BE:00:00:01".equals(bt.getAddress())) { mdevice = bt; } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_ENABLE_BT: // When the request to enable Bluetooth returns if (resultCode == Activity.RESULT_OK) { Toast.makeText(this, "Bluetooth has turned on ", Toast.LENGTH_SHORT).show(); } else { // User did not enable Bluetooth or an error occurred Log.d(TAG, "BT not enabled"); Toast.makeText(this, "Problem in BT Turning ON ", Toast.LENGTH_SHORT).show(); finish(); } break; default: Log.e(TAG, "wrong request code"); break; } } private class ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); public ConnectThread(BluetoothDevice device) { BluetoothSocket tmp = null; mmDevice = device; try { tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); /*Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); tmp = (BluetoothSocket) m.invoke(device, 1);*/ System.out.println("BTTTTTTTTTTT Address "+mmDevice.getAddress()); BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()); // Method m; // m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); // tmp = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1)); } catch (Exception e){ e.printStackTrace(); } mmSocket = tmp; } public void run() { mBluetoothAdapter.cancelDiscovery(); try { mmSocket.connect(); // Reset the ConnectThread because we''re done synchronized (MainActivity.this) { mConnectThread = null; } // Cancel the thread that completed the connection if (mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; } // Cancel any thread currently running a connection if (mConnectedThread != null) { mConnectedThread.cancel(); mConnectedThread = null; } ConnectedThread mConnectedThread = new ConnectedThread(mmSocket); mConnectedThread.start(); } catch (IOException connectException) { try { connectException.printStackTrace(); mmSocket.close(); } catch (IOException closeException) { } } catch (Exception ex){ ex.printStackTrace(); } } public void cancel(){ try { mmSocket.close(); } catch (IOException e) { e.printStackTrace();} } } 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) { e.printStackTrace();} mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { byte[] buffer = new byte[1024]; int begin = 0; int bytes = 0; while (true) { try { bytes += mmInStream.read(buffer, bytes, buffer.length - bytes); for(int i = begin; i < bytes; i++) { if(buffer[i] == "1010101100000001000000100000000100001110".getBytes()[0]) { mHandler.obtainMessage(1, begin, i, buffer).sendToTarget(); begin = i + 1; if(i == bytes - 1) { bytes = 0; begin = 0; } } } } catch (IOException e) { e.printStackTrace(); break; } } } public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { e.printStackTrace(); } } public void cancel() { try { mmSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

Pocos heads-up que cuando compruebo el estado de la conexión por

tmp.isConnected()

Encontré que está regresando un

falso

valor.

Quiero enviar este comando (1010101100000001000000010000000100001110) a Bluetooth externo. Pero estoy recibiendo problema. La traza del registro está abajo en el momento del lanzamiento de la aplicación

08-17 07:48:39.718: W/art(14551): Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics. drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable

Cuando haga clic en el botón btn_send , obtengo el siguiente mensaje en el rastreo de registro:

08-17 07:51:32.046: W/BluetoothAdapter(14984): getBluetoothService() called with no BluetoothManagerCallback 08-17 07:51:38.448: W/System.err(14984): java.io.IOException: read failed, socket might closed or timeout, read ret: -1 08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573) 08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:584) 08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:321) 08-17 07:51:38.449: W/System.err(14984): at com.mahmad.custompoc11aug.MainActivity$ConnectThread.run(MainActivity.java:164)

y después de la depuración observo que el problema está en esta línea

mmSocket.connect();

Todos los permisos necesarios se dan en el archivo de manifiesto. Por favor, ayúdenme a eliminar este problema. Gracias por adelantado.


Como ha mencionado, el problema está en mmSocket.connect(); Por lo tanto, la línea no es el problema mientras envía el comando sino que crea una conexión, es decir, no puede recuperar un conector BluetoothSocket en estado abierto o conectado.

¿Qué debes hacer?

Trate de usar el siguiente código con UUID , es válido para mis dongles bluetooth.

UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); createInsecureRfcommSocketToServiceRecord(MY_UUID)

Hazme saber si esto funciona para ti.

También revise, https://.com/a/18786701/1503130



Tengo un código muy similar y está funcionando, tal vez una de las principales diferencias es que estoy haciendo un reinicio de hilos:

// Reset the ConnectThread because we''re done synchronized (blablabla.this) { mConnectThread = null; } // Cancel the thread that completed the connection if (mConnectThread != null) { mConnectThread.cancel(); mConnectThread = null; } // Cancel any thread currently running a connection if (mConnectedThread != null) { mConnectedThread.cancel(); mConnectedThread = null; } // Start the thread to manage the connection and perform transmissions mConnectedThread = new ConnectedThread(socket); mConnectedThread.start();

Justo después de hacer:

mmSocket.connect();

Espero eso ayude.