uniapp开发app对接蓝牙

本文详细描述了在使用Uniapp开发环境下,如何通过蓝牙适配器、搜索设备、获取服务以及操作特征值等步骤来实现对Modbus协议蓝牙设备的连接和数据交互的过程。

依稀记得去年第一次对接蓝牙设备的啥时候的无助,其实这些流程文档上写的挺清楚的,别人的博客写的也很清晰,但我依然觉得头大。

因为那个项目对接的设备用的是modbus协议,真的是让人好一番琢磨,包括蓝牙设备服务、特征值也搞错过好几次。

苍天不负有心人呀~~

1、初始化蓝牙适配器

// 打开蓝牙适配器
initBlue() {
    var that = this
    //打开蓝牙适配器接口
    uni.openBluetoothAdapter({
        success(res) {
            console.log("打开蓝牙适配器接口成功",res)
            that.findBlue();
        },
        fail(err) { 
            console.log("打开蓝牙适配器接口失败",err)
        }
    })
}

2、开始搜索周围蓝牙设备

// 搜索周边设备
findBlue() {
    var that = this
    uni.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
        interval: 0,
        success: function(res) {
            console.log("开始搜索",err) 
            uni.onBluetoothDeviceFound(devices => {
                // 监听到新设备后重新获取设备列表
                that.getBlue()
            });
        },
        fail: function() {
            console.log("开始搜索失败",err)   
        }
    })
}

3、获取蓝牙初始化后所有的设备

// 获取搜索到的设备信息
getBlue() {
    var that = this
    uni.getBluetoothDevices({
        success(res) {
        console.log("获取设备成功",err)
            that.BluetoothList = res.devices
        },
        fail(err) {
            console.log("获取设备失败",err)       
        }
    })
}

4、连接选中的设备

connetBlue() {
    var that = this;
    let deviceId = that.deviceInfo.deviceId; // 选中后赋值
    uni.createBLEConnection({
        deviceId: that.deviceInfo.deviceId, //设备id
        success(res) {
            // console.log("连接蓝牙成功", res)
            // 连接蓝牙成功之后关闭蓝牙搜索 搜索功能费性能
            uni.stopBluetoothDevicesDiscovery({
                success: function(res) {
                // console.log('关闭蓝牙搜索成功');
                }
            })                                              that.getServiceId(that.deviceInfo) //获取蓝牙设备服务
        },
        fail() {
            // console.log("连接蓝牙失败")
        }
    })
}

5、获取蓝牙设备服务

getServiceId(item) {
    let deviceId = item.deviceId
    var that = this
    // 直接获取服务可能会获取不到 加一个延时
    setTimeout(() => {
        uni.getBLEDeviceServices({
            deviceId: item.deviceId,
            success(res) {
                that.uuid.deviceId = deviceId
                that.uuid.serviceId = res.services[2].uuid //因设备而议:该特征值支持write和notfy服务
                that.getCharacteId(that.uuid) 
            },
            fail() {
                // console.log('获取蓝牙特征值失败')
            }
        })
    }, 1000)
}

6、获取蓝牙特征值

// 获取蓝牙特征值
getCharacteId(item) {
    var that = this
    uni.getBLEDeviceCharacteristics({
        deviceId: item.deviceId,
        serviceId: item.serviceId,
        success(res) {
            // console.log('获取蓝牙特征值成功', res)
            for (var i = 0; i < res.characteristics.length; i++) {
                var model = res.characteristics[i]
                if (model.properties.write) {
                    that.uuid.writeId = model.uuid;
                }
                if (model.properties.notify) {
                    that.uuid.notifyId = model.uuid
                }
            }
            that.startNotice(that.uuid) // 启用 notify 功能
            setTimeout(() => {
                that.sendMy('0103211D00011E30') //写数据
            }, 1000)
        },
        fail() {
            // console.log('获取蓝牙特征值失败', res)
        }
    })
}

7、启用 notify 功能

// 启用 notify 功能
startNotice(e) {
    let that = this
    uni.notifyBLECharacteristicValueChange({
        state: true, // 启用 notify 功能
        deviceId: e.deviceId,
        serviceId: e.serviceId,
        characteristicId: e.notifyId,
        success(res){
            console.log('启用 notify 功能', res)
            //监听设备发送数据
            uni.onBLECharacteristicValueChange((sjRes) => {
    that.getdata = that.ab2hex(sjRes.value)
    console.log('监听设备发送数据', that.getdata)
})
        },
        fail(res) {
            // console.log('启用 notify 功能失败', res)
        }
    })
}

8、写入数据

// 写入数据
sendMy(str) {
    let that = this
    //转换数据格式
    let buffer = that.string2buffer(str);
    uni.writeBLECharacteristicValue({
        deviceId: that.uuid.deviceId, // 蓝牙设备 deviceId
        serviceId:that.uuid.serviceId, // 蓝牙服务uuid
        characteristicId:that.uuid.writeId, // 蓝牙特征值writeId
        value: buffer, // 这里的value是ArrayBuffer类型
        writeType: 'write',
        success(res) {
            console.log('指令下发成功', res)
        },
        fail(err) {
            // console.log('指令发送失败', err)
        }
    })
}

9、断开连接

// 断开连接
cancelConcent(e) {
    let that = this
    if (that.device.name != '--') {
        uni.closeBLEConnection({
            deviceId: that.device.deviceId,
            success(res) {
                console.log(' 断开连接成功', res)
            },
            fail(err) {
                console.log(' 断开连接失败', err)
            },
        })
    }
}

附:app请求打开蓝牙

openBlue() {
    const BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter');
    const blueadapter = BluetoothAdapter.getDefaultAdapter(); //拿到默认蓝牙适配器方法
    if (blueadapter) {
        // 判断蓝牙是否开启
        if (blueadapter.isEnabled()) {
        // 已开启
    } else {
        // 未开启弹出提示框
        uni.showModal({
            title: '提示',
            content: '蓝牙尚未打开,是否打开蓝牙',
            showCancel: true,
            cancelText: '取消',
            confirmText: '确定',
            success(res) {
                // 点击确定后通过系统打开蓝牙
                if (res.confirm) {
                    const blueadapter = BluetoothAdapter.getDefaultAdapter();
                    if (blueadapter != null) {
                    return blueadapter.enable();
                    }
                } 
            }
        })
    }
}

码云:大鱼海棠/blueTooth-uniapp

有问题的话,大家可以探讨一下,我知道的话都会解答的

<think>嗯,用户想了解如何使用UniApp开发鸿蒙系统应用,特别是教程和兼容性问题。首先,我需要整理UniApp支持鸿蒙的相关信息。记得之前看到的引用中提到,UniApp开发鸿蒙主要支持Vue3,不支持Vue2,而且plus API也不能用。这点很重要,用户需要注意代码的兼容性。 然后,开发环境的搭建步骤可能需要详细说明。比如需要安装HUAWEI DevEco Studio,配置HarmonyOS SDK,还有UniApp的HBuilderX版本是否支持。用户可能对具体步骤不太清楚,所以要分点列出,确保他们能一步步操作。 兼容性方面,除了Vue版本的问题,还有原生渲染的问题。引用里提到nvue在鸿蒙上不是原生渲染,而是类似Web,可能会影响性能或样式。需要提醒用户注意样式适配,可能需要调整CSS。另外,API替代方案,比如用鸿蒙的API替代uni的plus API,这部分需要举例说明,比如网络请求怎么做。 教程资源方面,用户可能需要官方文档和社区支持的信息。引用中提到了Uni-app和HarmonyOS NEXT的活跃社区,可以推荐用户加入交流群,查阅官方指南。另外,示例项目和实践步骤也很重要,比如如何创建项目,修改manifest.json,以及调试和发布的流程。 可能用户还会有其他疑问,比如性能优化、特定功能如何实现,或者与其他框架的对比。所以在相关问题部分,可以预设这些问题,帮助用户进一步探索。需要确保回答结构清晰,分步骤说明,同时引用提供的资料来支持每个要点,比如兼容性说明和社区支持的部分。最后检查是否符合系统级指令,比如数学公式的格式,但这里可能用不上。确保使用中文,没有markdown,语言口语化,自然流畅。</think>### 使用 UniApp 开发鸿蒙系统应用指南 #### 一、开发环境准备 1. **基础工具安装** - 安装 HUAWEI DevEco Studio 4.0 及以上版本(鸿蒙应用开发官方IDE)[^2] - 配置 HarmonyOS SDK 和模拟器 - 使用 HBuilderX 3.9+ 版本(支持鸿蒙应用编译) 2. **框架依赖** - 仅支持 Vue3 语法,需将原有 Vue2 项目升级至 Vue3[^2] - 不支持 `uni-app` 的 `plus` API,需使用鸿蒙原生 API 替代(如网络请求、设备信息获取) #### 二、兼容性注意事项 1. **渲染模式差异** - `nvue` 页面在鸿蒙端**非原生渲染**,采用类似 Web 的渲染方式,需注意默认样式的兼容性调整[^2] - 避免使用 CSS 高级特性(如 `position: sticky`),推荐使用 Flex 布局 2. **API 适配方案** ```javascript // 替代 uni.request 的鸿蒙网络请求示例 import http from '@ohos.net.http'; const httpRequest = http.createHttp(); httpRequest.request("https://api.example.com", (err, data) => {}); ``` 3. **功能限制** - 暂不支持 WebView 组件 - 蓝牙、NFC 等硬件功能需通过鸿蒙原生能力扩展 #### 三、开发流程实践 1. **项目配置** 修改 `manifest.json` 添加鸿蒙支持: ```json "app-plus": { "harmony": { "packageName": "com.example.yourapp" } } ``` 2. **调试与发布** - 通过 DevEco Studio 连接鸿蒙真机调试 - 使用 `npm run build:harmony` 生成 .hap 应用包 - 提交至华为应用市场需通过方舟编译器二次编译 #### 四、教程资源推荐 1. 官方文档 - [HarmonyOS应用开发文档](https://developer.harmonyos.com/cn/docs/documentation/) - [UniApp鸿蒙适配指南](https://ask.dcloud.net.cn/article/40809) 2. 社区支持 - 加入 `uni-app 鸿蒙化技术交流群` 获取实时支持[^2] - 参考华为开发者联盟案例库
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值