2021-04-03 06:54:10 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "configuration.h"
|
|
|
|
|
2021-04-03 14:27:06 +00:00
|
|
|
#include "concurrency/OSThread.h"
|
2021-04-04 01:20:37 +00:00
|
|
|
#include "mesh/Channels.h"
|
2022-12-16 19:28:28 +00:00
|
|
|
#include "mesh/generated/mqtt.pb.h"
|
2021-04-03 06:54:10 +00:00
|
|
|
#include <PubSubClient.h>
|
2022-10-25 22:07:02 +00:00
|
|
|
#if HAS_WIFI
|
2021-04-03 06:54:10 +00:00
|
|
|
#include <WiFiClient.h>
|
2022-10-25 22:07:02 +00:00
|
|
|
#endif
|
|
|
|
#if HAS_ETHERNET
|
|
|
|
#include <EthernetClient.h>
|
|
|
|
#endif
|
2021-04-03 06:54:10 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Our wrapper/singleton for sending/receiving MQTT "udp" packets. This object isolates the MQTT protocol implementation from
|
|
|
|
* the two components that use it: MQTTPlugin and MQTTSimInterface.
|
|
|
|
*/
|
2021-04-03 14:27:06 +00:00
|
|
|
class MQTT : private concurrency::OSThread
|
2021-04-03 06:54:10 +00:00
|
|
|
{
|
|
|
|
// supposedly the current version is busted:
|
|
|
|
// http://www.iotsharing.com/2017/08/how-to-use-esp32-mqtts-with-mqtts-mosquitto-broker-tls-ssl.html
|
|
|
|
// WiFiClientSecure wifiClient;
|
2022-10-25 22:07:02 +00:00
|
|
|
#if HAS_WIFI
|
2021-04-03 06:54:10 +00:00
|
|
|
WiFiClient mqttClient;
|
2022-10-25 22:07:02 +00:00
|
|
|
#endif
|
|
|
|
#if HAS_ETHERNET
|
|
|
|
EthernetClient mqttClient;
|
|
|
|
#endif
|
2021-04-03 06:54:10 +00:00
|
|
|
PubSubClient pubSub;
|
|
|
|
|
2021-08-03 04:34:14 +00:00
|
|
|
// instead we supress sleep from our runOnce() callback
|
|
|
|
// CallbackObserver<MQTT, void *> preflightSleepObserver = CallbackObserver<MQTT, void *>(this, &MQTT::preflightSleepCb);
|
2021-08-03 00:42:44 +00:00
|
|
|
|
2021-04-03 06:54:10 +00:00
|
|
|
public:
|
|
|
|
MQTT();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Publish a packet on the glboal MQTT server.
|
2021-04-04 01:20:37 +00:00
|
|
|
* This hook must be called **after** the packet is encrypted (including the channel being changed to a hash).
|
|
|
|
* @param chIndex the index of the channel for this message
|
|
|
|
*
|
|
|
|
* Note: for messages we are forwarding on the mesh that we can't find the channel for (because we don't have the keys), we
|
|
|
|
* can not forward those messages to the cloud - becuase no way to find a global channel ID.
|
2021-04-03 06:54:10 +00:00
|
|
|
*/
|
2021-04-04 01:20:37 +00:00
|
|
|
void onSend(const MeshPacket &mp, ChannelIndex chIndex);
|
2021-04-03 06:54:10 +00:00
|
|
|
|
2021-08-18 02:59:56 +00:00
|
|
|
/** Attempt to connect to server if necessary
|
|
|
|
*/
|
|
|
|
void reconnect();
|
2022-10-26 09:09:59 +00:00
|
|
|
|
|
|
|
bool connected();
|
2021-08-18 02:59:56 +00:00
|
|
|
|
2021-04-03 14:27:06 +00:00
|
|
|
protected:
|
2022-01-24 17:24:40 +00:00
|
|
|
virtual int32_t runOnce() override;
|
2021-04-03 14:27:06 +00:00
|
|
|
|
2021-04-03 06:54:10 +00:00
|
|
|
private:
|
2021-04-04 23:48:46 +00:00
|
|
|
/** return true if we have a channel that wants uplink/downlink
|
|
|
|
*/
|
|
|
|
bool wantsLink() const;
|
|
|
|
|
2021-04-05 00:42:52 +00:00
|
|
|
/** Tell the server what subscriptions we want (based on channels.downlink_enabled)
|
|
|
|
*/
|
|
|
|
void sendSubscriptions();
|
|
|
|
|
|
|
|
/// Just C glue to call onPublish
|
|
|
|
static void mqttCallback(char *topic, byte *payload, unsigned int length);
|
|
|
|
|
|
|
|
/// Called when a new publish arrives from the MQTT server
|
|
|
|
void onPublish(char *topic, byte *payload, unsigned int length);
|
2021-08-03 00:42:44 +00:00
|
|
|
|
2022-03-12 14:08:57 +00:00
|
|
|
/// Called when a new publish arrives from the MQTT server
|
2022-10-18 19:51:40 +00:00
|
|
|
std::string downstreamPacketToJson(MeshPacket *mp);
|
2022-03-12 14:08:57 +00:00
|
|
|
|
2021-08-03 00:42:44 +00:00
|
|
|
/// Return 0 if sleep is okay, veto sleep if we are connected to pubsub server
|
2021-08-03 04:34:14 +00:00
|
|
|
// int preflightSleepCb(void *unused = NULL) { return pubSub.connected() ? 1 : 0; }
|
2021-04-03 06:54:10 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void mqttInit();
|
|
|
|
|
|
|
|
extern MQTT *mqtt;
|