#define GH_NO_MQTT // отключить встроенный модуль связи mqtt (для esp)
#include <GyverHub.h>
GyverHub hub;
// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define TINY_GSM_USE_GPRS true
#define TINY_GSM_USE_WIFI false
#define SerialAT Serial1
#include <TinyGsmClient.h>
TinyGsm modem(SerialAT);
#include <PubSubClient.h>
TinyGsmClient gsmClient(modem);
class HubMQTT : public gh::Bridge {
public:
HubMQTT(void* hub) : gh::Bridge(hub, gh::Connection::MQTT, GyverHub::parseHook), mqtt(gsmClient){}
void begin() {
mqtt.setServer("test.mosquitto.org", 1883);
mqtt.setCallback([this](char* topic, uint8_t* data, uint16_t len) {
uint16_t tlen = strlen(topic);
char topic_buf[tlen + 1];
memcpy(topic_buf, topic, tlen);
topic_buf[tlen] = 0;
char data_buf[len + 1];
memcpy(data_buf, data, len);
data_buf[len] = 0;
parse(sutil::AnyText(topic_buf, tlen), sutil::AnyText(data_buf, len));
});
}
void end() {
mqtt.disconnect();
}
void tick() {
if (!mqtt.connected()) reconnect();
mqtt.loop();
}
void send(gh::BridgeData& data) {
if (!mqtt.connected()) return;
mqtt.beginPublish(data.topic.c_str(), data.text.length(), 0);
mqtt.print(data.text);
mqtt.endPublish();
}
private:
PubSubClient mqtt;
void reconnect() {
while (!mqtt.connected()) {
String clientId = "hub-";
clientId += String(random(0xffff), HEX);
if (mqtt.connect(clientId.c_str())) {
Serial.println("connected");
mqtt.subscribe(hub.topicDiscover().c_str());
mqtt.subscribe(hub.topicHub().c_str());
} else {
delay(1000);
}
}
}
};
HubMQTT mqtt(&hub);
// билдер
void build(gh::Builder& b) {
static int val;
b.Title(F("Hello!"));
b.Slider(&val);
}
void setup()
{
Serial.begin(115200);
// Инициализацию SIM800 тут пропущу... Тут все норм
// .....
hub.config(F("MyDevices"), F("ESP"), F(""));
hub.onBuild(build);
hub.addBridge(&mqtt);
hub.begin();
}
void loop()
{
hub.tick();
}