浏览代码

feature:优化最终的wifi连接流程

zeng.chen 6 月之前
父节点
当前提交
7cfb97a7b3

+ 47 - 3
devices/bluetooth/bt_cmd.js

@@ -186,7 +186,7 @@ class BtCmd {
         // return [115, 109, 97, 114, 116, 95, 65, 50, 70]
         // 73 6D 61 72 74 5F 41 32 46
         let code = Array.from(text).map(char => char.charCodeAt(0));
-        console.log("stringToUint8Array", code)
+        console.log("stringToUint8Array", text, code)
         return code
     }
     static listInt2String(data) {
@@ -249,6 +249,51 @@ class BtCmd {
         return 0x01;
     }
 
+    // wifi ,md5都用这个
+    static sendWiFiInfo(wifiName, pwd) {
+        // [0x22, (wifiList.length + pwdList.length + 6), 0x33, (wifiList.length), (wifiList), 0x44, (pwdList)];
+
+        if (!wifiName || !pwd) {
+            return;
+        }
+
+        let result = [];
+
+        // 字母*6 +
+        let wifiList = BtCmd.stringToUint8Array(wifiName);
+
+        // 数字*3 +
+        let pwdList = BtCmd.stringToUint8Array(pwd);
+        console.log("wifiList", wifiList, "pwdList", pwdList)
+
+        // 16进制
+        result.push(0x22);
+
+        result.push(BtCmd.intToHex(wifiList.length + pwdList.length + 6));
+
+        // 账号
+        result.push(0x33);
+        result.push(BtCmd.intToHex(wifiList.length));
+
+        let p = result[3] + 4;
+        let j = 0;
+        for (let i = 4; i < p; i++) {
+            result.splice(i, 0, wifiList[j++]);
+        }
+
+        // 密码
+        result.splice(p, 0, 0x44);
+        result.splice(++p, 0, BtCmd.intToHex(pwdList.length));
+        p++;
+        j = 0;
+        for (let i = p; i < p + pwdList.length; i++) {
+            result.splice(i, 0, pwdList[j++]);
+        }
+
+        console.log("发送wifi账号密码:", result.toString());
+        return result;
+    }
+
     /* 黑胶音箱的指令 */
     // 壁纸指令 1开始, 0结束
     static wallPaper(value) {
@@ -326,7 +371,6 @@ class BtCmd {
                 }
             } else {
                 cmd.push(...otherCmd);
-                console.log(`打印其他命令:${cmd}`);
             }
         }
 
@@ -352,7 +396,7 @@ class BtCmd {
         if (isSend) {
             mqttAddDebugCmd(`发送蓝牙指令:${cmd} \n ${result}`);
         }
-        console.log(`${key}解析- [${result}]`);
+        console.log(`${key}解析- [${result}],原始数据:${cmd}`);
     }
 
     static _int2Hex(num) {

+ 18 - 2
devices/bluetooth/bt_parse.js

@@ -518,8 +518,24 @@ class BtParse {
             case CmdBase.wallPaperData:
                 // [54:44:44:48:01:0A:78:01:01:00]
                 {
-                    // let kind = cmd[8]
-                    // EventManager.fire(CmdEvent.wallPaperData({ value: value, kind: kind }));
+                    let kind = cmd[9]
+                    EventManager.fire(CmdEvent.wallPaperData({ value: value, kind: kind }));
+                }
+
+                break;
+            case CmdBase.heiJiaoOtaData:
+                //0x75 发送url
+                {
+                    let kind = cmd[9]
+                    EventManager.fire(CmdEvent.otaUrl({ value: value, kind: kind }));
+                }
+
+                break;
+            case CmdBase.wallPaperMD5:
+                //0x75 发送url
+                {
+                    let kind = cmd[9]
+                    EventManager.fire(CmdEvent.wallPaperMD5({ value: value, kind: kind }));
                 }
 
                 break;

+ 16 - 1
devices/cmd_key_event.js

@@ -50,7 +50,8 @@ const EnumCmdEvent = {
     otaUrl: 'otaUrl',
     otaWifi: 'otaWifi',
     wallpaper: 'wallpaper',
-    wallpaperMD5: 'wallpaperMD5',
+    wallPaperData: 'wallPaperData',
+    wallPaperMD5: 'wallPaperMD5',
 };
 
 // 枚举定义
@@ -361,6 +362,20 @@ class CmdEvent {
         event.heiJiaoKind = kind;
         return event;
     }
+    static wallPaperData({ value, kind }) {
+        const event = new CmdEvent({ cmdEvent: EnumCmdEvent.wallPaperData });
+        console.log("wallPaperData", value, kind)
+        event.wallpaper = value;
+        event.heiJiaoKind = kind;
+        return event;
+    }
+    static wallPaperMD5({ value, kind }) {
+        const event = new CmdEvent({ cmdEvent: EnumCmdEvent.wallpaperMD5 });
+        console.log("wallPaperMD5", value, kind)
+        event.wallpaper = value;
+        event.heiJiaoKind = kind;
+        return event;
+    }
 
     static netModeAuto({ netModeAuto }) {
         const event = new CmdEvent({ cmdEvent: EnumCmdEvent.netModeAuto });

+ 2 - 1
pages/deviceDetail/detail.js

@@ -121,7 +121,8 @@ Page({
     const btHelper = BtHelper.getInstance();
     let isShowOta = device.clientType === 'MW-S2'
     if (isShowOta) {
-      btHelper.getVersion()
+      // btHelper.getVersion()
+      this.checkOtaVersion(device);
     }
     // btHelper.getPauseSleep()
 

+ 2 - 1
pages/index/index.js

@@ -281,10 +281,11 @@ Page({
       BtHelper.getInstance().connect(device, function (isConnected, d) {
         if (isConnected) {
           device.state = 'online';
+          that.addBlueDevice(device);
+
         } else {
           device.state = 'offline';
         }
-        that.addBlueDevice(device);
       });
 
     } else {

+ 5 - 5
pages/ota/ota.js

@@ -358,10 +358,10 @@ Page({
       let kind = event.heiJiaoKind;
       // 74,1,1是wifi连接成功,74,0 2连接wifi失败/没有wifi。   
       // 发送url给你后,你回:74 0 1是流程成功,74 0 3是流程失败。
+      let otaCmd = event.otaCmd;
 
       switch (name) {
         case EnumCmdEvent.otaCmd:
-          let otaCmd = event.otaCmd;
           console.log("OTA页:", otaCmd, kind)
 
           if (otaCmd === 1 && kind == 1) {
@@ -412,9 +412,9 @@ Page({
           break;
         case EnumCmdEvent.otaUrl:
           let otaUrl = event.otaUrl;
-          if (otaUrl === 1) {
+          if (otaUrl === 1 && kind == 1) {
             // 开始发送url
-            BtHelper.getInstance().wifiUrl(BtCmd.stringToUint8Array(_this.data.otaData.url))
+            BtHelper.getInstance().otaUrl(BtCmd.stringToUint8Array(_this.data.otaData.url))
           } else {
             wx.hideLoading()
             // wifi失败
@@ -425,11 +425,11 @@ Page({
           }
           break;
         case EnumCmdEvent.otaWifi:
+          wx.hideLoading()
           // 0x76, 发送wifi成功
-          if (value === 1) {
+          if (otaCmd === 1 && kind == 1) {
             _this.sendUrlData()
           } else {
-            wx.hideLoading()
             // wifi失败
             wx.showModal({
               title: 'OTA升级失败了',

+ 128 - 111
pages/piano/cropper/cropper.js

@@ -26,6 +26,7 @@ Page({
     _timer: null,
     _imgUrl: null,
     _imgMD5: null,
+    _imgIndex: null,
   },
   cropper: null,
   callback() {
@@ -217,37 +218,6 @@ Page({
   submit() {
     let _this = this
 
-    // this.cropper.getImgData((obj) => {
-
-    //   _this.cropper.getImg((obj2) => {
-    //     // app.globalData.imgSrc = obj.url;
-    //     console.log("裁剪壁纸:", obj2);
-    //     _this.data._imgUrl = obj2.url
-    //   });
-
-    //   wx.showLoading({
-    //     title: '壁纸裁剪中',
-    //   })
-
-    //   // let binData = _this.imageDataToRGB565(obj.data, obj.width, obj.height)
-
-    //   // const rgb565Data = _this.convertImageDataToRGB565(obj.data, obj.width, obj.height)
-    //   // // 生成 LVGL 二进制文件
-    //   // const binData = _this.generateLVGLBinFile(rgb565Data, obj.width, obj.height);
-
-    //   const binData = _this.imageDataToRGB565(obj.data, obj.width, obj.height);
-
-    //   _this.sliceDataIntoChunks(binData, 128);
-
-    //   console.log("下载文件成功2:", binData.byteLength, binData.length)
-    //   _this.data._imageBufferLength = binData.byteLength ?? binData.length
-    //   wx.hideLoading();
-    //   wx.showLoading({
-    //     title: '开始传输壁纸',
-    //   })
-    //   _this.startImage();
-    // });
-
     // 读取裁剪的jpg图片
     const fs = wx.getFileSystemManager();
     this.cropper.getImg((obj) => {
@@ -263,16 +233,24 @@ Page({
         success: (obj) => {
           console.log("加载文件成功:", obj.data.byteLength, obj.data.length)
 
-          let binData = obj.data;
-          _this.sliceDataIntoChunks(binData, 64);
+          fs.getFileInfo({
+            "filePath": url, "digestAlgorithm": "md5", success: (res) => {
+              console.log("md5:", res)
+              console.log("加载文件成功:", obj.data.byteLength, obj.data.length, obj.getFileInfo)
+
+              let binData = obj.data;
+              _this.sliceDataIntoChunks(binData, 64);
 
-          console.log("加载文件成功2:", binData.byteLength, binData.length)
-          _this.data._imageBufferLength = binData.byteLength ?? binData.length
-          wx.hideLoading();
-          wx.showLoading({
-            title: '开始传输壁纸',
+              console.log("加载文件成功2:", binData.byteLength, binData.length)
+              _this.data._imageBufferLength = binData.byteLength ?? binData.length
+              wx.hideLoading();
+              wx.showLoading({
+                title: '开始传输壁纸',
+              })
+              _this.startImage()
+            }
           })
-          _this.startImage()
+
         },
         fail: (err) => {
           console.error('读取 .bin 文件失败:', err);
@@ -401,7 +379,11 @@ Page({
     this.data._chunks = chunks;
   },
   sendImageMD5() {
-    BtHelper.sendCallBack(BtCmd.wallPaperMD5(this.data._imgMD5), function (res) {
+    let md5Code = BtCmd.stringToUint8Array(this.data._imgMD5)
+    let lengthCode = BtCmd.intToHex(this.data.length)
+    let value = BtCmd.sendWiFiInfo(md5Code, lengthCode)
+
+    BtHelper.sendCallBack(BtCmd.wallPaperMD5(value), function (res) {
       if (!res) {
         wx.hideLoading()
         wx.showToast({
@@ -411,7 +393,7 @@ Page({
       }
     });
   },
-  async sendImage() {
+  async sendImage(i) {
     let _this = this
 
     wx.hideLoading()
@@ -419,56 +401,57 @@ Page({
     let next = 0;
     let total = _this.data._imageBufferLength;
     let btHelper = BtHelper.getInstance();
-    let i = 0;
-    _this.data._timer = setInterval(async () => {
-      if (i > chunks.length - 1) {
-        wx.showModal({
-          title: '壁纸上传成功:' + i + "总:" + chunks.length,
-          showCancel: false,
-          success(res) {
-            if (res.confirm) {
-              const pages = getCurrentPages();
-              // 获取上一级页面实例
-              const prevPage = pages[pages.length - 2];
-              // 传递参数
-              prevPage.setData({
-                topImg: {
-                  "pic": _this.data._imgUrl,
-                }
-              });
-              wx.navigateBack({
-                delta: 1,
-              })
-            }
+    // let i = 0;
+    // _this.data._timer = setInterval(async () => {
+    if (i > chunks.length - 1) {
+      wx.showModal({
+        title: '壁纸上传成功:' + i + "总:" + chunks.length,
+        showCancel: false,
+        success(res) {
+          if (res.confirm) {
+            const pages = getCurrentPages();
+            // 获取上一级页面实例
+            const prevPage = pages[pages.length - 2];
+            // 传递参数
+            prevPage.setData({
+              topImg: {
+                "pic": _this.data._imgUrl,
+              }
+            });
+            wx.navigateBack({
+              delta: 1,
+            })
           }
-        })
-        _this.endImage(0)
-        return;
-      }
+        }
+      })
+      _this.endImage(0)
+      return;
+    }
 
-      const chunk = chunks[i];
-      next += (chunk.byteLength ?? chunk.length);
-      // let uint8Array = new Uint8Array(chunk);
-      // let unit16 = uint8Array.map(item => {
-      //   return item.toString(16)
-      // });
-      console.log("发送壁纸数据1:", i, ":", next, ":", chunk.length, ":", chunk.byteLength, ":", total, chunks.length)
+    const chunk = chunks[i];
+    next += (chunk.byteLength ?? chunk.length);
+    // let uint8Array = new Uint8Array(chunk);
+    // let unit16 = uint8Array.map(item => {
+    //   return item.toString(16)
+    // });
+    console.log("发送壁纸数据1:", i, ":", next, ":", chunk.length, ":", chunk.byteLength, ":", total, chunks.length)
 
-      let res = await btHelper.wallPaperSyncData(chunk);
-      // let res = true;
-      // btHelper.wallPaperData(chunk);
+    let res = await btHelper.wallPaperSyncData(chunk);
+    // let res = true;
+    // btHelper.wallPaperData(chunk);
 
-      if (!res) {
-        wx.showModal({
-          title: '壁纸上传失败',
-          showCancel: false
-        })
-        _this.endImage(2)
-      }
-      _this.updateProgress(next, total);
+    if (!res) {
+      wx.showModal({
+        title: '壁纸上传失败',
+        showCancel: false
+      })
+      _this.endImage(2)
+    }
+    _this.updateProgress(next, total);
 
-      i++;
-    }, 30);
+    i++;
+    _this.data._imgIndex = i;
+    // }, 30);
   },
   async delay(ms) {
     return new Promise(resolve => setTimeout(resolve, ms));
@@ -507,6 +490,24 @@ Page({
       });
     }
   },
+  failSend(showToast) {
+    let _this = this
+    _this.data._chunks = null
+    _this.data._imgUrl = null
+    _this.data._imgMD5 = null
+    _this.data._imgIndex = 0
+    wx.hideLoading()
+    if (showToast) {
+      wx.showModal({
+        title: '壁纸上传失败了',
+        showCancel: false
+      })
+    }
+    _this.setData({
+      progress: 0,
+      showCropImg: false
+    });
+  },
   /**
    * 生命周期函数--监听页面加载
    */
@@ -523,42 +524,58 @@ Page({
     EventManager.addNotification(CmdEvent.eventName, function (event) {
       let name = event.cmdEvent;
       console.log("裁剪页:", EnumCmdEvent)
+      let value = event.wallpaper;
 
       switch (name) {
         case EnumCmdEvent.wallpaper:
-          let otaCmd = event.wallpaper;
           let kind = event.heiJiaoKind;
-          console.log("裁剪页:", otaCmd, kind)
+          console.log("裁剪页:", value, kind)
+          // 小程序:0x78,  1。 开启壁纸
+          // 黑胶回:0x78, 2, 1 ,1。  0x78, 2, 0, 2 。 1成功,2失败   
+
+          // 小程序:0x80,  [参考wifi指令],  [0x22,总长度,0x33,包长,包数,0x44,md5长,md5]
+          // 黑胶回:0x80,  1, 1。 0x80,  0, 2。   1成功,2失败       
+
+          // 小程序:0x79,  数据长度,数据
+          // 黑胶回:0x79, 1,  1 。0x79, 0,  2 。    1成功,2失败     
+
+          // 小程序:0x78,  0。结束了
+          // 黑胶回:0x78, 2, 0, 1 。  0x78, 2, 0, 3 。   0流程成功,3流程失败    
 
-          if (otaCmd === 1 && kind == 1) {
-            // 开始发送
+          // 小程序: 0x78,  2。异常结束
+          if (value === 1 && kind == 1) {
+            // 开始校验md5
             _this.sendImageMD5()
             // _this.sendImage()
             _this.startProgress()
-          } else if (otaCmd === 0 && kind == 1) {
-            _this.setData({
-              progress: 0,
-              showCropImg: false
-            });
-            // 发送结束
-          } else if (kind == 0) {
-            wx.hideLoading()
-            wx.showModal({
-              title: '壁纸上传失败了',
-              showCancel: false
+          } else if (value === 0 && (kind == 2 || kind == 3)) {
+            // 发送失败
+            _this.failSend(true)
+          } else if (value === 0 && kind == 1) {
+            // 发送完成
+            _this.failSend(false)
+            wx.showToast({
+              title: '壁纸发送成功',
+              icon: 'success'
             })
-            _this.setData({
-              progress: 0,
-              showCropImg: false
-            });
-            if (_this.data._timer) {
-              clearInterval(_this.data._timer)
-              _this.data._timer = null
-            }
           }
           break;
-        case EnumCmdEvent.wallpaperMD5:
-
+        case EnumCmdEvent.wallPaperMD5:
+          console.log("开始发送MD5")
+          // 收到回复md5,开始发送图片
+          if (kind == 1 && value === 1) {
+            _this.sendImage(0)
+          } else {
+            _this.failSend(true)
+          }
+          break;
+        case EnumCmdEvent.wallPaperData:
+          // 收到回复md5,开始发送图片
+          if (kind == 1 && value === 1) {
+            _this.sendImage(_this.data._imgIndex)
+          } else {
+            _this.failSend(true)
+          }
           break;
         default:
           break;

+ 3 - 35
pages/setWifi/setWifi.js

@@ -73,41 +73,8 @@ Page({
       return;
     }
 
-    let result = [];
+    let result = BtCmd.sendWiFiInfo(wifiName, pwd)
 
-    // 字母*6 +
-    let wifiList = BtCmd.stringToUint8Array(wifiName);
-
-    // 数字*3 +
-    let pwdList = BtCmd.stringToUint8Array(pwd);
-    console.log("wifiList", wifiList, "pwdList", pwdList)
-
-    // 16进制
-    result.push(0x22);
-
-    result.push(BtCmd.intToHex(wifiList.length + pwdList.length + 6));
-
-    // 账号
-    result.push(0x33);
-    result.push(BtCmd.intToHex(wifiList.length));
-
-    let p = result[3] + 4;
-    let j = 0;
-    for (let i = 4; i < p; i++) {
-      result.splice(i, 0, wifiList[j++]);
-    }
-
-    // 密码
-    result.splice(p, 0, 0x44);
-    result.splice(++p, 0, BtCmd.intToHex(pwdList.length));
-    p++;
-    j = 0;
-    for (let i = p; i < p + pwdList.length; i++) {
-      result.splice(i, 0, pwdList[j++]);
-    }
-    // result.push(...pwdList)
-
-    console.log("发送wifi账号密码:", result.toString());
     // _ble.send({ cmd: result });
     BtHelper.getInstance().otaSetWifi(result)
   },
@@ -128,6 +95,7 @@ Page({
     let _this = this;
     EventManager.addNotification(CmdEvent.eventName, function (event) {
       let name = event.cmdEvent;
+      let otaCmd = event.otaCmd
       console.log("设置wifi0:", event)
       let kind = event.heiJiaoKind;
       console.log("设置wifi:", name, otaCmd, kind)
@@ -151,7 +119,7 @@ Page({
     this.getConnectedWifi();
     this.addNotification()
   },
-  onUnload: function () {
+  onUnload() {
     EventManager.removeNotification(CmdEvent.eventName)
   },
 });