IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android BLE (二)---连接 -> 正文阅读

[移动开发]Android BLE (二)---连接

Android BLE (二)—连接

1、连接前准备

首先需要在扫描设备的时候拿到BluetoothDevice对象,Context(在Activity或者Application中获取到)和 连接回调接口BluetoothGattCallback(需要自己定义和编写代码)
BluetoothGattCallback接口写法

private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {
            super.onPhyUpdate(gatt, txPhy, rxPhy, status);
        }

        @Override
        public void onPhyRead(BluetoothGatt gatt, int txPhy, int rxPhy, int status) {
            super.onPhyRead(gatt, txPhy, rxPhy, status);
        }

        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);

        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicRead(gatt, characteristic, status);
        }

        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
        }

        @Override
        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorRead(gatt, descriptor, status);
        }

        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorWrite(gatt, descriptor, status);
        }

        @Override
        public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
            super.onReliableWriteCompleted(gatt, status);
        }

        @Override
        public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
            super.onReadRemoteRssi(gatt, rssi, status);
        }

        @Override
        public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
            super.onMtuChanged(gatt, mtu, status);
        }

        @Override
        public void onServiceChanged(@NonNull BluetoothGatt gatt) {
            super.onServiceChanged(gatt);
        }
    };

2、准备后就可以直接连接了

BluetoothDevice连接直接调用connect()方法就可以,connect方法有多个带有不一样参数的,我这里使用的是带三个参数的,第一个参数是上下文(Context),第二个参数是Boolean类型,主要是断开是否回连的标志,第三个就是连接回调接口BluetoothGattCallback,该返回BluetoothGatt对象,Bluetooth对象可以断开连接(disconnect方法)和回收资源(close方法)

mBluetoothDevice.connectGatt(mContext, false, gattCallback);

3、处理BluetoothGattCallback中的onConnectionStateChange方法

BluetoothDevice调用connect方法连接后,不管成功与否,都会调用onConnectionStateChange方法,我们在这个方法中处理:成功执行下一步,失败继续连接或者处理其他的,需要更改MTU的成功时调用gatt.requestMtu(80);,不需要则调用gatt.discoverServices();发现服务

@SuppressLint("MissingPermission")
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            if(status == BluetoothGatt.GATT_SUCCESS){ //判断是否执行成功 (连接或者断开连接都会调用onConnectionStateChange)
                if(newState == BluetoothProfile.STATE_CONNECTED){ //判断这次连接是否成功,这里我们可以设置MTU或者发现服务
                    gatt.requestMtu(80);
                }else if(newState == BluetoothProfile.STATE_DISCONNECTED){ //判断这次断开连接是否成功,这里我们可以继续连接或者回收资源
                    gatt.close();
                }
            }else{ //执行失败,这里我们可以继续连接或者回收资源
                gatt.close();
            }

        }

4、处理gatt.requestMtu(80);的请求回调onMtuChanged

@SuppressLint("MissingPermission")
        @Override
        public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
            super.onMtuChanged(gatt, mtu, status);
            if(status == BluetoothGatt.GATT_SUCCESS){ //MTU设置成功,下一步发现服务
                gatt.discoverServices();
            }else{ //设置MTU失败,这里可以继续下一步发现服务,也可以继续设置MTU或者断开连接
                gatt.disconnect();
            }
        }

5、处理gatt.discoverServices();的回调方法onServicesDiscovered

在这个回调方法中,我们可以获取蓝牙服务Bluetooth、特征和描述符

@SuppressLint("MissingPermission")
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);
            List<BluetoothGattService> services = gatt.getServices(); //获取蓝牙全部服务;获取特定的服务可以使用gatt.getService(UUID.fromString("UUID值"));
            if(services != null && services.size() > 0){
                for(BluetoothGattService service:services){
                    List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics(); //获取服务的全部特征值
                    if(characteristics != null && characteristics.size() > 0){
                        for(BluetoothGattCharacteristic characteristic:characteristics){
                            if(gatt.setCharacteristicNotification(characteristic,true)){
                                List<BluetoothGattDescriptor> descriptors = characteristic.getDescriptors(); //获取特征值的全部描述符
                                if(descriptors != null && descriptors.size() > 0){
                                    for(BluetoothGattDescriptor descriptor:descriptors){
                                        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); //接收到数据运行通知
                                        gatt.writeDescriptor(descriptor);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

6、使能特征后,就可以收到信息了,有信息接收到就会回调onCharacteristicChanged

@Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
            byte[] bytes = characteristic.getValue();
        }

7、写数据

使能号相关的特征值BluetoothGattCharacteristic后,保留该特征值对象

@SuppressLint("MissingPermission")
    private void writeData(byte[] bytes){
        if(mWriteCharacteristic != null ){
            mWriteCharacteristic.setValue(bytes);
            mBluetoothGatt.writeCharacteristic(mWriteCharacteristic);
        }
    }

8、断开连接

断开连接有两种方法,第一种BluetoothGatt调用disconnet方法,设备会断开连接,并回调onConnectionStateChange方法,但是不会回收资源;第二种BluetoothGatt调用close方法,直接断开连接并且回收资源,不会回调onConnectionStateChange方法。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:02:43  更:2022-05-10 12:04:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:05:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码