Разница между WiFiClient и HttpClient

Прошу прощения, если этот вопрос покажется вам слишком расплывчатым, но я хотел бы знать ключевые различия между этими двумя клиентами.

В то время как WiFiClient поставляется с предварительно загруженной Arduino IDE, HttpClient этого не делает. Кроме того, для отправки HTTP-команд на сервер (XML / JSON), какой из них выбрать?

, 👍4


2 ответа


5

WiFiClient обеспечивает прямое подключение к Интернету через точку доступа Wi-Fi (например, ваш домашний маршрутизатор).

HttpClient обеспечивает соединение с веб-сервером через существующее клиентское соединение, такое как соединение WiFiClient.

Итак, самый простой ответ на ваш вопрос

чтобы отправлять HTTP-команды на сервер (XML / JSON), какой из них выбрать?

это "Использовать и то, и другое".

Вы используете WiFiClient для подключения к Интернету, затем вы используете HttpClient в своем соединении WiFiClient для связи с веб-сайтом. Как указано в readme в репозитории HttpClient на github:

Поскольку он ожидает объект типа Client, вы можете использовать его с любым из сетевых классов, которые являются производными от него. Это означает, что он будет работать с EthernetClient, WiFiClient и GSMClient.

Чтобы более полно понять концепцию, вам сначала нужно разобраться в 7-слойной модели OSI, которая необходима для чтения всем, кто что-либо делает с сетевым программным обеспечением.

,

Можете ли вы сказать мне, почему они не используют HttpClient поверх EthernetClient здесь: https://gist.githubusercontent.com/jamesabruce/8bc9faf3c06e30c3f6fc/raw/11bbfe799a4122035963f8c6ee5cf3dac670ba7f/Control%20Philips%20Hue%20from%20Arduino%20Ether, @Hyperbola

@Hyperbola Потому что вам *не нужно* использовать HttpClient. Вы можете сделать все это самостоятельно вручную, если хотите. HttpClient просто избавляет вас от хлопот., @Majenko

Спасибо @Majenko. У меня также есть вопрос относительно Philips Hue; если бы вы могли посмотреть на это один раз., @Hyperbola

@Hyperbola Я понятия не имею, что такое Philips Hue и как вы с ним общаетесь. Я бы порекомендовал начать с более простого и попытаться отправить запрос GET куда-нибудь вроде Google, прежде чем лезть в неизвестные коробки трюков., @Majenko


1

Как сказал Маенко,

WiFiClient является необработанным в том смысле, что вам приходится самостоятельно разбираться с материалами протокола HTTP, ниже приведен фрагмент необработанного запроса GET

  WiFiClient wc;
  wc.print("GET ");
  wc.print(/xml/device_description.xml);
  wc.println(" HTTP/1.1");
  wc.print("Host: ");
  wc.println(selectedDevice->getIp());
  wc.println("Connection: close");  //automatically close Connection
  wc.println("");

каждая строка завершается символом "\r\n", запрос завершается пустой строкой

Где как HttpClient - это библиотека, которая обрабатывает все материалы протокола HTTP низкого уровня и предоставляет простой интерфейс для отправки HTTP-запроса GET / POST на любое устройство, поддерживающее HTTP

HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type", "text/plain");
int httpResponseCode = http.POST("Hi Sending POST request");
Serial.println(httpResponseCode);
http.end();

Чтобы отправить JSON, измените заголовок на нижеприведенную строку

http.addHeader("Content-Type", "application/json");

Итак, ответ таков: если вы хотите иметь дело с низкоуровневым протоколом HTTP, используйте WiFiClient, в противном случае используйте HttpClient

,