[英]Arduino (c++), How to read bytes from Sockets (WiFiClient)?
java 中的服務器從服務器套接字發送一個字節數組,該字節數組包含文本(utf-8),格式如下:
所以我使用“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(客戶端)代碼接收和解釋字節數組(此代碼的目的是將字節轉換為字符串):
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;
}
像這樣排除故障有點困難,你真的收到數據了嗎? 你能展示你得到的output嗎? 也許你甚至沒有連接。
此外,我過去所做的是將每個 int 或“字母”轉換為 char。 由於我通常發送一條帶有起始字符的已知長度的消息,因此我讀取消息的每個字節並將其轉換為字符,然后將其添加到我收到的消息字符串中。 我不知道這是否有幫助...基本上我在字節到達時進行轉換。
我修復了它,我從套接字讀取的方式、將 4 個字節轉換為 Int 數據類型的方式以及將字節轉換為字符串的方式有問題,我弄清楚為什么我沒有收到所有字節嘗試從套接字讀取時,原因是當我調用方法“client.read()”時,服務器發送信息的速度不夠快,因此它沒有讀取任何內容,所以我做了一個循環並在方法“client.available()”我檢查了有一個字節可以讀取,所以當前4個字節被讀取時循環結束。 然后我將讀取的4個字節轉換為Int,以與之前類似的方式讀取字節的rest,並將字節轉換為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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.