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++;

                }
                           
            }

        }
       
    }        

 

posted @ 2020-06-12 19:47  一文搞懂  阅读(5428)  评论(0编辑  收藏  举报