关于android 经典蓝牙开发 使用UUID连接的问题

xiaoxiao2021-02-28  55

先贴一下我连接的代码,有点乱 开启蓝牙连接,由于连接是耗时的,所以肯定新开一个线程去连接,以下是连接的代码`package

/** * Created by lyl on 2017/8/6. */

public class ConnectThread extends Thread { private BluetoothDevice btd; private BluetoothSocket bts; private BluetoothController mController; //00001101-0000-1000-8000-00805f9b34fb public static final String MY_UUID = “00001101-0000-1000-8000-00805F9B34FB”; private InputStream in; private OutputStream out; private static byte read_byts[] = new byte[120]; public static boolean isConnected = false;

public ConnectThread(BluetoothDevice btd) { BluetoothSocket temp = null; mController = new BluetoothController(); this.btd = btd; try { temp = btd.createInsecureRfcommSocketToServiceRecord(UUID.fromString(MY_UUID)); } catch (IOException e) { e.printStackTrace(); } bts = temp; } private static android.os.Handler handler = new android.os.Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { } } }; @Override public void run() { super.run(); //取消搜索因为搜索会让连接变慢 mController.getmAdapter().cancelDiscovery(); try { //通过socket连接设备,这是一个阻塞操作,直到连接成功或发生异常 Log.e(TAG, "run: 连接1"); Log.e(TAG, "当前线程2:" + Thread.currentThread()); // bts.connect(); bts=connectBtByChannel(btd); Log.e(TAG, "run: 连接2"); Log.e(TAG, "run: 连接成功" ); if (bts.isConnected()) { isConnected = true; in = bts.getInputStream(); out = bts.getOutputStream(); } } catch (IOException e) { Log.e(TAG, "run: 连接3——————————————————————》" + e.getMessage()); Log.e(TAG, "run: 连接3"); //无法连接,关闭socket并且退出 System.out.println("=========拒绝"); try { bts.close(); } catch (IOException e1) { e1.printStackTrace(); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } while (isConnected) { try { Log.e(TAG, "当前线程:" + Thread.currentThread()); int len = in.read(read_byts); if (len != -1) { Message me = Message.obtain(); me.what = 1; handler.sendMessage(me); } } catch (IOException e) { e.printStackTrace(); } } //管理连接(在独立的线程) // manageConnectedSocket(mmSocket); } /* Call this from the main activity to send data to the remote device */ public void write(byte[] bytes) { try { out.write(bytes); } catch (IOException e) { } } public void cancel() { try { bts.close(); } catch (IOException e) { e.printStackTrace(); } } private static int port = 0; /** * 通过反射原理,使用随机端口发起蓝牙连接 */ public BluetoothSocket connectBtByChannel(BluetoothDevice mBluetoothDevice) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IOException, InvocationTargetException { Method method = mBluetoothDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); port = port++ % 30; if (port == 0) { port = 1; } BluetoothSocket mBluetoothSocket = (BluetoothSocket) method.invoke(mBluetoothDevice, port);//1-30端口 mBluetoothSocket.connect();//发起连接 return mBluetoothSocket; } /** * 通过反射原理,发起蓝牙连接 * */ public BluetoothSocket connectBtBySco(BluetoothDevice mBluetoothDevice) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IOException{ Method method = mBluetoothDevice.getClass().getMethod("createScoSocket"); BluetoothSocket mBluetoothSocket = (BluetoothSocket)method.invoke(mBluetoothDevice); mBluetoothSocket.connect();//发起连接 return mBluetoothSocket; } /**未配对过的,在连接建立之前先配对 * [url=home.php?mod=space&uid=2643633]@throws[/url] Exception */ public void createBond(BluetoothDevice mBluetoothDevice) throws Exception{ try { // 连接建立之前的先配对 if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) { Method creMethod = BluetoothDevice.class.getMethod("createBond"); Log.i("BluetoothManager", "开始配对"); creMethod.invoke(mBluetoothDevice); } } catch (Exception e) { // TODO: handle exception //DisplayMessage("无法配对!"); e.printStackTrace(); throw new Exception("Can't createBond with this device,please try again"); } }

} 一开始我是使固定的UUID去获取一个BlueToothSocket temp = btd.createInsecureRfcommSocketToServiceRecord(UUID.fromString(MY_UUID)); 拿到之后进行连接 bts.connect(); 但是不知道什么原因一直返回 read failed, socket might closed or timeout, read ret: -1 可能是UUID的问题吧。 然后百度一下这个问题,也有很多人都碰到过这个问题,用了其中一个人的解决办法 地址是[http://www.eoeandroid.com/thread-913808-1-2.html?_dsign=16c362c1]得到了解决

转载请注明原文地址: https://www.6miu.com/read-77437.html

最新回复(0)