Добрый. Возможно я не первый, и не последний. Я достаточно не плохо знаю JS но с++ не знаю от слова совсем. 2й день в 100 строчках кода извели меня полностью. Прошу Вашего совета или решения.
В общем есть ESP8266. Надо подружить его с WIFI и Websocket. Необходим для передачи информации от автоматов( кнопок ) на комп по WebSocket.
Подружить - я подружил. Один файл .ino. К вайфаю коннектится, данные пересылает.
Сделал реализацию класса кнопки. По кнопке отрабатывает писанину в Сериал.
До сих пор не пойму зачем мне создавать класс в отдельном файле ( .h ), а Реализацию в .cpp Но скетч компилироваться без этого не хотел.
Встал вопрос о передаче информации по WebSocket. Но я никак не могду получить доступ к уже проинициализированному экземпляру класса WEBSOCKET.
Подскажите, как мне из класса Кнопки получить доступ к экземпляру класса WEBSOCKET? Даже если я его передаю как параметр при инициализации класса кнопки, объект вебсокета в объекте кнопки является пустым.
Пытался сделать SocketIO глобальным - тоже не получилось. Прошу помощи.
Ниже выкладываю свое извращение.
==WS TEST==
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ArduinoJson.h>
#include <WebSocketsClient.h>
#include <SocketIOclient.h>
#include <Hash.h>
#include <D:\INSTALL\NodeMCU\ws_test_2\btn.h>
ESP8266WiFiMulti WiFiMulti;
SocketIOclient socketIO;
#define USE_SERIAL Serial
/// КУЧА ХЛАМА ... ОН НЕ НУЖЕН ///
unsigned long messageTimestamp = 0;
boolean wifiLedStatus = false;
void setup() {
USE_SERIAL.begin( 9600 );
USE_SERIAL.setDebugOutput( true );
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
// disable AP
if ( WiFi.getMode() & WIFI_AP ) { WiFi.softAPdisconnect(true); }
WiFiMulti.addAP("blablabla", "NODE.jsIsTheBest");
while( WiFiMulti.run() != WL_CONNECTED ) { delay(100); }
String ip = WiFi.localIP().toString();
USE_SERIAL.printf( "[SETUP] WiFi Connected %s\n", ip.c_str() );
socketIO.begin( "192.168.88.2", 3089, "/esp/?EIO=4" );
socketIO.onEvent( socketIOEvent );
USE_SERIAL.print( "SocketIO is connected:" );
USE_SERIAL.print( socketIO.isConnected() );
}
btn inletPumpButton( 5, "INLET_PUMP", socketIO );
void loop() {
socketIO.loop();
uint64_t now = millis();
if ( now - messageTimestamp > 2000 ) {
messageTimestamp = now;
inletPumpButton.sendEvent( "hi", "there" );
}
}
=== btn.h ===
#include "WString.h"
#ifndef btn_h
#define btn_h
#include "Arduino.h"
#include <ArduinoJson.h>
#include <WebSocketsClient.h>
#include <SocketIOclient.h>
class btn {
public:
btn( int pin, String name, SocketIOclient socketIO );
// btn( int pin, String name );
int getPin();
String getName();
void sendEvent( String event_p, String state_p );
private:
int _pin;
String _name;
JsonArray _signal;
JsonObject _payload;
JsonDocument _buttonEvent;
String _JSON;
SocketIOclient _socketIO;
};
#endif
=== btn.cpp ===
// LED.cpp
#include "btn.h"
#include <ArduinoJson.h>
btn::btn( int pin, String name, SocketIOclient socketIO ) {
// btn::btn( int pin, String name ) {
_pin = pin;
_name = name;
_signal = _buttonEvent.to<JsonArray>();
_signal.add( "button" );
_payload = _signal.add<JsonObject>();
_socketIO = socketIO;
}
int btn::getPin() {
return _pin;
}
String btn::getName() {
return _name;
}
void btn::sendEvent( String event_p, String state_p ) {
_payload[ "time" ] = millis();
serializeJson( _buttonEvent, _JSON );
_socketIO.sendEVENT( _JSON );
Serial.print( _socketIO.isConnected() );
Serial.print( " :: " );
Serial.print( _JSON );
Serial.print( " :: " );
Serial.print( event_p );
Serial.print( " :: " );
Serial.println( state_p );
}