Esp8266 & Nodemcu: 返回请求字符串的方法

Esp8266 & Nodemcu: Method returning an request string

看在上帝的份上,我无法构建一个简单的方法来遍历每个扫描的网络并将 BSSID 及其强度连接成一个字符串。我感觉像超级垃圾。

我需要这个图案:

http://IP:PORT/localize?mac1=x.x.x.x&strength1=-30&mac2=x.x.x.x&strength2=-40...

这是我目前得到的:

const char* build_request(){
  int n = WiFi.scanNetworks();

  char urlout[512];
  strcpy(urlout, host);

  for (int i = 0; i < n; ++i){
    char buffer[8];
    strcat(urlout, "&mac");
    sprintf(buffer, "%d", i);
    strcat(urlout, buffer);
    strcat(urlout, "=");
    strcat(urlout, WiFi.BSSIDstr(i).c_str());
    strcat(urlout, "&strength");
    strcat(urlout, buffer);
    strcat(urlout, "=");
    //strcat(urlout, WiFi.RSSI(i)); 
  }

  return urlout;

除此之外,输出有时还包含像这样的奇怪符号:

http://IP:5000/localize&mac0=44:4E:6D:53:88:C1&strength0=&mac1=90:5C:44:C5:C6:B7&strength1=&mac2=38:10:D5:B2:64:10&strength2=&mac3=34:2C:C4:B7:72:D6&strength3=&mac4=00:15:0C:E1:CB:␀␀␀␀␀␀␀␀␟␀␀␀=K␐@␌␅␀@4:34:6B:EF:7�^ @0␀␀␀␘␀␀␀����␌_ @␜␀␀`␜␀␀`U␁␀␀�8 @␀␀�␀␀␀␀�=␀�?P␂␀␀���?␂␀␀␀␀␀␀␀=␀␀␀~␀␀␀U␁␀␀0␀␀␀h7=&mac8=EA:DF:70:FA:D8:A3&strength8=

还有

strcat(urlout, WiFi.RSSI(i)); 

说:

argument of type "int32_t" is incompatible with parameter of type "const char *"

虽然例如 Serial.print() 也期望 const char* 能够打印 RSSI 值..

有人可以引导我正确地使用 vars 构建字符串并避免缓冲区溢出等吗...

亲切的问候

urlout 是一个 local 变量,因此它的生命周期在超出范围时结束(当您的函数 returns 时),给你留下一个无效的指针。

我建议您改为将数组作为参数传递给函数:

const char* build_request(char *urlout){ ... }

可选,如果您的目标和编译器支持它,请改用 C++ std::string