我需要将json发送到服务器。该代码工作完美,但是由于我需要在两个位置上调用它,因此希望将其作为我们的功能。但是,我无法使其与char数组一起使用。一种可能是将char数组转换为我期望的String,但是我期望的内存效率不高。所以我想我将传递一个指针,在函数中分配大小,然后返回长度。但这似乎不起作用,“编码” char *似乎为空。
基本是我做错了。
这是代码:
Serial.println("Connected");
char* encoded;
int contentLength = generateData(encoded);
Serial.print("Data to be send, length: "); Serial.print(contentLength); Serial.println(" Data: "); Serial.println(encoded);
// Send request to the server:
client.println("POST /api/heartbeat HTTP/1.1");
client.println("Host: localhost");
client.println("Accept: */*");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(contentLength + 5);
client.println();
client.print("data=");
client.print(encoded);
// Done here, as the response availability sometimes takes time.
lastConnection = millis();
updateServer = false;
free(encoded);
和功能:
int generateData(char* encoded) {
Serial.println("Preparing the data to be send....");
String inputString = "{\"status\":\"OK\",\"hostname\":\"";
inputString += hostname;
inputString += "\",\"build\":";
inputString += build;
inputString += ",\"hardware\":\"";
inputString += hardware;
inputString += "\",\"sensors\":[";
bool firstSensor = true;
for (uint8_t i = 0; i < 8; i++) {
if (temperatureValues[i] == 0) continue;
if (!firstSensor) inputString += ",";
inputString += "{\"sensor\":\"";
inputString += temperatureAddresses[i];
inputString += "\",\"value\":";
inputString += String(temperatureValues[i]);
inputString += ",\"type\":\"temp\"}";
firstSensor = false;
}
inputString += "]";
if (pendingResponses.length() > 0) {
inputString += ",\"responses\":[";
inputString += pendingResponses;
inputString += "]";
pendingResponses = "";
}
inputString += "}";
byte plain[inputString.length() + 1];
inputString.getBytes(plain, inputString.length() + 1);
des.calc_size_n_pad(sizeof(plain));
byte encodedByte[des.get_size()];
byte plain_p[des.get_size()];
des.padPlaintext(plain, plain_p);
for (int i = 0; i < (des.get_size() / 8); i++) {
byte intermitInput[8];
byte intermitResult[8];
for (int j = 0; j < 8; j++) {
intermitInput[j] = plain_p[(i * 8) + j];
}
des.encrypt(intermitResult, intermitInput, (byte*)key);
for (int j = 0; j < 8; j++) {
encodedByte[(i * 8) + j] = intermitResult[j];
}
}
int inputLength = sizeof(encodedByte);
int newLength = Base64.encodedLength(inputLength);
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '\0';
// Base64 Encoder
Base64.encode(encoded, (char*)encodedByte, inputLength);
return newLength;
}
您正在传递encoded
价值
char* encoded;
int contentLength = generateData(encoded);
这意味着当您将其分配给 generateData()
encoded = (char*) malloc(newLength + 1);
encoded[newLength] = '\0';
您仅更改局部变量。
最快的解决方法是更改generateData()
以通过引用代替其值来获取其参数,并且它应该可以工作
int generateData(char* &encoded)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句