微信小程序数据接收

打印 上一主题 下一主题

主题 2120|帖子 2120|积分 6360

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.微信小程序蓝牙模块中的
  1. wx.onBLECharacteristicValueChange
复制代码
回调函数偶然候一个数据包会分多个数据包回调,偶然候多个数据包会合并成一个数据包回调,假如接收到数据包就处置惩罚业务,分拆的和合并的数据都会由于解析失败,导致业务无法正常进行。
2.数据包设计格式为7b开头,随后两位代表整体长度(7b用于鉴定数据合法性,长度用于控制后续数据处置惩罚)。
3.数据包开头不为7b开头则视为非法数据丢弃。
4.数据包7b开头长度不足,则等后续数据进行拼接后再次处置惩罚。
5.数据包7b开头长度溢出(正好视为溢出0位),则把长度正常部分交给业务处置惩罚,随后把溢出部分再次进入第2步处置惩罚(递归)。
6.第5步采用了递归,但是每次受理数据都会截断,总有截断到空串的时候,所以不消担心递归会造成死循环。
  1. const bufferHead = '7b'; //缓冲区头部
  2. const onBLECharacteristicValueChange = (cb) => {
  3.     //首次监听清空
  4.     let bufferString = "";
  5.     const handleHex = (str, strHex) =>{
  6.       console.log("BLE收到消息:"+strHex);
  7.       //1.检验缓冲区数据是否合法,合法则保留不合法则丢弃
  8.       if(bufferString.length > 0 && bufferString.slice(0,2) !== bufferHead){
  9.         console.log("BLE缓冲区不合法丢弃:"+bufferString);
  10.         bufferString = "";
  11.       }
  12.       //2.缓冲区拼接新数据(缓冲区有长度直接拼,无长度新数据合法才能拼(新数据为空或者7b开头为合法))
  13.       if(bufferString.length > 0 || strHex === "" || strHex.slice(0,2) === bufferHead){
  14.         console.log("BLE缓冲区合法拼接:"+bufferString+"和"+strHex);
  15.         bufferString += strHex;
  16.       }
  17.       //3.取数据的合法长度
  18.       let bufferLength = 4; //合法字节至少四位,因为第三位和第四位代表长度
  19.       if(bufferString.length >= 4){
  20.         bufferLength = parseInt(bufferString.slice(2,4), 16)*2;
  21.       }
  22.       //4.长度充足截取有效内容,剩余部分存入缓冲区
  23.       if(bufferString.length >= bufferLength){
  24.         const value = bufferString.slice(0,bufferLength);
  25.         bufferString = bufferString.slice(bufferLength);
  26.         console.warn("BLE缓冲区溢出分解为:"+value+"和"+bufferString);
  27.         cb(str, value);
  28.         //5.黏包情况继续处理剩余部分,若剩余部分有完整包则能继续处理业务
  29.         if(bufferString.length >0){
  30.           handleHex(str, "");
  31.         }
  32.       }else{
  33.         console.log("BLE缓冲区长度缺失:"+(bufferLength-bufferString.length));
  34.       }
  35.     }
  36.     wx.onBLECharacteristicValueChange((res) => {
  37.         let x = new Uint8Array(res.value);
  38.         let strHex = ""
  39.         let str = ""
  40.         for (let i = 0; i < x.length; i++) {
  41.             strHex = strHex + x[i].toString(16).padStart(2, "0")
  42.         }
  43.         handleHex(str, strHex);
  44.     })
  45. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表