Arduino(c++),如何从Socket(WiFiClient)中读取字节?

问题描述 投票:0回答:1

在java中,一个服务器从Server套接字中发送一个字节数组,这个字节数组包含文本(utf-8),格式如下。

  1. 前4个字节:一个int,表示文本的字节数。
  2. next nbytes: 每一个字节代表一个char.所以我使用的是 "ESP8266WiFi.h "库中的 "WiFiClient"(应该和 "WiFi.h "库一样),WifiClient有一个接收字节的方法。

所以我使用 "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;
}
c++ sockets arduino nodemcu
1个回答
1
投票

这有点难以解决这样的问题,你真的收到数据了吗?你能显示你得到的输出吗?也许你甚至没有连接。

另外,我过去所做的是将每个int或 "字母 "转换成char。因为我通常会发送一个已知长度的消息,开头是一个char,我读取我的消息的每一个字节,并将其转换为char,然后将其添加到我收到的消息字符串中。我不知道这是否有帮助... ... 基本上,我是在字节到达时进行转换的。


0
投票

我解决了这个问题,我从套接字读取的方式有问题,我把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;
}
© www.soinside.com 2019 - 2024. All rights reserved.