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