当前位置: 首页 > article >正文

微信小程序数据接收

1.微信小程序蓝牙模块中的

wx.onBLECharacteristicValueChange 

回调函数有时候一个数据包会分多个数据包回调,有时候多个数据包会合并成一个数据包回调,如果接收到数据包就处理业务,分拆的和合并的数据都会因为解析失败,导致业务无法正常进行。

2.数据包设计格式为7b开头,随后两位代表整体长度(7b用于鉴定数据合法性,长度用于控制后续数据处理)

3.数据包开头不为7b开头则视为非法数据丢弃。

4.数据包7b开头长度不足,则等后续数据进行拼接后再次处理。

5.数据包7b开头长度溢出(正好视为溢出0位),则把长度正常部分交给业务处理,随后把溢出部分再次进入第2步处理(递归)

6.第5步采用了递归,但是每次受理数据都会截断,总有截断到空串的时候,所以不用担心递归会造成死循环。

const bufferHead = '7b'; //缓冲区头部
const onBLECharacteristicValueChange = (cb) => {//首次监听清空let bufferString = "";const handleHex = (str, strHex) =>{console.log("BLE收到消息:"+strHex);//1.检验缓冲区数据是否合法,合法则保留不合法则丢弃if(bufferString.length > 0 && bufferString.slice(0,2) !== bufferHead){console.log("BLE缓冲区不合法丢弃:"+bufferString);bufferString = "";}//2.缓冲区拼接新数据(缓冲区有长度直接拼,无长度新数据合法才能拼(新数据为空或者7b开头为合法))if(bufferString.length > 0 || strHex === "" || strHex.slice(0,2) === bufferHead){console.log("BLE缓冲区合法拼接:"+bufferString+"和"+strHex);bufferString += strHex;}//3.取数据的合法长度let bufferLength = 4; //合法字节至少四位,因为第三位和第四位代表长度if(bufferString.length >= 4){bufferLength = parseInt(bufferString.slice(2,4), 16)*2;}//4.长度充足截取有效内容,剩余部分存入缓冲区if(bufferString.length >= bufferLength){const value = bufferString.slice(0,bufferLength);bufferString = bufferString.slice(bufferLength);console.warn("BLE缓冲区溢出分解为:"+value+"和"+bufferString);cb(str, value);//5.黏包情况继续处理剩余部分,若剩余部分有完整包则能继续处理业务if(bufferString.length >0){handleHex(str, "");}}else{console.log("BLE缓冲区长度缺失:"+(bufferLength-bufferString.length));}}wx.onBLECharacteristicValueChange((res) => {let x = new Uint8Array(res.value);let strHex = ""let str = ""for (let i = 0; i < x.length; i++) {strHex = strHex + x[i].toString(16).padStart(2, "0")}handleHex(str, strHex);})
}

http://www.lryc.cn/news/2385206.html

相关文章:

  • 鸿蒙UI开发——badge角标的使用
  • 批量打印的趣事
  • 车载中央域控制器测试【BCM模块介绍-外灯3】
  • Linux系统基础——是什么、适用在哪里、如何选
  • MySQL与Oracle六大方面之比较
  • 二层和三层交换机的概念
  • 计算机网络学习20250524
  • 无损图片压缩 本地处理 批量处理提升效率 无需联网+无广告
  • C++标准库中 std::string 类提供的 insert 成员函数的不同重载版本
  • Qt window frame + windowTitle + windowIcon属性(3)
  • 解决:VMware 虚拟机 Ubuntu 系统共享文件夹无法访问问题
  • Dify源码学习
  • 静态网站部署:如何通过GitHub免费部署一个静态网站
  • 【拯救小狗】2022-1-3
  • PS2025 v26.7 Photoshop2025+AI生图扩充版,支持AI画图
  • 怎么开发一个网络协议模块(C语言框架)之(三) 全局实例
  • ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)
  • 香港维尔利健康科技集团全面推进AI医疗落地,构建智慧健康管理新模式
  • 在 .NET 环境下实现跨进程高频率读写数据
  • Arduino和STM32的区别详解
  • 选择合适的Azure数据库监控工具
  • bi软件是什么?bi软件是做什么用的?
  • DeepSeek 赋能智能电网:从技术革新到全场景应用实践
  • xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
  • python进行while遍历的常见错误解析
  • 锐化算子构建方法(机翻)
  • GO语言学习(七)
  • 算法中的数学:费马小定理
  • 【TypeScript】知识点梳理(四)
  • 【Python 算法零基础 4.排序 ③ 插入排序】