欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BLE 开发总结

程序员文章站 2024-03-24 23:31:58
...

1 在所有蓝牙的回调中不要操作UI。

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                if (mOnConnectListener != null)
                    mOnConnectListener.onConnect(gatt);

                // Attempts to discover services after successful connection.
                boolean isSuccess = mBluetoothGatt.discoverServices();
                if (!isSuccess) {
                    disconnect();
                }
                LogUtil.i("BluetoothLEClient", "--gatt获取服务-------" + mBluetoothGatt
                        .discoverServices());
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                refreshDeviceCache();
                if (mOnDisconnectListener != null)
                    mOnDisconnectListener.onDisconnect(gatt);
            }
        }

应该通过回掉方法,去更新: mOnConnectListener.onConnect(gatt);

2 在所有的蓝牙回调中的耗时操作要开线程去解决。

3 发送数据千万不要太快,否则会有先发的数据无法执行回掉成功,比如开一个线程不加延时去读ble设 备的一个特征值,会有很高的几率不会执行回掉成功的方法

4 读取设备名字要尽量通过广播,其次考虑Gatt去获取名字,因为Gatt有可能读到缓存的名字

5 断开重连有时候会有搜不到的结果,原因1可能是设备没有继续发广播,原因2是可能手机蓝牙需要清 理下缓存

6 多设备连接的时候不要清理反射清理缓存的方法,因为这回使得其他设备都断开

7 扫描不到设备参考第五点

8 蓝牙断开后要通过close方法去释放资源

9 如果连接成功没有收到数据,可能是没有打开你的notify或者indicate,具体打开哪个需要看业务需 求

descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)

mBluetoothGatt.writeDescriptor(descriptor);

记得在onDescriptorWrite方法看是否打开成功

相关标签: BLE