小程序连接蓝牙

小程序 蓝牙功能

1.授予蓝牙权限

javascript 复制代码
//1.蓝牙授权
const authBlue = (callback, initApp) => {
    app = initApp;
    //鉴定是否授权蓝牙
    wx.getSetting().then(res => {
        if (!res.authSetting['scope.bluetooth']) {
            //未授予蓝牙权限
            return wx.authorize({
                scope: 'scope.bluetooth',
            })
        } else {
            //已授予
            if (callback != null) {
                callback({
                    blueAuth: true
                }) 
                // init() //2.蓝牙初始化
            }

            return new Promise(() => {})
        }
    }).then(() => {
        if (callback != null) {
            callback({
                blueAuth: true
            }) //回调-app.js-蓝牙权限
            // init() //2.蓝牙初始化
        }
        return new Promise(() => {})
    }).catch(err => {
        if (callback != null)
            callback({
                blueAuth: false
            })
        console.err(err);
    })
}

2.蓝牙初始化

javascript 复制代码
//2.蓝牙初始化
const init = (onFound) => {
    console.log("2.蓝牙初始化");
    //打开蓝牙适配器
    wx.openBluetoothAdapter({
        mode: 'central'
    }).then(res => {
        app.globalData.isOpenBleAdapter = true //蓝牙适配器已打开
        wx.onBluetoothAdapterStateChange((res) => { //回调---蓝牙适配器状态改变
            if (!res.available) { //蓝牙适配器是否可用
                wx.showModal({
                    title: '温馨提示',
                    content: '蓝牙蓝牙适配器不可用,请重新启动',
                    showCancel: false
                })
            }
        })
        onFound(); //监听+寻找 新设备 -- 回调函数
    }).catch(() => {
        //失败
        wx.showToast({
            title: '请检查手机蓝牙是否打开',
            icon: 'none',
        })
    })
}

3.监听寻找新设备

javascript 复制代码
//3.监听寻找新设备
const onDeviceFound = (addDevicesList) => {
    console.log("3.监听寻找新设备");
    wx.onBluetoothDeviceFound((res) => {
        const devicesList = []
        for (const item of res.devices) {
            if (!item.connectable) continue; //无法连接 --> 跳过
        	//过滤设备,找出自己想连接的设备  filterDevices
            let device = Device.filterDevices(item)
        	//addDevicesList 是一个回调函数,将数据更新到 View
            if (device && addDevicesList != null) {
                // 判断是否已经存在相同id的对象
                var existingObjIndex = devicesList.findIndex(function (obj) {
                    return obj.deviceId === device.deviceId;
                });
                if (existingObjIndex !== -1) { // 存在相同id的对象
                    // 更新对应位置上的对象属性值
                    Object.assign(devicesList[existingObjIndex], device);
                } else { // 不存在相同id的对象
                    // 将新对象添加到数组末尾
                    devicesList.push(device);
                }
            }
        }
        //更新到设备列表
        addDevicesList(devicesList)
    })
}

4.搜索新设备

javascript 复制代码
//4.搜索新设备
const startDevicesDiscovery = (obj) => {
    wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: true, //允许上报同一台设备
        interval: 1000, //上报间隔时间
        success: (res) => {
            console.log("4.搜索新设备");
            // getBluetoothDevices()		// 获取蓝牙设备列表
        },
        fail: function (res) {
            wx.showToast({
                title: '搜索蓝牙外围设备失败,请重新初始化蓝牙!',
                icon: 'none',
            })
        }
    })
}

5.建立连接⭐⭐⭐⭐⭐⭐⭐

javascript 复制代码
/** 5.建立连接 
 * @param {*} deviceId 要连接的设备MAC
 * @param {*} func 连接后要执行的命令
 * 1.建立连接
 * 2.设置MTU    setBLEMTU
 * 3.获取蓝牙服务 UUID  getBLEDeviceServices
 * 4.获取蓝牙服务列表 UUIDS   getBLEDeviceCharacteristics
 * 5.判断UUIDS中哪个服务可用于indicate | notify,使用该UUID订阅特征变化 notifyBLECharacteristicValueChange
 * 6.监听特征值变化:onBLECharacteristicValueChange
 * 7.func({isConnect: true}) //连接成功
 */
const createConnect = (deviceId, func) => {
    let mtu = 209 //协商设置蓝牙低功耗的最大传输单元
    let serviceId = '0000FFE0-0000-1000-8000-00805F9B34FB';	//特定的UUID
    let characteristics;
    wx.createBLEConnection({
        deviceId
    }).then((res) => { //2.设置MTU
        if (res.errCode === 0 || res.errCode === -1) {
            console.log('1.连接成功');
            const systemInfo = wx.getSystemInfoSync();
            const platform = systemInfo.platform; //Android | IOS
            if (platform === 'android') {
                return wx.setBLEMTU({
                    deviceId,
                    mtu
                });
            } else if (platform === 'ios') {
                return {
                    mtu
                }
            } else {
                return {
                    mtu
                }
            }
        } else {
            console.log('连接失败');
            func({
                isConnect: false
            }) //连接失败
            return new Promise(() => {})
        }
    }, error => {
        console.log(error)
        func({ isConnect: false}) //连接失败
        return new Promise(() => {})
    }).then((res) => { //3.获取蓝牙服务
        console.log("2.MTU设置成功,协商MTU:", res.mtu, deviceId, serviceId);
        return wx.getBLEDeviceServices({deviceId});
    }, (res) => {
        console.log("2.MTU设置失败:", res);
        func({ isConnect: false}) //连接失败
        return new Promise(() => {})
    }).then((res) => {//4.获取蓝牙服务列表
        console.log("3.获取蓝牙服务成功", res);
        for (let i = 0; i < res.services.length; i++) {
            console.log("+++++++++发现服务:", res.services[i].uuid);
            if (res.services[i].uuid === '0000FFE0-0000-1000-8000-00805F9B34FB') {
                return wx.getBLEDeviceCharacteristics({
                    deviceId,
                    serviceId
                });
            }
        }
    },(err) => {
        console.error("3.获取蓝牙服务失败", err);
        func({ isConnect: false}) //连接失败
        return new Promise(() => {})
    }).then((res) => { //5.判断哪个服务可用于indicate | notify
        console.log("4.获取UUIDS成功", res);
        characteristics = res.characteristics

        for (let i = 0; i < characteristics.length; i++) {
            const item = characteristics[i];
            if (item.properties.notify || item.properties.indicate) {
                return wx.notifyBLECharacteristicValueChange({
                    deviceId: deviceId,
                    serviceId: serviceId,
                    characteristicId: item.uuid,
                    state: true
                });
            }
        }
    }, (res) => {
        console.log("4.获取UUIDS失败", res);
        func({ isConnect: false}) //连接失败
        return new Promise(() => {})
    }).then((res) => { //6.监听特征值变化
        console.log('5.订阅特征变化成功', res);
        for (let i = 0; i < characteristics.length; i++) {
            let item = characteristics[i];
            if (item.uuid.substr(0, 8) == '0000FFE1') {
                app.globalData.characteristicId = item.uuid
                break;
            }
        }
        func({ isConnect: true}) //连接成功
    }, (err) => {
        console.log("5.订阅特征变化失败", res);
        func({ isConnect: false}) //连接失败
        return new Promise(() => {})
    }).catch((err) => {
        func({ isConnect: false}) //连接失败
        console.error(err);
    });
}

6.监听蓝牙低功耗连接状态改变事件

javascript 复制代码
//6.监听蓝牙低功耗连接状态改变事件--主动连接或断开连接,设备丢失,连接异常断开
const onConnectionStateChange = (listenBleStatus) => {
    wx.onBLEConnectionStateChange(res => listenBleStatus(res))
}

8.监听特征值变化

javascript 复制代码
//8.监听特征值变化   --  onBleValueChange  回调函数
const onCharacteristicValueChange = (onBleValueChange) => {
    wx.onBLECharacteristicValueChange(res => onBleValueChange(res))
}

/**
 * 监听蓝牙设备传输的数据
 * @param {*} res deviceId、serviceId、characteristicId、【value	ArrayBuffer	特征最新的值】
 */
function onBleValueChange(res) {
    console.log("监听到数据", res);
    //处理数据
    .
    .
    .
}

9.发送数据

javascript 复制代码
/** 9.发送数据
 * @param {*} deviceId 设备ID
 * @param {*} command  命令
 */
const writeCharacteristicValue = (deviceId, command) => {
    return wx.writeBLECharacteristicValue({
        characteristicId: app.globalData.characteristicId,
        deviceId: deviceId,
        serviceId: app.globalData.serviceId,
        value: command,
    })
}
相关推荐
前端(从入门到入土)2 小时前
微信小程序自定义顶部导航栏(适配各种机型)
微信小程序·小程序
放逐者-保持本心,方可放逐8 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
计算机-秋大田8 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
尚学教辅学习资料11 小时前
基于微信小程序的电商平台+LW示例参考
java·微信小程序·小程序·毕业设计·springboot·电商平台
尘浮生11 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
小泽呀x14 小时前
微信小程序中使用离线版阿里云矢量图标
微信小程序·小程序
zhouang77037720 小时前
uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
微信小程序·小程序·uni-app
番茄Salad1 天前
使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面
微信小程序·小程序
小马哥编程1 天前
【微信小程序】用户房屋管理
微信小程序·小程序
尘浮生1 天前
Java项目实战II基于微信小程序的原创音乐小程序(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven