【发布时间】:2020-03-06 19:58:52
【问题描述】:
我正在编写一个程序来通过 ESP32(Arduino 框架)中的蓝牙接收 SSID 和密码。函数 BTSerialRcvBuffer() 等待蓝牙,当它接收到一个字符串时,它通过 struct Buffer_return 类型的变量返回字符串的基地址和大小。该函数返回 SSID 但不返回密码。我不知道为什么?我是否必须为 Var.rtn_addr 分配内存或为变量 buff1 和 buff2 分配足够的内存?
#include <Arduino.h>
#include <stdlib.h>
#include <BluetoothSerial.h>
#include <WiFi.h>
#define btrcv_buffer_size 256
BluetoothSerial SerialBT;
typedef struct
{
char *rtn_addr;
int buff_len;
} Buffer_return;
Buffer_return* BTSerialRcvBuffer() {
static int i = 0;
static char rcv_buffer[ btrcv_buffer_size ];
static Buffer_return Var;
memset(rcv_buffer,0, btrcv_buffer_size);
while (!SerialBT.available());
delayMicroseconds(500);
while(SerialBT.available()) {
rcv_buffer[i] = SerialBT.read();
i++;
}
rcv_buffer[i-1] = '\0';
rcv_buffer[i-2] = '\0';
SerialBT.flush();
Var.rtn_addr = rcv_buffer; //<------------Do I have to allocate memory for Var.rtn_addr?
Var.buff_len = i-1;
return &Var;
}
void WiFiConfig() {
//WiFi.printDiag(Serial);
Serial.println("Enter SSID");
Buffer_return *buff1 = BTSerialRcvBuffer();
char *ssid = (char*) malloc((buff1->buff_len) * sizeof(char));
strcpy(ssid,buff1->rtn_addr);
Serial.println(ssid);
Serial.println("Enter Password");
Buffer_return *buff2 = BTSerialRcvBuffer();
char *pass = (char*) malloc((buff2->buff_len) * sizeof(char));
strcpy(pass,buff2->rtn_addr);
Serial.println(pass);
//Serial.println(buff2->buff_len);
free(ssid)
free(pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Establishing connection to WiFi..");
Serial.printf("Connection status: %d\n", WiFi.status());
}
}
void setup() {
Serial.begin(115200);
//WiFi.disconnect(true);
SerialBT.begin("ESP32_INO"); //Bluetooth device name
WiFi.mode(WIFI_STA);
Serial.println("The device started, now you can pair it with bluetooth!");
WiFiConfig();
Serial.println("Connected to network");
Serial.println(WiFi.macAddress());
Serial.println(WiFi.localIP());
}
void loop() {
}
输出:
Enter SSID
Airtel_5G <----- prints fine!
Enter Password
<----- Problem!
Establishing connection to WiFi..
Connection status: 6
Establishing connection to WiFi..
Connection status: 6
Establishing connection to WiFi..
Connection status: 6
【问题讨论】:
-
while(SerialBT.available()) { rcv_buffer[i] = SerialBT.read(); i++; } rcv_buffer[i-1] = '\0'; rcv_buffer[i-2] = '\0';代码在任何时候都有问题i > btrcv_buffer_size或i<2。 -
是的 - 我没有看到任何安全机制来确保仅从字节流中加载完整的协议单元(似乎是以 \r\n 结尾的文本行)。我看不出这是如何可靠地工作的。
-
而不是在
BTSerialRcvBuffer()中有一个静态缓冲区,然后在WiFiConfig()中复制它,将缓冲区ssid和pass与最大值一起传递会更安全、更惯用长度作为BTSerialRcvBuffer()的参数。在这个平台上可能会避免静态和动态内存分配。 -
关于:
SerialBT.flush();flush()' 操作是针对输出流,而不是输入流。
标签: c++ c arduino embedded esp32