gilmaimon / ArduinoWebsockets

A library for writing modern websockets applications with Arduino (ESP8266 and ESP32)
GNU General Public License v3.0
463 stars 98 forks source link

How to use HttpClient in conjunction with WebSocketClient? #111

Open SunboX opened 3 years ago

SunboX commented 3 years ago

Hi,

I'm using a Wemos D1 Mini (ESP8266) and I want to access the Slack RTM API.

So I first need to do a Http GET request against https://slack.com/api/rtm.connect with an Authentication (Bearer) header. From that I'm getting the wss:// endpoint I have to connect to.

I. already saw the Secure Example, but I don't know how to do the HTTP GET request first and than free up the connection for the WebSocket Client.

Do you have a small example?

gilmaimon commented 3 years ago

Can you just do a GET request, parse the result and then, once you have the endpoint, create a new websocket connection?

Regarding how to do GET requests on an esp8266, try googling "esp8266 http example" or something like that... There are many options :)

Gil

gb-123-git commented 2 years ago

I dont think both can be used concurrently. One connection has to be closed and then re-opened. Is there any way to make this work concurrently (on different ports) ? i.e. internally it can create 2 ssl certificates and use different certificates for different connections ?

tbabik commented 2 years ago

I think I'm running into the same issue.

My code is doing a HTTP POST first, using the ESP8266HTTPClient library, afterwards I want to connect to a WebSocket Server via ArduinoWebsockets. The HTTP POST is working fine, the WebSocket does not connect. When I comment the addDevices the WebSocktClient connects fine.

These are the relevant parts I believe. addDevices() is called first, doing the HTTP POST, aftewards websocket.connect(...) is initiated. After this first HTTP POST I don't need the HTTPClient any longer, but apparently a http.end() is not sufficient to close and free the connection.

What am I missing?

Thank You

Part of Setup()

// Backend will prevent duplication - safe to send everytime
addDevices();

websocket.onMessage(onMessageCallback);
websocket.onEvent(onEventsCallback);

websocket.addHeader("Authorization", authHeader);
websocket.connect(getWebsocketConnStr());

Function addDevices()

void addDevices() {
  client.setInsecure(); //disable certificate check
  http.begin(client, config.endpoint);
  http.addHeader("Authorization", authHeader);
  http.addHeader("Content-Type", "application/json");
  int res = http.POST(CONFIG::devices);
  http.end();

  DEBUG_SERIAL.print("Add Devices Return Code and Payload: ");
  DEBUG_SERIAL.println(res);
  DEBUG_SERIAL.println(http.getString());
}

Update: Adding a "client.stop()" after the "http.end()" in the addDevices() made it working now. At least for my use-case. But, I found this rather by trial & error, I don't understand the reason. Not sure if someone could provide an explanation for it?