android蓝牙连接133问题的解决办法---(连接篇)

本文探讨了Android蓝牙连接中常见的133错误,分析了其在低配机型上的原因,提供了一套实测有效的解决方案,包括如何正确使用gatt.disconnect()和gatt.close(),以及在遇到133错误时的重试策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章介绍了“蓝牙扫描”,今天来说一下android蓝牙连接过程中133的问题:

我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率。个人发现的一个规律是:一般出现蓝牙连接133的问题,大多是android低配机型(虽然上层调用了gatt.close()方法,但手机底层蓝牙服务可能仍与设备保持连接状态,其所占用蓝牙资源不能及时释放,所以导致了我们连接一直出现133的问题)。

这里先说一下常规操作:我们在蓝牙连接失败或者断开连接时,一定要及时的进行gatt.disconnect()和gatt.close()操作;但是在实际的开发过程中,我们可能会进入一种死循环:即如果一旦出现连接133的情况下,如果不断开蓝牙开关一次或设备重新上电一次,可能会一直出现133的情况。这种情况显然不是我们想看到的,所以个人总结出一套亲测有效的方法(此方法无法100%规避出现133的问题,但可以提高出现133情况之后再去连接的成功率),下面看一段刚刚写的一段demo,但实际项目仍会有很有需要优化的地方,仅供参考:

/**
 * 连接设备(为了给客官们更详尽的展示,所以把很多变量都写在了方法内,实际项目中很多变量不会在方法内初始化)
 * 入参:设备mac地址
 * @param mac
 */
private  void  connectDevice(final String mac){
    // 获取蓝牙适配器
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if(bluetoothAdapter == null){
        Log.d("connectDevice","bluetoothAdapter is null");
        return;
    }
    // 根据mac地址获取蓝牙设备实例对象,当然此处的bluetoothDevice也可以通过蓝牙扫描得到
    BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(mac);
    if(bluetoothDevice == null){
        Log.d("connectDevice","this device is not exist");
        return;
    }
    // 由于今天只讨论蓝牙连接问题,所以这里仅重写了"监测连接状态变化"的方法
    gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            if(status == 0){ //表示gatt服务成功
                if(newState == BluetoothProfile.STATE_CONNECTED){  // 连接成功状态
                      //连接成功之后的操作
                }else if(newState == BluetoothProfile.STATE_DISCONNECTED){ // 断开连接状态
                      //断开连接之后的操作
                }
            }else {
                gatt.disconnect();
                gatt.close();
                if(status == 133){ //经典错误:133
                   //提示:此处我们可以根据全局的一个flag,去重试连接一次,以增大连接成功率
                    if(!isRetry){
                        isRetry = true;
                        connectDevice(mac);
                    }
                }
            }
        }
    };
    // gatt为全局变量,获取当前gatt服务下连接的设备
    if(gatt != null && gatt.getConnectedDevices() != null){
        for(BluetoothDevice device:gatt.getConnectedDevices()){
            if(device.getAddress().equals(mac)){  // 如果当前遍历出的连接设备与我们需要连得设备是同一设备
                gatt.disconnect(); //先去断开之前未正常断开的连接,解决连接133的问题
            }
        }
        gatt.close(); //释放gatt服务
        gatt = null;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        gatt = bluetoothDevice.connectGatt(MainActivity.this,
                false, gattCallback, TRANSPORT_LE);  //
    } else {
        gatt = bluetoothDevice.connectGatt(MainActivity.this,
                false, gattCallback);
    }
}

关于蓝牙连接的问题先告一段落了,后面有时间会继续分享BluetoothGattCallback内的其他方法的作用。也欢迎大家指正以及提出宝贵的意见,互相进步。谢谢~

 

Android Studio中连接HC-05蓝牙模块,需要使用Android蓝牙API和串口通信协议,具体步骤如下: 1. 在AndroidManifest.xml文件中添加蓝牙权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` 2. 在应用程序中使用BluetoothAdapter类来获取本地蓝牙适配器: ```java BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ``` 3. 使用BluetoothAdapter对象来搜索HC-05蓝牙模块: ```java bluetoothAdapter.startDiscovery(); ``` 4. 连接HC-05蓝牙模块。首先需要获取HC-05蓝牙模块的MAC地址,然后使用BluetoothDevice类来连接蓝牙模块: ```java String mac = "00:11:22:33:44:55"; // HC-05蓝牙模块的MAC地址 BluetoothDevice device = bluetoothAdapter.getRemoteDevice(mac); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); ``` 其中,uuid是HC-05蓝牙模块服务的UUID,可以在HC-05模块的说明书中找到。 5. 使用IO流进行数据的传输和通信。可以使用InputStream和OutputStream来进行数据的读写操作: ```java InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); byte[] buffer = new byte[1024]; int bytes; bytes = inputStream.read(buffer); outputStream.write(buffer, 0, bytes); ``` 6. 最后,在应用程序退出时需要关闭蓝牙连接: ```java socket.close(); ``` 以上是Android Studio连接HC-05蓝牙模块的基本步骤,具体的实现过程需要根据应用程序的需求和实际情况进行相应的调整和修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值