由于微信小程序只支持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++; } } } }