Browse Source

ffeature:修改蓝牙的连接代码

zeng.chen 8 months atrás
parent
commit
dbea7a420a
5 changed files with 124 additions and 85 deletions
  1. 1 0
      app.js
  2. 2 2
      devices/ble_manager.js
  3. 62 48
      devices/bt_helper.js
  4. 56 32
      pages/connectBle/connectBle.js
  5. 3 3
      pages/connectBle/connectBle.wxss

+ 1 - 0
app.js

@@ -25,6 +25,7 @@ App({
     isIOS: false,
     isAndroid: false,
     isHuaWei: false,
+    btHelper: null,
     // 当前设备
     device: {},
     // 设备列表,跟app同步字段

+ 2 - 2
devices/ble_manager.js

@@ -181,7 +181,7 @@ class bleManager {
     }
 
     // 发送数据到指定设备
-    sendData(data) {
+    async sendData(data) {
         return new Promise((resolve, reject) => {
             const buffer = new ArrayBuffer(data.length);
             const view = new Uint8Array(buffer);
@@ -306,7 +306,7 @@ class bleManager {
             let newDevices = this.fiterDevice(res)
             // this.devices.push(...devices);
             if (newDevices.length > 0) {
-                // console.log('发现设备:', newDevices[0].deviceId, newDevices[0].uuid);
+                console.log('发现设备1:', res);
             }
             if (callback) {
                 callback(newDevices);

+ 62 - 48
devices/bt_helper.js

@@ -11,6 +11,8 @@ const ble = require('./ble_manager');
 // const EventManager = require('./EventManager');
 // const CmdBase = require('./../devices/bluetooth/bt_cmd');
 const bleManager = require('./ble_manager');
+const QueueManager = require('./QueueManager');
+
 // const EnumConnectStatus = require('./EnumConnectStatus');
 // const EnumOpen = require('./EnumOpen');
 // const EnumSupplier = require('./EnumSupplier');
@@ -22,11 +24,15 @@ const bleManager = require('./ble_manager');
 
 
 class BtHelper {
-    // static get instance() {
-    //     return this._instance;
-    // }
 
-    // static _instance = new BtHelper();
+    static getInstance() {
+        // if (!BtHelper._instance) {
+        //     BtHelper._instance = new BtHelper();
+        // }
+        return BtHelper._instance;
+    }
+
+    static _instance = new BtHelper();
 
     static _isConnecting = false;
     static isDisConnectByOTA = false;
@@ -46,6 +52,10 @@ class BtHelper {
         //         this._helper.send({ cmd: task });
         //     }
         // });
+        // this.queueManager = new QueueManager();
+        // this.queueManager.listenTask((task) => {
+        //     bleManager.sendData(task);
+        // });
     }
 
 
@@ -72,12 +82,14 @@ class BtHelper {
     }
 
     async stopSearch() {
+        clearTimeout(this.timer);
+        this.timer = null;
         await bleManager.stopScan();
     }
 
     async _connectSuccess() {
-        btHelper.checkDevice()
-        btHelper.getDeviceInfo()
+        this.checkDevice()
+        this.getDeviceInfo()
     }
 
     async connect(data, onChanged) {
@@ -161,32 +173,34 @@ class BtHelper {
         // await this._helper.dispose();
     }
 
-    send(cmd, type) {
-        console.log('开始发送数据:', cmd)
+    async send(cmd, type) {
         if (cmd) {
+            // this.queueManager.addTask(cmd)
             bleManager.sendData(cmd)
         }
-
         // QueueManager.instance.addTask({ task: cmd });
     }
+
     // onLoad: function () {
     //     bleManager = new bleManager();
     //     this.initBluetooth();
     //   }
 
     async initBluetooth(callback) {
-        let adpter = await bleManager.initBluetoothAdapter((res) => { });
-        // console.log(res)
-        if (!adpter) {
-            wx.showToast({
-                title: '请开启蓝牙功能',
-                icon: 'none'
-            })
-            if (callback) {
-                callback(false, false)
+        let adpter = await bleManager.initBluetoothAdapter((res) => {
+            if (!res) {
+                wx.showToast({
+                    title: '请开启蓝牙功能',
+                    icon: 'none'
+                })
+                if (callback) {
+                    callback(false, false)
+                }
+                return
             }
-            return
-        }
+        });
+        // console.log(res)
+
 
         bleManager.checkBluetoothPermission(function (per) {
             if (!per) {
@@ -224,13 +238,13 @@ class BtHelper {
 
     async checkDevice() {
         // console.log("校验设备:", BtCmd); // 输出: EarPhone Info
-        await this.send(BtCmd.checkDevice());
+        this.send(BtCmd.checkDevice());
         //2.0有发这个,不知道是啥
-        await this.send([0x54, 0x44, 0x44, 0x48, 0x01, 0x09, 0x26, 0x01, 0x01]);
+        this.send([0x54, 0x44, 0x44, 0x48, 0x01, 0x09, 0x26, 0x01, 0x01]);
     }
 
     async getVersion() {
-        await this.send(BtCmd.queryVersion());
+        this.send(BtCmd.queryVersion());
     }
 
     _time() {
@@ -256,48 +270,48 @@ class BtHelper {
     }
 
     async getAlert() {
-        await this.send(BtCmd.queryAlarm());
+        this.send(BtCmd.queryAlarm());
     }
 
     async getSleep() {
-        await this.send(BtCmd.querySleep());
+        this.send(BtCmd.querySleep());
     }
 
     async setAlert(open, weekCycle, hour, minutes, channel = 1) {
-        await this.send(BtCmd.setAlarm({ switchStatus: open, weekCycle, hour, minutes }));
+        this.send(BtCmd.setAlarm({ switchStatus: open, weekCycle, hour, minutes }));
     }
 
     async setAutoPlay(open) {
-        await this.send(BtCmd.setAutoPlay({ switchStatus: open }));
+        this.send(BtCmd.setAutoPlay({ switchStatus: open }));
     }
 
     async getAutoPlay() {
-        await this.send(BtCmd.getAutoPlay);
+        this.send(BtCmd.getAutoPlay);
     }
 
     async setLowKwhWarningTone(notify) {
-        await this.send(BtCmd.setLowKwhWarningTone({ notify }));
+        this.send(BtCmd.setLowKwhWarningTone({ notify }));
     }
 
     async setPauseSleep(time) {
-        await this.send(BtCmd.setSleepAfterPlayPause({ time }));
+        this.send(BtCmd.setSleepAfterPlayPause({ time }));
     }
 
     async getPauseSleep() {
-        await this.send(BtCmd.querySleepAfterPlayPause());
+        this.send(BtCmd.querySleepAfterPlayPause());
     }
 
     async setRGB(r, g, b) {
-        await this.send(BtCmd.setRGB({ r, g, b }));
+        this.send(BtCmd.setRGB({ r, g, b }));
     }
 
     async setSleep(open, hour, minutes) {
-        await this.send(BtCmd.setSleep({ switchStatus: open, hour, minutes }));
+        this.send(BtCmd.setSleep({ switchStatus: open, hour, minutes }));
     }
 
     async setTime() {
         console.log("setTime========111")
-        // await this.send(BtCmd.setTime());
+        // this.send(BtCmd.setTime());
     }
 
     async setVolume(volume) {
@@ -308,11 +322,11 @@ class BtHelper {
 
         console.log(`phoneMax=${phoneMax}, deviceMax=${CmdBase.volumeMax}, setVolume=${volume}, result=${result}`);
 
-        await this.send(BtCmd.setVolume({ volume: result }));
+        this.send(BtCmd.setVolume({ volume: result }));
     }
 
     async getVolume() {
-        await this.send(BtCmd.queryVolume());
+        this.send(BtCmd.queryVolume());
     }
 
     stop() {
@@ -366,44 +380,44 @@ class BtHelper {
     }
 
     async getLowDelayMode() {
-        await this.send(BtCmd.queryLowDelayMode());
+        this.send(BtCmd.queryLowDelayMode());
     }
 
     async setLowDelayMode(open, mode) {
-        await this.send(BtCmd.setLowDelayMode({ open, mode }));
+        this.send(BtCmd.setLowDelayMode({ open, mode }));
     }
 
     async setLowPowerMode(isOpen) {
-        await this.send(BtCmd.setLowPowerMode({ isOpen: isOpen ? EnumOpen.open : EnumOpen.close }));
+        this.send(BtCmd.setLowPowerMode({ isOpen: isOpen ? EnumOpen.open : EnumOpen.close }));
     }
 
     async queryLowPower() {
-        await this.send(BtCmd.queryLowPower());
+        this.send(BtCmd.queryLowPower());
     }
 
     async setCtrlStatus(singleClick, doubleClick, longClick) {
-        await this.send(BtCmd.setCtrlStatus({ singleClick, doubleClick, longClick }));
+        this.send(BtCmd.setCtrlStatus({ singleClick, doubleClick, longClick }));
     }
 
     async getEQ() {
-        await this.send(BtCmd.queryEQ());
+        this.send(BtCmd.queryEQ());
     }
 
     async setEQ(list) {
-        await this.send(BtCmd.setEQ({ list }));
+        this.send(BtCmd.setEQ({ list }));
     }
 
     async queryLowKwhWarningTone() {
-        await this.send(BtCmd.queryLowKwhWarningTone());
+        this.send(BtCmd.queryLowKwhWarningTone());
     }
 
     async changeChannelCallBack() {
-        await this.send(Uint8Array.from([0x54, 0x44, 0x44, 0x48, 0x01, 0x0a, 0x29, 0x02, 0x00, 0x01]));
-        await this.send(Uint8Array.from([0x54, 0x44, 0x44, 0x48, 0x01, 0x09, 0x39, 0x01, 0x00]));
+        this.send(Uint8Array.from([0x54, 0x44, 0x44, 0x48, 0x01, 0x0a, 0x29, 0x02, 0x00, 0x01]));
+        this.send(Uint8Array.from([0x54, 0x44, 0x44, 0x48, 0x01, 0x09, 0x39, 0x01, 0x00]));
     }
 }
 
 // 导出 BtHelper 类
-const btHelper = new BtHelper();
+// const btHelper = new BtHelper();
 
-module.exports = btHelper;
+module.exports = { BtHelper }

+ 56 - 32
pages/connectBle/connectBle.js

@@ -1,5 +1,5 @@
 // pages/connectBle/connectBle.js
-const btHelper = require('../../devices/bt_helper');
+const { BtHelper } = require('../../devices/bt_helper');
 const toastUtil = require('../../utils/toast_util');
 import routeUtil from '../../utils/route_util'
 import route_constant from '../../utils/route_constant.js'
@@ -22,7 +22,8 @@ Page({
     connectStatus: 0,
     searchTips: "正在搜索设备,请保持开机状态…",
     subTips: "确认手机蓝牙已打开",
-    buttonTips: "正在搜索设备"
+    buttonTips: "正在搜索设备",
+    btHelper: null
 
   },
   setStatus(bleType) {
@@ -54,7 +55,7 @@ Page({
         break;
       case 3:
         // 连接成功
-        searchTips = "搜索到" + name
+        searchTips = "连接到" + name
         subTips = ""
         buttonTips = "连接成功"
         break;
@@ -88,34 +89,47 @@ Page({
         _this.startSearch()
         break;
       case 2:
-        //  搜索到
-        btHelper.connect(element, function (data) {
-          // console.log("连接成功", data)
-          toastUtil.show("开始连接设备")
-
-          _this.setStatus(data ? 3 : 4)
-          // 蓝牙模式
-          _this.data.connectDevice.connectType = 1
-          getApp().globalData.device = _this.data.connectDevice
-          setTimeout(() => {
-            wx.reLaunch({
-              url: '/pages/index/index', // 替换为首页的路径
-            });
-          }, 500);
-        })
+        _this.connectToDvice()
         break;
       case 3:
         // 连接成功
         break;
     }
-  }, getConnectedDevices: async function () {
+  },
+  connectToDvice() {
+    toastUtil.show("开始连接设备")
+
+    let _this = this
+    //  搜索到
+    this.data.btHelper.connect(_this.data.connectDevice, function (data) {
+      // console.log("连接成功", data)
+
+      _this.setStatus(data ? 3 : 4)
+      if (data) {
+        // 蓝牙模式
+        _this.data.connectDevice.connectType = 1
+        getApp().globalData.device = _this.data.connectDevice
+        setTimeout(() => {
+          wx.reLaunch({
+            url: '/pages/index/index', // 替换为首页的路径
+          });
+        }, 500);
+      }
+
+    })
+  },
+  getConnectedDevices: async function () {
     let _this = this
-    const connectedDevices = await btHelper.getConnectedDevices()
+    const connectedDevices = await this.data.btHelper.getConnectedDevices()
     console.log("全部设备", connectedDevices)
     if (connectedDevices.length > 0) {
       connectedDevices.forEach(element => {
         console.log('已连接的蓝牙设备:', element);
-        _this.setStatus(3)
+        if (element.connectable == true) {
+          _this.data.connectDevice.mac = element.mac
+          _this.data.connectDevice.deviceId = element.deviceId
+          _this.setStatus(2)
+        }
       });
     } else {
     }
@@ -123,7 +137,7 @@ Page({
   }, async startSearch() {
     this.setStatus(0)
     let _this = this
-    btHelper.search(async function () {
+    this.data.btHelper.search(async function () {
       const connectedDevices = await _this.getConnectedDevices()
       if (connectedDevices.length == 0) {
         _this.setStatus(1)
@@ -134,18 +148,25 @@ Page({
 
   didFindDevice() {
     let _this = this
-    btHelper.findDevices(function (devices) {
+    this.data.btHelper.findDevices(function (devices) {
       devices.forEach(element => {
-        console.log('发现设备:', element.deviceId, element.uuid, element.mac);
 
         let deviceId = element.deviceId ?? ""
-        // todo 
+        // todo 暂定这样
         if (deviceId.includes("D8:24:07:89:31") ||
+          // 2axk
           element.deviceId.includes("F5:A5:43:70:C8:F1") ||
-          element.deviceId.includes("D1:4D:DA:76:42:50")
+          // 黑色2x
+          element.deviceId.includes("F6:61:D8:24:E5:98")
         ) {
-          btHelper.stopSearch()
-          _this.setStatus(2)
+          console.log('发现设备2:', element.deviceId, element.uuid, element.mac);
+          if (element.connectable == true) {
+            _this.data.connectDevice.mac = element.mac
+            _this.data.connectDevice.deviceId = element.deviceId
+            _this.data.btHelper.stopSearch()
+            _this.setStatus(2)
+          }
+
         }
       });
     })
@@ -156,6 +177,10 @@ Page({
    */
   onLoad(options) {
     let _this = this
+    const btHelper = BtHelper.getInstance();
+    this.data.btHelper = btHelper;
+    // getApp().globalData.btHelper = btHelper.getInstance();
+
     btHelper.initBluetooth(function (adapterState, hasPermission) {
       console.log("蓝牙状态", adapterState, hasPermission)
       if (adapterState && hasPermission) {
@@ -169,10 +194,9 @@ Page({
     _this.didFindDevice()
 
     let json = JSON.parse(options.param)
-    console.log(json)
-    let device = json
+    console.log("要连接设备:", json)
     this.setData({
-      connectDevice: device
+      connectDevice: json
     })
   },
 
@@ -202,7 +226,7 @@ Page({
    */
   onUnload() {
     // todo 要关闭吗
-    btHelper.closeBle()
+    this.data.btHelper.closeBle()
   },
 
   /**

+ 3 - 3
pages/connectBle/connectBle.wxss

@@ -1,14 +1,14 @@
 /* pages/connectBle/connectBle.wxss */
 .container {
 	position: relative;
-	height: 100vh - 60rpx;
+	height: 100vh;
 }
 
 .device_pic {
 	margin-top: 128rpx;
 	margin-left: 140rpx;
-	margin-right: 140rpx;
-	/* width: 470rpx; */
+	/* margin-right: 140rpx; */
+	width: 470rpx;
 	height: 432rpx;
 	background: #F2F5F7;
 	border-radius: 24rpx;