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
。
看在上帝的份上,我无法构建一个简单的方法来遍历每个扫描的网络并将 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
。