• ESP32 BLE蓝牙 微信小程序通信发送大于20字符数据


    由于微信小程序只支持BLE每次发送数据不大于20个字节,ESP32则有经典蓝牙、低功耗蓝牙两种模式。

    要解决发送数据大于20个字节的问题,最简单实用的方式就是分包发送。如下图所示:

    1、什么起始字符和结束字符 

      起始字符用来通知接收端,当接收端接收到起始字符之后开始通过循环拼接字符,当接收端接收到结束字符之后得就能得到本次接收的所有字符。

    2、如何选择起始字符和结束字符

      参考ASCII码选择要发送的字符中没有的字符。

    2、为什么小于18字符

      由于每次最多发送20个字符,那么为了保证安全和效率不要打擦边球,所有选择每个包最多18个字符。

    参考小程序代码:

     //要发送的字符串(要在起始位置添加起始字符,结束位置添加结束字符)
        let order = that.stringToBytes(recs);
        let byteLen = order.byteLength;//长度
        let pos = 0;       //字符位置
        let tempBuffer;   //一次发送的数据
        var i = 0;          //计数
    
    //为了安全每次发送18个字节 (每次最多20个)
    //发送之前
        while (byteLen > 0) {
          i++;
          if (byteLen > 18) {
            tempBuffer = order.slice(pos, pos + 18);
            pos += 18;
            byteLen -= 18;
            console.log("第", i, "次发送:", tempBuffer);
            that.writeBLECharacteristicValue(tempBuffer);
          } else {
            tempBuffer = order.slice(pos, pos + byteLen);
            pos += byteLen;
            byteLen -= byteLen;
            console.log("第", i, "次发送:", tempBuffer);
            that.writeBLECharacteristicValue(tempBuffer);
          }
        }
        console.log("发送结束");

    ESP32接收端参考代码:

       void onWrite(BLECharacteristic *pCharacteristic) {
            std::string rxValue = pCharacteristic->getValue();
    
            if (rxValue.length() > 0) {
                
                for (int i = 0; i < rxValue.length(); i++){  
                    
                    //防止 意外字符串过长
                    if(bleReslen>1024){
                       bleReslen=0; 
    
                    }
    
                    //开始标志
                    if((int)rxValue[i]==ASCII_STR){//ASCII  起始符
                        bleReslen=0;       
    
                    //结束标志
                    }else if((int)rxValue[i]==ASCII_END){//ASCII  结束符
                        extractData();//提取数据结束  
                        bleReslen=0;
    
                    }else{
                       //拼接字符串
                        encBefor[bleReslen]=(char)rxValue[i];//赋值
                        bleReslen++;
    
                    }
                               
                }
    
            }
           
        }        
  • 相关阅读:
    poj-1001 求高精度幂
    ECS训练营Day1—基于阿里云ECS、VuePress搭建静态网站
    阿里云免费领马克杯答案
    白盒测试之逻辑覆盖 简单易懂~
    如何合并多个PPT?
    failed to connect to gitee.com/github/gitlab port 443: timed out之类的错误
    解决 These dependencies were not found: * core-js/modules/es6.array.fill in xxx 之类的问题
    vue内嵌iframe跨域通信
    Luffy之课程详情页
    Flask之SQLAlchemy,flask_session以及蓝图
  • 原文地址:https://www.cnblogs.com/easyidea/p/13109806.html
Copyright © 2020-2023  润新知