arduino-mqtt icon indicating copy to clipboard operation
arduino-mqtt copied to clipboard

Websockets support

Open PeeJay opened this issue 2 years ago • 3 comments

There is another library based on this one (https://github.com/hideakitai/MQTTPubSubClient) that has websockets support, but I prefer using this library so I have ported over the websockets part.

https://github.com/PeeJay/arduino-mqtt/tree/websockets

At the moment I have used the same #define WEBSOCKETS approach to enable it, but I'm sure there is a better way if I thought about it like some sort of abstract class. If this is something you are interested in I can keep working on it.

PeeJay avatar Apr 26 '23 03:04 PeeJay

Hi, I'm just trying to find an arduino library managing mqtt over websockets as my broker is set like that.

I already tried the hideakitai lib and yours but I can't connect to the broker on port 443. I'm stuck in the loop attempting connection client.connect() and an my debug reveals that this error is thrown : LWMQTT_MISSING_OR_WRONG_PACKET

I'm using M5stack core2. Could you provide a working example with one of the library you mentioned ?

Samtropic avatar Apr 26 '23 14:04 Samtropic

Is it definitely websockets, and not just MQTT over SSL?. This is for an ESP32

#include <Arduino.h>

#include <WiFi.h>
#include <WiFiMulti.h>
#include <WebSocketsClient.h>
#include <MQTT.h>

WebSocketsClient client;
MQTTClient mqtt;
WiFiMulti wiFiMulti;

void connect()
{
	if (wiFiMulti.run() != WL_CONNECTED)
	{
		while (wiFiMulti.run() != WL_CONNECTED)
		{
			delay(500);
			Serial.print(".");
		}

		Serial.print("IP address: ");
		Serial.println(WiFi.localIP());
	}

	// connect to host with MQTT over WebSocket securely
	Serial.print("Connecting to mqtt server as ");
	String devId = "Arduino-" + String(ESP.getEfuseMac() >> 32, HEX);
	Serial.println(devId);
	client.beginSSL("server.com", 443, "/", "", "mqtt");
	while (!client.isConnected())
	{
		client.loop();
		delay(10);
	}

	// initialize mqtt client
	mqtt.connect(devId.c_str(), "username", "password");

	if (mqtt.connected())
	{
		Serial.println("Connected.");
	}
	else
	{
		Serial.println("Fail - retrying in 1 seconds]");
		delay(1000);
	}
}

void setup()
{
	Serial.begin(115200);

	wiFiMulti.addAP("wifiuser", "wifipass");
	mqtt.begin(client);
	connect();
}

void loop()
{
	static unsigned long lastMeasure = 0;
	static unsigned long measureTime = 1000 * 60;

	if ((millis() - lastMeasure) > measureTime)
	{
		lastMeasure = millis();

		// Check WiFi connection status
		if (WiFi.status() != WL_CONNECTED || !mqtt.connected())
		{
			Serial.println("Reconnecting...");
			connect();
		}

		// Send data on last sample
		mqtt.publish("hello/world", "data goes here");
	}

	mqtt.loop();
	delay(10);
}

Which gives the output

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13192
load:0x40080400,len:3028
entry 0x400805e4
Connecting to mqtt server as Arduino-3cab
Fail - retrying in 1 seconds]
Reconnecting...
Connecting to mqtt server as Arduino-3cab
Connected.

I've noticed that both libraries don't always connect on the first go, occasionally it takes a few retries. I'm not sure why.

PeeJay avatar Apr 27 '23 01:04 PeeJay

Thank you very much, I finally managed to connect to my broker but using hideakitai library.

With yours, along with the example you provided, I wasn't able to compile because when invoking mqtt.begin(client) the code behind is waiting for a Client instance and not a WebSocketsClient 's one.

though i'm not sure about my headers management. Anyway you helped me a lot with your example ! And yes me too, the connection is failing at least once before establishing.

Samtropic avatar Apr 27 '23 07:04 Samtropic