zoukankan      html  css  js  c++  java
  • 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++;
    
                    }
                               
                }
    
            }
           
        }        
  • 相关阅读:
    非root用户在linux下安装多个版本的CUDA和cuDNN(cuda 8、cuda 10.1 等)
    python相关总结
    可视化滤波器
    Ubuntu 和windows程序区别
    远程服务器运行代码相关
    Ubuntu
    jmeter学习(1)基础支持+安装部署
    python中eval方法的使用
    mysql学习(4)python操作数据库
    mysql学习(3)10045错误,连接不上数据库
  • 原文地址:https://www.cnblogs.com/easyidea/p/13109806.html
Copyright © 2011-2022 走看看