uni-app连接Ble蓝牙设备流程

3,603 阅读3分钟

在一个平凡日子里,敲着平凡的代码,突然被老板叫去做了件不平凡的事情:"你把这个蓝牙灯控做一下吧"。于是开始了下边uniapp 蓝牙连接的探索历程。遇到问题放在最后了,希望能帮助到大家。

漫漫探索路

  1. 蓝牙初始化
    在进入页面的时候需要先将蓝牙初始化,目的就是看看你的手机有没有打开蓝牙,蓝牙能不能用. ** 在对蓝牙进行操作的时候必须要做的操作, 后续方法可以放在初始化成功的回调里边 **
uni.openBluetoothAdapter({
  success(res) {
    console.log(res)
  },
  fail(error) {
    console.log(error)
  }
})

2. 初始化完成之后可以进行连接蓝牙(如果有设备的dev_id的话),一般是调用蓝牙的发现设备的方法。

    uni.startBluetoothDevicesDiscovery({
        success(res){
            console.log(res)
        },
        fail(error) {
           conosle.log(error)
        }
    })`

tip: 如果页面有刷新的操作的话,可以在刷新的时候调用一下这个方法(前提是你蓝牙设备已经初始化完成) 刷新完成之后调用停止搜索的方法

//uni页面刷新的方法
onPullDownRefresh() {
    uni.startBluetoothDevicesDiscovery({
    success(res){
        console.log(res)
    },
    fail(error) {
       conosle.log(error)
    }
    })`
}
//停止搜索,刷新完成之后调用或者beforeDestroy生命周期里边调用
uni.stopBluetoothDevicesDiscovery()

3.在开启设备搜索之前要调用下设备监听的方法,当发现到设备之后,会通过回调参数的形式传给你。具体参数和官网对照下。

uni.onBluetoothDeviceFound((devices) => {
    const device = devices[0]
    //有时候搜索到设备没有名称可以过滤一下
    if(!device.name) return
    //如果列表中的数据不再添加
    const isHave = this.list.filter(dev => dev.dev_id == device.dev_id)
    if(isHave.length > 0) return; 
    //搜索到设备之后将设备加到页面列表中
    this.list.push(devices[0])
})

4.设备连接

 uni.createBLEConnection({
     dev_id: (在列表中保存的设备id),
     success: () {
        console.log("连接成功")
        //连接成功之后,将连接成功的设备保存起来,方便对已经连接的设备进行写码操作。
     },
     fail: () {
        console.log('连接失败,去除loading效果')
     }
 })

5.监听蓝牙设备状态改变事件

蓝牙连接成功之后可以执行下这个方法,用于监听蓝牙设备的状态。方便在断开连接之后对蓝牙设备重连接或提示操作。
uni.onBLEConnectionStateChange(({deviceId, connected}) => {
    if(connected) {
        console.log(‘连接成功’)
    } else {
        console.log(‘断开连接’)
    }
})

6.写码操作

uni.writeBLECharacteristicValu({
    deviceId: (设备id),
    serviceId: (设备服务id,下一项会说到),
    characteristicId: (设备特征值),
    value: (写入的二进制数据)//只能是二进制数据;,
    success() {
        console.log('数据传递成功')
    },
    fail() {
        console.log(‘数据传递失败’)
    }
})

二进制方法
	string2Buffer(msg) {
			const buffer = new ArrayBuffer(msg.length)
			const dataView = new DataView(buffer)
			// dataView.setUint8(0, 0)
			for (var i = 0; i < msg.length; i++) {
				dataView.setUint8(i, msg.charAt(i).charCodeAt())
			}
			return buffer
	}

7.获取设备服务id和获取设备特征值都可以在搜索到设备之后。这样可以将特征值和服务id一起放到列表数据中方便调用。

这边就使用连环嵌套的方式了,大家可以封成awaitasync 的形式。
在获取服务id之后,里边会有多个服务id,拿不同的服务id会得到不同特征值。大家可以根据项目要求进行取用。
uni.getBLEDeviceServices({
   deviceId: (搜索到的设备id),
   success: (serviess) => {
          获取服务id成功之后,进行特征值的获取
         uni.getBLEDeviceCharacteristics({
             deviceId: (搜索到的设备id),
             serviceId: serviess[0].uuid,
             sucess(character) {
                 //获取成功之后将设备信息,特征值,服务id混成一个对象放到列表数组中
             }
         })
   }
})

遇到的问题: 设备搜索不到的问题 某些设备被连接过之后,其他手机都不会搜到。 当你连接上之后需要调用uni.closeBLEConnection({ dev_id:(需要断开的设备id) }) 如果你保存了已经连接的设备列表,当你的蓝牙初始化之后,可以直接连接你添加的这些设备。不需要再进行搜索。