Skip to content

BLE库历史版本介绍

Allen Iverson edited this page Jan 11, 2021 · 3 revisions

Version

1.支持多设备同时写入队列接口
RequestTask requestTask = new RequestTask.Builder()
                    .devices(connectedDevices.toArray(new BleDevice[]{}))
                    .data("hello android".getBytes())
                    .delay(500)
                    .build();
ble.writeQueue(requestTask);

2.支持连接异常重试接口
Ble.options().setConnectFailedRetryCount(3)//连接异常时(如蓝牙协议栈错误)

Version

1.添加自定义BleDevice接口(实现BleDeviceFactory接口)
public class BleRssiDevice extends BleDevice{
    //添加自定义属性值
    private int deviceType;
    private int rssi;
    ...
}
必须在初始化时设置:
Ble.options().setFactory(new BleFactory() {//实现自定义BleDevice时必须设置
    @Override
    public BleRssiDevice create(String address, String name) {
        return new BleRssiDevice(address, name);//自定义BleDevice的子类
    }
})

2.添加实现所有回调接口的Callback(可用于OTA升级等,完全解耦项目)
public class MyBleWrapperCallback extends BleWrapperCallback<BleDevice> {
    ...
}

Ble.options().setBleWrapperCallback(new MyBleWrapperCallback())

Version

1.添加写入队列(异步,可自定义队列每个任务延迟时间)
    @CheckConnect //检查是否连接
    private void writeQueue() {
        String address = ble.getConnetedDevices().get(0).getBleAddress();
        for (int i = 0; i < 30; i++) {
            //ble.writeQueueDelay(50, RequestTask.newWriteTask(address, "hello android".getBytes()));
            ble.writeQueue(RequestTask.newWriteTask(address, "hello android".getBytes()));
        }
    }
2.同时连接多个
    ble.connects(adapter.getDevices(), connectCallback);
3.取消连接多个设备(取消正在连接/已加入队列中还未连接的设备)
    ble.cancelConnecttings(adapter.getDevices());
4.更新部分:
    BleConnectCallback<BleDevice> connectCallback = new BleConnectCallback<BleDevice>() {
        @Override
        public void onReady(BleDevice device) {
            super.onReady(device);
            /*连接成功后,在次回调中设置通知,否则收不到设备的数据*/
            ble.startNotify(device, bleNotiftCallback);
        }
    };

Version

添加自动分包发送接口(无需添加延迟,自动根据系统底层返回结果处理)
    EntityData entityData = new EntityData.Builder()
                .setLastPackComplete(true)//最后一包是否自动补零,默认false
                .setAutoWriteMode(autoWriteMode)//是否设置自动模式发送,默认false
                .setAddress(device.getBleAddress())
                .setData(data)//大数据文件的字节数组
                .setPackLength(20)//每包发送字节数
                .setDelay(50L)//自动模式下无需设置delay
                .build();
    mBle.writeEntity(entityData, new BleWriteEntityCallback<BleDevice>() {
         @Override
         public void onWriteSuccess() {
              ...
         }

         @Override
         public void onWriteFailed() {
              ...
         }
    });

Version

优化频繁收到通知数据,偶尔丢包的问题

Version

1、添加过滤扫描设备接口
    mBle = Ble.options()
                 .setLogBleExceptions(true)
                 .setThrowBleException(true)
                 .setAutoConnect(true)
                 .setFilterScan(true)//设置是否过滤扫描到的设备
                 .setConnectFailedRetryCount(3)
                 .setConnectTimeout(10 * 1000)
                 .setScanPeriod(12 * 1000)
                 .setUuidService(UUID.fromString("0000fee9-0000-1000-8000-00805f9b34fb"))
                 .setUuidWriteCha(UUID.fromString("d44bc439-abfd-45a2-b575-925416129600"))
                 .create(getApplicationContext());
 2、优化自动重连接口
 3、添加Android5.0发送广播的接口
    byte[] payload = new byte[16];
    payload[0] = 0x01;
    mBle.startAdvertising(payload);
 4、收到广播包并解析后的数据
    BleScanCallback<BleDevice> scanCallback = new BleScanCallback<BleDevice>() {
            @Override
            public void onLeScan(final BleDevice device, int rssi, byte[] scanRecord) {
                Log.e(TAG, "onLeScan: "+device.getBleAddress());
                synchronized (mBle.getLocker()) {
                    mLeDeviceListAdapter.addDevice(device);
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            }

            //收到广播包并解析后的数据
            @Override
            public void onParsedData(BleDevice device, ScanRecord scanRecord) {
                super.onParsedData(device, scanRecord);
                byte[] data = scanRecord.getManufacturerSpecificData(65535);//参数为厂商id
                if (data != null){
                    Log.e(TAG, "onParsedData: "+ ByteUtils.BinaryToHexString(data));
                }
            }
        };


Version

1、添加发送大数据量的进度回调
    private void sendEntityData() throws IOException {
            byte[] data = ByteUtils.toByteArray(getAssets().open("WhiteChristmas.bin"));
            Log.e(TAG, "sendEntityData: "+data.length);
            mBle.writeEntity(mBle.getConnetedDevices().get(0), data, 20, 50, new BleWriteEntityCallback<BleDevice>() {
                @Override
                public void onWriteSuccess() {
                    L.e("writeEntity", "onWriteSuccess");
                }

                @Override
                public void onWriteFailed() {
                    L.e("writeEntity", "onWriteFailed");
                }

                @Override
                public void onWriteProgress(double progress) {
                    Log.e("writeEntity", "当前发送进度: "+progress);
                }

                @Override
                public void onWriteCancel() {
                    Log.e(TAG, "onWriteCancel: ");
                }
            });
        }
2、修复持续接收通知回调过快导致数据重复的问题
3、修复多设备连接,同时断开所有设备,回调次数不完整的问题

Version

1、添加自动连接的接口(使用新的初始化写法)
    mBle = Ble.options()
                 .setLogBleEnable(true)
                 .setThrowBleException(true)
                 .setAutoConnect(true)//自动重连
                 .setConnectFailedRetryCount(3)
                 .setConnectTimeout(10 * 1000)
                 .setScanPeriod(12 * 1000)
                 .setUuidService(UUID.fromString("0000fee9-0000-1000-8000-00805f9b34fb"))
                 .setUuidWriteCha(UUID.fromString("d44bc439-abfd-45a2-b575-925416129600"))
                 .create(getApplicationContext());
2、优化断开连接后,自动移除通知监听的问题

Version

1、添加了发送大数据包(如:文件等)的接口
    try {
        //获取整个文件的总字节
        byte[]data = toByteArray(getAssets().open("WhiteChristmas.bin"));
        //发送大数据量的包
        mBle.writeEntity(mBle.getConnetedDevices().get(0), data, 20, 50, new BleWriteEntityCallback<BleDevice>() {
            @Override
            public void onWriteSuccess() {
                L.e("writeEntity", "onWriteSuccess");
            }

            @Override
            public void onWriteFailed() {
                L.e("writeEntity", "onWriteFailed");
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
2、修复了正在扫描时,关闭蓝牙导致停止扫描onStop()不回调的问题

Version

1、添加通过mac地址连接的接口:
    String address = device.getBleAddress();//或者  String address = "3E:9A:4A:71:F6:4D";
    mBle.connect(address, new BleConnCallback<BleDevice>() {
         @Override
         public void onConnectionChanged(BleDevice device) {

         }
       });
2、添加BLE4.2的设置MTU的接口:
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        //此处第二个参数  不是特定的   比如你也可以设置500   但是如果设备不支持500个字节则会返回最大支持数
        mBle.setMTU(mBle.getConnetedDevices().get(0).getBleAddress(), 250, new BleMtuCallback<BleDevice>() {
            @Override
            public void onMtuChanged(BleDevice device, int mtu, int status) {
                super.onMtuChanged(device, mtu, status);
                ToastUtil.showToast("最大支持MTU:"+mtu);
            }
        });
    }else {
        ToastUtil.showToast("设备不支持MTU");
    }

Version

修复连接多个设备在onChanged()回调中判断设备对象
    /*设置通知的回调*/
    private BleNotiftCallback<BleDevice> bleNotiftCallback =  new BleNotiftCallback<BleDevice>() {
        @Override
        public void onChanged(BleDevice device, BluetoothGattCharacteristic characteristic) {
            UUID uuid = characteristic.getUuid();
            Log.e(TAG, "onChanged==uuid:" + uuid.toString());
            Log.e(TAG, "onChanged==address:"+ device.getBleAddress());
            Log.e(TAG, "onChanged==data:" + Arrays.toString(characteristic.getValue()));
        }
    };

Version

更新低版本手机(初始化问题)报错问题

Version

1、修复上个版本依赖地址变化,导致依赖时出现问题。
2、添加清理蓝牙缓存接口

Version

适配更新5.0以上版本手机扫描的API

Version

该版本添加跳转到测试界面(先连接设备),在测试界面操作该蓝牙对象的扫描、连接、断开、通知等回调的接口(任意界面都可以随心所欲的操作或者拿到mcu返回的数据)
1、在其他界面你也想拿到蓝牙设备传过来的数据,你可以这样做:(重要)
    //测试通知
    public void testNotify(BleDevice device) {
        if(device != null){
            mNotifyStatus.setText("设置通知监听成功!!!");
            mBle.startNotify(device, new BleNotiftCallback<BleDevice>() {
                @Override
                public void onChanged(BluetoothGattCharacteristic characteristic) {
                    Log.e(TAG, "onChanged: " + Arrays.toString(characteristic.getValue()));
                    mNotifyValue.setText("收到MCU通知值:\n"+Arrays.toString(characteristic.getValue()));
                }
            });
        }
    }
2、在其他界面也想连接或者断开上个界面的设备对象,你可以这么做:
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //测试连接或断开
                final BleDevice device = mLeDeviceListAdapter.getDevice(position);
                if (device == null) return;
                if (mBle.isScanning()) {
                    mBle.stopScan();
                }
                if (device.isConnected()) {
                    //2.1.0版本新增接口(mBle.disconnect(device)接口仍可正常使用)
                    mBle.disconnect(device, connectCallback);
                } else if (!device.isConnectting()) {
                    mBle.connect(device, connectCallback);
                }
            }
        });
3、扫描、发送数据、读取数据等接口都可如上正常使用(与之前版本一样)

Version

该版本添加根据蓝牙地址获取蓝牙对象的接口

Version

该版本修复读、写、通知特征uuid相同的情况下,出现无法设置通知的BUG

Version

该版本优化内部api结构,但并不影响外部接口调用

Version

该版本增加主动读取数据以及读取远程RSSI值的接口

Version

该版本重构V 1.x版本,作为全新升级版本,重大类、接口进行重命名,使各个接口完成单一功能,并使之得到单一功能的回调。
注:至此V 2.0.0版本以后不再维护1.x版本

Version

增加了自动连接的接口

Version

初始版本,可完成基本的BLE蓝牙一系列操作(扫描、连接、断开、设置通知、发送数据等等)
Clone this wiki locally