uniapp开发app中蓝牙设备功能详细步骤

uniapp开发应用中使用蓝牙设备时,正确的蓝牙设备初始化、搜索、连接和数据交互过程

1. 初始化蓝牙模块

在使用蓝牙功能之前,首先需要初始化蓝牙模块。以下是初始化蓝牙模块的代码示例:

uni.openBluetoothAdapter({
    success(res) {
        console.log('初始化蓝牙成功', res);
    },
    fail(err) {
        console.error('初始化蓝牙失败', err);
        if (err.errCode === 10001) {
            uni.onBluetoothAdapterStateChange((state) => {
                if (state.available) {
                    // 重新初始化蓝牙模块
                    uni.openBluetoothAdapter();
                }
            });
        }
    }
});

补充说明

  • 如果初始化蓝牙失败(错误码为10001),可以监听蓝牙适配器状态变化,并在蓝牙可用时重新初始化。

2. 搜索附近可连接的蓝牙设备

一旦蓝牙模块初始化成功,可以开始搜索附近的蓝牙设备。以下是搜索蓝牙设备的示例代码:

uni.startBluetoothDevicesDiscovery({
    allowDuplicatesKey: false,
    interval: 0,
    success: (res) => {
        console.log("执行搜索成功的回调", res);
    },
    fail: (error) => {
        console.log("搜索失败", error);
    }
});

// 定时停止搜索,避免长时间搜索占用系统资源
setTimeout(() => {
    uni.stopBluetoothDevicesDiscovery({
        success: (res) => {
            console.log("停止搜索成功", res);
        },
        fail: (error) => {
            console.log("停止搜索失败", error);
        }
    });
}, 10000);  // 10秒后停止搜索

补充说明

  • 通过定时器,在一定时间后停止搜索,以免长时间搜索消耗系统资源。

3. 连接低功耗蓝牙设备

一旦发现目标蓝牙设备,可以尝试连接。以下是连接低功耗蓝牙设备的示例代码:

uni.createBLEConnection({
    deviceId: this.deviceId,  // 替换为实际的设备 ID
    success: (res) => {
        console.log("连接成功", res);
        // 连接成功后可以获取设备的服务和特征值
        setTimeout(() => this.getBLEDeviceServices(), 1000); // 延迟1秒获取服务
    },
    fail: (error) => {
        console.log("连接失败", error);
        if (error.errCode === 10012) {
            console.log('连接超时');
        } else if (error.errCode === 10013) {
            console.log('连接设备不匹配');
        }
    }
});

补充说明

  • 在连接失败时,根据错误码提供更详细的错误信息和处理策略。

4. 获取蓝牙设备的服务和特征值

成功连接后,需要获取设备的服务和特征值,以便后续的数据交互。以下是获取服务和特征值的示例代码:

uni.getBLEDeviceServices({
    deviceId: this.deviceId,
    success: (res) => {
        console.log('成功获取蓝牙设备的所有服务', res);
        this.serviceId = res.services.find(service => service.isPrimary).uuid;  // 获取主要服务
        this.getBLEDeviceCharacteristics();
    },
    fail: (error) => {
        console.log('获取蓝牙设备的服务失败', error);
    }
});

补充说明

  • 确保选择正确的主要服务进行后续操作。

5. 启动 notify 功能监听蓝牙设备回传信息

获取特征值后,根据需要启用 notify 功能以监听蓝牙设备的回传信息。以下是启用 notify 功能的示例代码:

uni.getBLEDeviceCharacteristics({
    deviceId: this.deviceId,
    serviceId: this.serviceId,
    success: (res) => {
        console.log('获取 characteristic 成功', res);
        const characteristics = res.characteristics;
        this.readCharacteristic = characteristics.find(c => c.properties.read).uuid;  // 找到读特征值
        this.writeCharacteristicId = characteristics.find(c => c.properties.write).uuid;  // 找到写特征值
        this.startNotify();
    },
    fail: (error) => {
        console.log('获取 characteristic 失败', error);
    }
});

// 启动 notify 监听
startNotify() {
    uni.notifyBLECharacteristicValueChange({
        state: true,
        deviceId: this.deviceId,
        serviceId: this.serviceId,
        characteristicId: this.readCharacteristic,
        success: (res) => {
            console.log("开启 notify 功能成功", res);
            uni.onBLECharacteristicValueChange((res) => {
                let resHex = ab2hex(res.value);
                console.log("接收到回传内容:", resHex);
                this.handleResponse(resHex);
            });
        },
        fail: (error) => {
            console.log("监听失败", error);
        }
    });
}

补充说明

  • 确保特征值支持 notify 或 indicate 功能才能成功调用。

6. 向蓝牙设备发送指令

在连接并启用 notify 功能后,可以向蓝牙设备发送指令。以下是发送指令的示例代码:

let buffer = generateCommand(0xSA, 0x01);

uni.writeBLECharacteristicValue({
    deviceId: this.deviceId,
    serviceId: this.serviceId,
    characteristicId: this.writeCharacteristicId,
    value: buffer,
    success(res) {
        console.log('指令下发成功', res);
    },
    fail(error) {
        console.log('指令发送失败', error);
    }
});

/**
 * 生成 ArrayBuffer 格式的数据,可以直接用于给蓝牙设备发送数据
 * @param {Number} startCode 起始码
 * @param {Number} dataType 数据类型
 * @param {Array} sentData 发送给蓝牙的数据数组,例如:[0x12,0x01]
 */
function generateCommand(startCode, dataType, sentData = []) {
    let buffer = new ArrayBuffer(20);
    let dataView = new DataView(buffer);
    dataView.setUint8(0, startCode);
    dataView.setUint8(1, dataType);
    sentData.forEach((data, index) => {
        dataView.setUint8(2 + index, data);
    });
    return buffer;
}

补充说明

  • 确保生成的指令符合蓝牙设备的协议规范。

7. 解析蓝牙设备的响应数据包

接收到蓝牙设备的响应数据后,需要解析数据以获取实际信息。以下是解析响应数据的示例代码:

function handleResponse(responseData) {
    const parsedData = parseBlueResponse(responseData);
    console.log('解析后的响应数据:', parsedData);
}

function parseBlueResponse(responseData) {
    const dataList = responseData.match(/.{1,2}/g);
    const [resCode, resType, resResult] = dataList.splice(0, 3);
    return {
        resCode,
        resType,
        resResult,
        dataList
    };
}

补充说明

  • 确保解析逻辑与蓝牙设备的响应数据格式一致。

8. 结束使用:停止搜索、断开连接和关闭蓝牙模块

最后,当不再需要使用蓝牙功能时,应当停止搜索和断开连接,释放系统资源。

// 停止搜索蓝牙设备
uni.stopBluetoothDevicesDiscovery({
    success: (res) => {
        console.log("停止搜索成功", res);
    },
    fail: (error) => {
        console.log("停止搜索失败", error);
    }
});

// 断开与蓝牙设备的连接
uni.closeBLEConnection({
    deviceId: this.deviceId,
    success: (res) => {
        console.log("断开连接成功", res);
    },
    fail: (error) => {
        console.log("断开连接失败", error);
    }
});

// 关闭蓝牙模块
uni.closeBluetoothAdapter({
    success: (res) => {
        console.log("关闭蓝牙模块成功", res);
    },
    fail: (error) => {
        console.log("关闭蓝牙模块失败", error);
    }
});

补充说明

  • 确保在每一步都检查操作是否成功,并处理失败情况。
  • 停止搜索和断开连接应尽量在不再需要使用蓝牙功能时及时执行,以优化设备的电池和性能。

通过以上步骤,可以在uniapp中成功地初始化、搜索、连接和与蓝牙设备进行数据交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值