Arduino (c++),如何从套接字 (WiFiClient) 读取字节?
Arduino (c++), How to read bytes from Sockets (WiFiClient)?
java 中的服务器从服务器套接字发送一个字节数组,该字节数组包含具有以下格式的文本 (utf-8):
- 前 4 个字节:一个包含文本字节数的 int
- 下一个
bytes: 每个字节代表一个字符。
所以我正在使用 "ESP8266WiFi.h" 库中的 "WiFiClient"(它应该与 "WiFi.h" 库相同),WifiClient 有一个使用 read() 接收字节的方法方法,问题是我无法正确读取 int(前四个字节)或将字节转换为 int 值。所以如果你能帮助我,我将非常感激:
Java(服务器)简化代码:
String respuestaServer="RESPUESTAS DEL SERVER";
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
out.writeInt(respuestaServer.getBytes(StandardCharsets.UTF_8).length);
out.write(respuestaServer.getBytes(StandardCharsets.UTF_8));
out.flush();
用于接收和解释字节数组的Arduino(客户端)代码(此代码的objective是将字节转换为字符串):
String recibirInfo() {
//TRYING TO READ FIRST FOUR BYTES
byte bytesSizeMsj[4];
for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
bytesSizeMsj[i] = client.read();
Serial.print("BYTE: "+bytesSizeMsj[i]);
}
//TRYING TO TRANSFORM THE FOUR BYTES INTO AN INT
int sizeMsj = int((unsigned char)(bytesSizeMsj[0]) |
(unsigned char)(bytesSizeMsj[1]) |
(unsigned char)(bytesSizeMsj[2])|
(unsigned char)(bytesSizeMsj[3]));
Serial.println(sizeMsj);
char charArray[sizeMsj];
//TRYING TO READ THE REST OF THE MESSAGE
for (int i = 0; i < sizeof(charArray); i++) {
charArray[i] = client.read();
}
//TRYING TO TRANSFORM THE BYTE ARRAY INTO A STRING
String msj=charArray;
return msj;
}
这样排查有点难,你真的收到数据了吗?你能展示你得到的输出吗?也许你甚至没有连接。
此外,我过去所做的是将每个 int 或 "letter" 转换为 char。因为我通常发送一条以字符开头的已知长度的消息,所以我读取消息的每个字节并将其转换为字符,然后将其添加到我收到的消息字符串中。我不知道这是否有帮助...基本上我在字节到达时进行转换。
我修复了它,我在从套接字读取的方式、将 4 个字节转换为 Int 数据类型的方式以及将字节转换为字符串的方式方面遇到了问题,我明白了为什么我是尝试从套接字读取时没有收到所有字节,原因是当我调用方法 "client.read()" 时,服务器发送信息的速度不够快,所以它没有读取任何内容,所以我做了一个循环并在方法 "client.available()" 的帮助下,我检查了是否有一个字节可供读取,因此当读取前 4 个字节时循环结束。然后我将读取的 4 个字节转换为 Int,以与之前类似的方式读取其余字节,并将字节转换为 String。
这是我的功能代码:
String recibirInfo(bool* error) {
String msj = "";
byte bytesSizeMsj[4];
for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
if (client.connected()) {
if (client.available()) {
bytesSizeMsj[i] = client.read();
} else {
delay(10);
i--;
}
} else {
*error = true;
return "";
}
}
//TRANSFORMAR LOS 4 BYTES A INT
int sizeMsj = 0;
sizeMsj = ((int)bytesSizeMsj[3]) | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[2]) << 8 | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[1]) << 16 | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[0]) << 24 | sizeMsj;
char charArray[sizeMsj];
//LEER EL TEXTO
for (int i = 0; i < sizeof(charArray); i++) {
if (client.connected()) {
if (client.available()) {
charArray[i] = client.read();
} else {
delay(250);
i--;
}
} else {
*error = true;
return "";
}
}
//TRANSFORMAR BYTES A STRING
msj = charArrayToString(charArray, sizeMsj);
Serial.print("RECIBIDO: ");
Serial.println(msj);
return msj;
}
String charArrayToString(char arrChar[], int tam) {
String s = "";
for (int i = 0; i < tam; i++) {
s = s + arrChar[i];
}
return s;
}
java 中的服务器从服务器套接字发送一个字节数组,该字节数组包含具有以下格式的文本 (utf-8):
- 前 4 个字节:一个包含文本字节数的 int
- 下一个 bytes: 每个字节代表一个字符。
所以我正在使用 "ESP8266WiFi.h" 库中的 "WiFiClient"(它应该与 "WiFi.h" 库相同),WifiClient 有一个使用 read() 接收字节的方法方法,问题是我无法正确读取 int(前四个字节)或将字节转换为 int 值。所以如果你能帮助我,我将非常感激:
Java(服务器)简化代码:
String respuestaServer="RESPUESTAS DEL SERVER";
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
out.writeInt(respuestaServer.getBytes(StandardCharsets.UTF_8).length);
out.write(respuestaServer.getBytes(StandardCharsets.UTF_8));
out.flush();
用于接收和解释字节数组的Arduino(客户端)代码(此代码的objective是将字节转换为字符串):
String recibirInfo() {
//TRYING TO READ FIRST FOUR BYTES
byte bytesSizeMsj[4];
for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
bytesSizeMsj[i] = client.read();
Serial.print("BYTE: "+bytesSizeMsj[i]);
}
//TRYING TO TRANSFORM THE FOUR BYTES INTO AN INT
int sizeMsj = int((unsigned char)(bytesSizeMsj[0]) |
(unsigned char)(bytesSizeMsj[1]) |
(unsigned char)(bytesSizeMsj[2])|
(unsigned char)(bytesSizeMsj[3]));
Serial.println(sizeMsj);
char charArray[sizeMsj];
//TRYING TO READ THE REST OF THE MESSAGE
for (int i = 0; i < sizeof(charArray); i++) {
charArray[i] = client.read();
}
//TRYING TO TRANSFORM THE BYTE ARRAY INTO A STRING
String msj=charArray;
return msj;
}
这样排查有点难,你真的收到数据了吗?你能展示你得到的输出吗?也许你甚至没有连接。
此外,我过去所做的是将每个 int 或 "letter" 转换为 char。因为我通常发送一条以字符开头的已知长度的消息,所以我读取消息的每个字节并将其转换为字符,然后将其添加到我收到的消息字符串中。我不知道这是否有帮助...基本上我在字节到达时进行转换。
我修复了它,我在从套接字读取的方式、将 4 个字节转换为 Int 数据类型的方式以及将字节转换为字符串的方式方面遇到了问题,我明白了为什么我是尝试从套接字读取时没有收到所有字节,原因是当我调用方法 "client.read()" 时,服务器发送信息的速度不够快,所以它没有读取任何内容,所以我做了一个循环并在方法 "client.available()" 的帮助下,我检查了是否有一个字节可供读取,因此当读取前 4 个字节时循环结束。然后我将读取的 4 个字节转换为 Int,以与之前类似的方式读取其余字节,并将字节转换为 String。
这是我的功能代码:
String recibirInfo(bool* error) {
String msj = "";
byte bytesSizeMsj[4];
for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
if (client.connected()) {
if (client.available()) {
bytesSizeMsj[i] = client.read();
} else {
delay(10);
i--;
}
} else {
*error = true;
return "";
}
}
//TRANSFORMAR LOS 4 BYTES A INT
int sizeMsj = 0;
sizeMsj = ((int)bytesSizeMsj[3]) | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[2]) << 8 | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[1]) << 16 | sizeMsj;
sizeMsj = ((int)bytesSizeMsj[0]) << 24 | sizeMsj;
char charArray[sizeMsj];
//LEER EL TEXTO
for (int i = 0; i < sizeof(charArray); i++) {
if (client.connected()) {
if (client.available()) {
charArray[i] = client.read();
} else {
delay(250);
i--;
}
} else {
*error = true;
return "";
}
}
//TRANSFORMAR BYTES A STRING
msj = charArrayToString(charArray, sizeMsj);
Serial.print("RECIBIDO: ");
Serial.println(msj);
return msj;
}
String charArrayToString(char arrChar[], int tam) {
String s = "";
for (int i = 0; i < tam; i++) {
s = s + arrChar[i];
}
return s;
}