Uniapp 低功耗蓝牙

1 篇文章 0 订阅
1 篇文章 0 订阅

建议:写之前先在uniapp官网中看一下蓝牙的流程,帮助你更好的理解低功耗蓝牙

第一步你要想用蓝牙连接你就得先打开蓝牙吧
 

 openPhoneBluetooth() {
        var main, BluetoothAdapter, BAdapter;
        switch (uni.getSystemInfoSync().platform) {
          case "android":
            // Android平台: plus.android.*  
            main = plus.android.runtimeMainActivity();
            BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
            BAdapter = BluetoothAdapter.getDefaultAdapter()
            if (!BAdapter.isEnabled()) {

              this.IsBluetoothOpen = BAdapter.enable()

            } else {
              this.IsBluetoothOpen = BAdapter.enable()
            };

            console.log(this.IsBluetoothOpen)
            uni.setStorageSync("IsBluetoothOpen", this.IsBluetoothOpen)
            // uni.setStorageSync("IsBluetoothOpen", this.IsBluetoothOpen)
            // console.log(this.IsBluetoothOpen);
            if (this.IsBluetoothOpen) {
              // console.log(this.IsBluetoothOpen);
              this.initBlue()
            }
            break;
          case "ios":
            // iOS平台: plus.ios.*  
            console.log("运行在ios")
            break;
          default:
            // 其它平台 
            console.log("运行在其他平台")
            break;
        }
      },

我建议你把蓝牙的状态保存下来

如果蓝牙打开就调用initBlue方法(初始化蓝牙)

第二步

uni.startBluetoothDevicesDiscovery({
					
					success: res => {
						
					},
					fail: err => {
						
					}
				})

第三步

uni.onBluetoothDeviceFound(res => {
        //不重复,有名称,就添加到devicesList中
        if (
          res.devices[0].name &&
          !devicesList.some(item => {
            return item.deviceId === res.devices[0].deviceId;
          })
        ) {
          devicesList.push(res.devices[0]);
        }
      });

前三步你就可以把附近的蓝牙都找到了

第四步  手动连接蓝牙

createBLEConnection(deviceId) {
		return new Promise((resolve, reject) => {
			uni.createBLEConnection({
				deviceId,
				success: async res => {
					
				},
				fail: err => {
					
				}
			})
		});
	}

接着你需要获取uuid

getBLEDeviceServices(deviceId, serviceId) {
    let self = this;
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        uni.getBLEDeviceServices({
          deviceId,
          success: async res => {
            // 未传则直接返回所有服务
            if (!serviceId) {
              return resolve(res.services)
            }
            let sure = false;
            for (let i = 0; i < res.services.length; i++) {
              if (res.services[i].uuid.toUpperCase().indexOf(serviceId) !=
                -1) {
                sure = true
                break;
              }
            }
            sure ? resolve(true) : reject({
              errMsg: '设备功能不匹配'
            })
          },
          fail: err => {
            reject(err);
          },
        })
      }, 1000)
    });
  }

连接成功后你要启动notify功能

notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId) {
		return new Promise((resolve, reject) => {
			uni.notifyBLECharacteristicValueChange({
				state: true, // 启用 notify 功能
				deviceId,
				serviceId,
				characteristicId,
				success: async res => {
					
				},
				fail(err) {
					
				}
			});
		})
	}
成功后你要接收设备传来的消息
onBLECharacteristicValueChange() {
        let receivedDataArray = []; // 用于存储接收到的数据的数组

        uni.onBLECharacteristicValueChange((res) => {

          let resHex = this.ab2hex(res.value);
          let result = this.hexCharCodeToStr(resHex);
          console.log(result);
      项目要求  我这边转十六进制了
         
        });
      },


 ab2hex(buffer) {
        const hexArr = Array.prototype.map.call(
          new Uint8Array(buffer),
          function(bit) {
            return ('00' + bit.toString(16)).slice(-2)
          }
        )
       
        return hexArr.join('');
      },


      hexCharCodeToStr(hexCharCodeStr) {
        var trimedStr = hexCharCodeStr.trim();
        var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
        var len = rawStr.length;
        if (len % 2 !== 0) {
          console.log("存在非法字符!");
          return "";
        }
        var curCharCode;
        var resultStr = [];
        for (var i = 0; i < len; i = i + 2) {
          curCharCode = parseInt(rawStr.substr(i, 2), 16);
          resultStr.push(String.fromCharCode(curCharCode));
        }
        return resultStr.join("");
      },

当连接成功后最好关闭搜索,要不然太耗性能了

stopBluetoothDevicesDiscovery() {
		return new Promise((resolve, reject) => {
			uni.stopBluetoothDevicesDiscovery({
				success: res => {
					
				},
				fail: err => {
					
				}
			})
		});
	}

然后你如何给设备发指令呢

 // 写入数据,16进制的
      writeBLECharacteristicValue(_message) {
        console.log("写入的数据:", _message);
        // 向蓝牙设备发送一个0x00的16进制数据
        let msg = _message;
        const buffer = new ArrayBuffer(msg.length);
        const dataView = new DataView(buffer);
        console.log(msg);
        // dataView.setUint8(0, 0)

        for (var i = 0; i < msg.length; i++) {
          dataView.setUint8(i, msg.charAt(i).charCodeAt())
        }
        uni.writeBLECharacteristicValue({
          deviceId
          serviceId
          characteristicId
          value: buffer,
          success(res) {
            
            console.log('writeBLECharacteristicValue success', res.errMsg);
          },
          fail(res) {
           
            console.log("写入失败", res)
          }
        })
      },

然后设备给你会回消息在 onBLECharacteristicValueChange方法中可以看到

低功耗蓝牙就是这样,不明白的可以私信我
请各位观众老爷,看完不要白嫖     收藏!!!!点赞!!!!关注!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值