美文网首页
Uts 蓝牙连接(2)

Uts 蓝牙连接(2)

作者: 空腹无才 | 来源:发表于2024-06-19 16:20 被阅读0次

    一、连接蓝牙步骤

    • 获取蓝牙地址,获取蓝牙服务
    • 监听连接状态
    • 获取服务特征信息
    • 设置 notify 监听(设备回调监听)
    • 向连接设备写入数据
    • 断开蓝牙服务

    二、案例

    import BluetoothAdapter from "android.bluetooth.BluetoothAdapter";
    import BluetoothGattCallback from "android.bluetooth.BluetoothGattCallback";
    import BluetoothGatt from "android.bluetooth.BluetoothGatt"
    import BluetoothProfile from 'android.bluetooth.BluetoothProfile';
    import BluetoothDevice from "android.bluetooth.BluetoothDevice";
    import UUID from 'java.util.UUID';
    import BluetoothGattService from 'android.bluetooth.BluetoothGattService';
    import BluetoothGattCharacteristic from 'android.bluetooth.BluetoothGattCharacteristic';
    import Base64 from "android.util.Base64";
    
    const serverUUID = "xxxxx-xxx-xxx-xx-xxxx";
    const characteristicUUID = "xxxxxx-xxx-xxx-xx-xxxx"
    const notifyCharacteristicUUID = "xxx-xxx-xxx-xx-xxxx"  // 有些设备 characteristicUUID 和notifyCharacteristicUUID 是一样的
    // 蓝牙Gatt服务
    let bluetoothGatt : BluetoothGatt | null = null;
    
    function sendBle(deviceAddress: string) {
        // 获取设备对象
        let device = bluetoothAdapter?.getRemoteDevice(deviceAddress);
        if(bluetoothGatt == null) {
            // 连接蓝牙
            bluetoothGatt = (device as BluetoothDevice).connectGatt(UTSAndroid.getUniActivity(), false, new BCallback()) as BluetoothGatt;
        }
    }
    
    class BCallback extends BluetoothGattCallback {
        constructor() {super()};
        // 监听蓝牙连接状态
        override onConnectionStateChange(gatt : BluetoothGatt, status : Int, newState : Int) {
            if (newState == BluetoothProfile.STATE_CONNECTED.toInt()) {
                // 修改 MTU值
                bluetoothGatt?.requestMtu(512)
                // 获取蓝牙服务信息
                gatt.discoverServices();
            }else if (newState == BluetoothProfile.STATE_DISCONNECTED.toInt()) {
                // 连接失败
                clearConnect();
            }   
        }
        
        // 获取服务、特征
        override onServicesDiscovered(gatt : BluetoothGatt, status : Int) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // 找到服
                const service:BluetoothGattService | null  = gatt.getService(UUID.fromString(serverUUID)) as BluetoothGattService;
                if (service !== null) {
                    // 找到获取特征
                    const characteristic = (service as BluetoothGattService).getCharacteristic(UUID.fromString(characteristicUUID));
                    const notifyCharacteristic = (service as BluetoothGattService).getCharacteristic(UUID.fromString(notifyCharacteristicUUID))
                    if (characteristic !== null) {
                        //  启动 notify
                        gatt.setCharacteristicNotification(notifyCharacteristic, true);
                        // 写入信息
                        this.writeData(gatt, characteristic as BluetoothGattCharacteristic)
                    }  else {
                        gatt.disconnect();
                    }
                } else {
                    gatt.disconnect();
                }
            } else {
                // 断开连接
                gatt.disconnect();
            }
        }
        
        // 处理特征值写入事件
        override onCharacteristicWrite(gatt : BluetoothGatt, characteristic : BluetoothGattCharacteristic, status : Int) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // 写入成功
            } else {
                // 写入失败
            }
        }
        
        // 监听低功率蓝牙设备回调
        override onCharacteristicChanged(gatt : BluetoothGatt, characteristic : BluetoothGattCharacteristic) {
            // 处理回调信息
            const data = characteristic.getValue();
            const base64String = Base64.encodeToString(data, Base64.DEFAULT);
            // 现在base64String是Base64编码的字符串
            const originalString = String(Base64.decode(base64String, Base64.DEFAULT), Charsets.UTF_8);
            
            //其他操作
            // ...
            gatt.disconnect()
        }
        
        // 处理写入事件
        writeData(gatt : BluetoothGatt, characteristic : BluetoothGattCharacteristic) {
            // 将传输内容转换成字节
            const bytes = ("12345").toByteArray(Charsets.UTF_8);
            if (this.canWrite(characteristic)) {
                characteristic.setValue(bytes);
                gatt.writeCharacteristic(characteristic);
            } else {
                // 蓝牙设备不支持写入
                gatt.disconnect()
            }
        }
        
        private canWrite(characteristic : BluetoothGattCharacteristic) : Boolean {
            const writeType = characteristic.getWriteType();
            return writeType == BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE || writeType == BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT;
        }
    }
    
    // 清理蓝牙连接服务
    function clearConnect() {
        if(bluetoothGatt !== null) {
            (bluetoothGatt as BluetoothGatt).close();
            bluetoothGatt = null;
            console.log("清空蓝牙信息")
        }
    }
    

    相关文章

      网友评论

          本文标题:Uts 蓝牙连接(2)

          本文链接:https://www.haomeiwen.com/subject/llnqcjtx.html