簡體   English   中英

Arduino (c++), 如何從 Sockets (WiFiClient) 讀取字節?

[英]Arduino (c++), How to read bytes from Sockets (WiFiClient)?

java 中的服務器從服務器套接字發送一個字節數組,該字節數組包含文本(utf-8),格式如下:

  1. 前 4 個字節:一個帶有文本字節數的 int
  2. 接下來的 n 個字節:每個字節代表一個字符。

所以我使用“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM