// пример работы через MQTT через PubSubClient // работа с PubSubClient взята из примера mqtt_esp8266.ino #include #define AP_SSID "Alex" #define AP_PASS "alexpass" // отключаем встроенную реализацию MQTT (для esp) #define GH_NO_MQTT #include GyverHub hub; // MQTT #include #include class HubMQTT : public gh::Bridge { public: HubMQTT(void* hub) : gh::Bridge(hub, gh::Connection::MQTT, GyverHub::parseHook), mqtt(espClient) {} 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: WiFiClient espClient; 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); WiFi.mode(WIFI_STA); WiFi.begin(AP_SSID, AP_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println(WiFi.localIP()); hub.config(F("MyDevices"), F("ESP"), F("")); hub.onBuild(build); hub.addBridge(&mqtt); hub.begin(); } void loop() { hub.tick(); }