LWIP STM32CubeF7 для связи с TCP ethernet с приложением класса подключения URL-адреса Java

#java #c #tcp #stm32 #urlconnection

#java #c #tcp #stm32 #urlconnection

Вопрос:

Я пытаюсь создать Java-приложение, которое считывает данные сервера с использованием TCP. Сервер представляет собой плату SOC STM32F4DISCOVERY от STM32. В качестве примера я использую пример приложения LwIP_HTTP_Server_Netconn_RTOS.

Вот важная часть кода LWIP, которая обрабатывает запросы GET. Сервер хорошо работает в браузере.

 /* Put the connection into LISTEN state */
netconn_listen(conn);

while(1) 
{
  /* accept any icoming connection */
  accept_err = netconn_accept(conn, amp;newconn);
  if(accept_err == ERR_OK)
  {
    /* serve connection */
    http_server_serve(newconn);
    /* delete connection */
    netconn_delete(newconn);
  }
}


static void http_server_serve(struct netconn *conn) 
{
  .
  .
  
  
  if ((buflen >=5) amp;amp; (strncmp(buf, "GET /", 5) == 0))
  {
                if (strncmp((char const *)buf,"GET /STM32F7xx",27)==0)
            {
              fs_open(amp;file, "/STM32F7xx.html");
              netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
              fs_close(amp;file);
            }
      ... other if stats to handle other /routes
      
      else if (strncmp(buf, "GET /test", 9) == 0)
            {
              DynWebPage2(conn);
            }
   }
   
void DynWebPage2(struct netconn *conn)
{
  portCHAR PAGE_BODY[512];
  portCHAR PAGE_BEGIN[512];
  portCHAR pagehits[10] = {0};

  memset(PAGE_BODY, 0,512);
  memset(PAGE_BEGIN, 0,512);

  /* Update the hit count */
  nPageHits  ;
  sprintf(pagehits, "%d", (int)nPageHits);
  strcat(PAGE_BODY, "helloworld");
  strcat((char *)PAGE_BEGIN, "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
  strcat((char *)PAGE_BEGIN, "<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">");

  /* Send the dynamically generated page */
  netconn_write(conn, PAGE_BEGIN, strlen((char*)PAGE_BEGIN), NETCONN_COPY);
  netconn_write(conn, PAGE_BODY, strlen(PAGE_BODY), NETCONN_COPY);
} 

Вот часть приложения Java, которую я использую для выполнения запросов GET.

     try {
          url = new URL("http://192.168.0.26/test");
          con = (HttpURLConnection) url.openConnection();
          con.setConnectTimeout(30000);
          con.setRequestMethod("GET");
          con.setDoOutput(true);
          int status = con.getResponseCode();
          InputStreamReader streamReader;   
          System.out.println(status);
          if (status > 299) {
                streamReader = new InputStreamReader(con.getErrorStream());
          } else {
                BufferedReader in;
                streamReader = new InputStreamReader(con.getInputStream());
                in = new BufferedReader(streamReader);
                String inputLine;
                StringBuffer content = new StringBuffer();
                content.append("test");
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                System.out.println(content);
                in.close();
          }
          con.disconnect();
        } catch (Exception ex) {
          ex.printStackTrace();                                                                                                                                                                                                                                                                                                                                                                                                                        
        }
    } 

IP-адрес платы — 192.168.0.26. Когда я задаю код для выполнения запроса GET на «http://192.168.0.26/STM32F7xx «. Он работает так же, как браузеры, и HTML-файл печатается в консоли приложения Java. если я переключу его на «/ test». Браузер показывает значение переменной pageHits, а сервер stm32 увеличивает переменную каждый раз, когда выполняется запрос. Однако, когда я делаю «/ test» в приложении Java. Я получаю эту ошибку.

 java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:715)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
at dataconverter.Reader.getConnection(Reader.java.260) 

I used Wireshark to analyze the packet for the /test and /STM32F7xx between the browser and Java requesT for each route.

/STM32F7xx from browser

 Hypertext Transfer Protocol
GET /STM32F7xx.html HTTP/1.1rn
Host: 192.168.0.26rn
Connection: keep-alivern
Cache-Control: max-age=0rn
Upgrade-Insecure-Requests: 1rn
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36rn
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9rn
Accept-Encoding: gzip, deflatern
Accept-Language: en-US,en;q=0.9rn
rn
[Full request URI: http://192.168.0.26/STM32F7xx.html]
[HTTP request 1/1]
[Response in frame: 124] 

/STM32F7xx из Java-приложения

 Hypertext Transfer Protocol
GET /STM32F7xx.html HTTP/1.1rn
User-Agent: Java/1.8.0_271rn
Host: 192.168.0.26rn
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2rn
Connection: keep-alivern
rn
[Full request URI: http://192.168.0.26/STM32F7xx.html]
[HTTP request 1/1]
[Response in frame: 37915] 

/ тест из браузера

 Hypertext Transfer Protocol
GET /test HTTP/1.1rn
Host: 192.168.0.26rn
Connection: keep-alivern
Cache-Control: max-age=0rn
Upgrade-Insecure-Requests: 1rn
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36rn
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9rn
Accept-Encoding: gzip, deflatern
Accept-Language: en-US,en;q=0.9rn
rn
[Full request URI: http://192.168.0.26/test]
[HTTP request 1/1] 

/ тест из приложения Java

 Hypertext Transfer Protocol
GET /test HTTP/1.1rn
User-Agent: Java/1.8.0_271rn
Host: 192.168.0.26rn
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2rn
Connection: keep-alivern
rn
[Full request URI: http://192.168.0.26/test]
[HTTP request 1/1] 

Комментарии:

1. Я попытался запустить фрагменты javascript. Они потерпели неудачу.

2. @user4581301 Фрагменты не предназначены для запуска в одиночку. Они являются лишь существенной частью кода, касающегося проблемы, с которой я столкнулся.

3. Возможно strlen(PAGE_BODY) , это должно быть strlen((char*)PAGE_BODY) в последней строке первого фрагмента. Можете ли вы указать буфер необработанных данных в wireshark при тестировании «/ test из Java-приложения»?

4. 0000 02 00 00 00 00 00 00 14 7d da bb af 2d 08 00 45 00 …….}…-.. E. 0010 00 c4 00 00 40 00 40 06 b8 b0 c0 a8 00 19 c0 a8 ….@.@……… 0020 00 1a ca 2c 00 50 17 0a cc 1d 00 00 39 8b 50 18 …,…….9.Стр. 0030 ff ff 2d 3a 00 00 47 45 54 20 2f 74 65 73 74 20 ..-:..ПОЛУЧИТЬ / проверить 0040 48 5454 50 2f 31 2e 31 0d 0a 55 73 65 72 2d 41 HTTP/1.1..User-A 0050 67 65 6e 74 3a 20 4a 61 76 61 2f 31 2e 38 2e 30 gent: Java / 1.8.0 0060 5f 32 37 31 0d 0a 48 6f 73 74 3a 20 31 39 32 2e_271 ..Хост: 192. 0070 31 36 38 2e 30 2e 32 36 0d 0a 41 63 63 65 70 74 168.0.26 ..Принять

5. 0080 3a 20 74 65 78 74 2f 68 74 6d 6c 2c 20 69 6d 61: текст / html, ima 0090 67 65 2f 67 69 66 2c 20 69 6d 61 67 65 2f 6a 70 ge/gif, image /jp 00a0 65 67 2c 20 2a 3b 20 71 3d 2e 32 2c20 2a 2f 2a, например, ; q = .2, */ 00b0 3b 20 71 3d 2e 32 0d 0a 43 6f 6e 6e 65 63 74 69; q= .2..Connecti 00c0 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 0d 0a вкл.: поддерживать работоспособность.. 00d0 0d 0a ..i