首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

BLE和EasyBle的使用(2)

BLE和EasyBle的使用(2)

关于BLE的MTU

MTU(Maximum Transmission Unit): 即数据的最大传输单元。具体是指一个Chracteristic一次性可传输的数据大小。
蓝牙核心规范(core spec)中定义了ATT的默认MTU为23byte,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。由于ATT的最大长度为512byte,故一般认为MTU的最大长度为512个byte。
注:core spec规定每一个设备都必须支持MTU为23。



安卓BLE通信开发
Gradle依赖

在项目根gradle中添加

    allprojects {
        repositories {
            maven { url 'https://jitpack.io' }
        }
    }

在具体module的gradle中添加

    dependencies {
        implementation 'com.github.Ficat:EasyBle:v1.0.3'
    }

使用

以下是BLE开发常用到的一些基础api

    //是否支持BLE
            BleManager.supportBle(context);
     
            //蓝牙是否打开
            BleManager.isBluetoothOn();
            
            //打开或关闭蓝牙,不显示请求用户授权dialog(一些特殊设备如大部分国产手机除外)
            BleManager.toggleBluetooth(true);
            
            //显示dialog请求用户打开蓝牙,需在传入的activity的onActivityResult中处理请求结果
            BleManager.enableBluetooth(activity,requestCode);

获取BleManager对象

    //获取管理器对象
            BleManager bleManager = BleManager.getInstance(this.getApplication());
     
            //设置ble选项,可多次设置,EasyBle将使用最新的options。比如本次扫描周期
            //为10s,但你想要下一次扫描周期更长一些,则再次调用本方法去设置即可
            BleManager.Options options = new BleManager.Options();
            options.loggable = true; //是否打印日志
            options.connectTimeout = 10000; //连接超时时间
            options.scanPeriod = 12000; //扫描周期
            options.scanDeviceName = "targetDeviceName"; //扫描的目标设备名
            options.scanDeviceAddress = "targetDeviceAddress"; //扫描目标设备地址如"DD:0D:30:00:0D:9B"
            options.scanServiceUuids = serviceUuidArray; //扫描含该服务UUID的目标设备
            bleManager.option(options);

扫描

安卓版本不小于6.0的,扫描必须要有定位权限

    bleManager.startScan(new BleScanCallback() {
                @Override
                public void onLeScan(BleDevice device, int rssi, byte[] scanRecord) {
                    String name = device.name;
                    String address = device.address;
                }
     
                @Override
                public void onStart(boolean startScanSuccess, String info) {
                    if (startScanSuccess) {
                        //开始扫描成功
                    } else {
                        //未能成功开始扫描,可通过info查看详情
                        String failReason = info;
                    }
                }
     
                @Override
                public void onFinish() {
                  
                }
            });

当需要结束扫描时用以下方法结束扫描,建议在扫描到目标设备后停止扫描

        bleManager.stopScan();

连接

    BleConnectCallback bleConnectCallback = new BleConnectCallback() {
                @Override
                public void onStart(boolean startConnectSuccess, String info, BleDevice device) {
                    if (startConnectSuccess) {
                        //开始连接
                    } else {
                        //未能成功开始连接,可通过info查看详情
                        String failReason = info;
                    }
                }
     
                @Override
                public void onTimeout(BleDevice device) {
     
                }
     
                @Override
                public void onConnected(BleDevice device) {
     
                }
     
                @Override
                public void onDisconnected(BleDevice device) {
     
                }
            };
     
           //通过BleDevice对象连接设备
           bleManager.connect(bleDevice, bleConnectCallback);
     
           //直接通过mac地址连接
           bleManager.connect(address, bleConnectCallback)

当需要断开与设备的连接时可使用以下任一方法断开设备连接

    //断开与指定设备的连接
           bleManager.disconnect(bleDevice);
           
           //传入目标的mac地址断开与该设备的连接
           bleManager.disconnect(address);
     
           //断开所有已连接设备
           bleManager.disconnectAll();
返回列表