HCesp/WiFiHost.h
2026-04-14 05:11:09 +09:00

287 lines
6.4 KiB
C++

#ifndef __WIFI_HOST_H
#define __WIFI_HOST_H
#include "HermitCrab.h"
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <WiFiUdp.h>
#define UDP_PORT 4949
#define SERVER_PORT 3939
#define UDP_EXTERNAL_PORT (UDP_PORT + 1)
#define TCP_EXTERNAL_PORT (SERVER_PORT + 1)
#define CONNECT_TIMEOUT_MS 5000
enum UDP_MESSAGE {
MESSAGE_HEARTBEAT,
MESSAGE_IP,
MESSAGE_NOTFOUND,
MESSAGE_CONFIG_SAVE,
MESSAGE_CONFIG_SEND,
MESSAGE_AP,
MESSAGE_QUERY_IP,
MESSAGE_UPDATE_STATUS,
MESSAGE_UPDATE_CONFIG,
MESSAGE_COUNT,
MESSAGE_RESET = UDP_EXTERNAL_PORT,
};
enum OPCODE_TYPE {
OP_RECV_ONLY,
OP_RECV_SAVE,
};
enum OPERATION_MODE {
MODE_WAITING,
MODE_PACKET,
MODE_SEND,
MODE_RECV,
MODE_EXTERNAL_SERVER
};
enum ENUM_COMMAND
{
// Command
CMD_HEARTBEAT = 1, // 1 HeartBeat - prevents disconnect from the host
// Connection
CMD_HELLO = 101, // 0 Hello
CMD_DROP_CONNECTION,
CMD_RESET_REASON,
// Device Command
CMD_SAVE_RESTART = 201,
CMD_RESET_RESTART,
CMD_SEND_HISTORY,
CMD_PAUSE,
CMD_RESUME,
CMD_RESET_SENSOR,
CMD_RESET_DISPLAY,
// OTA Update
CMD_UPDATE_CHECK = 301,
CMD_UPDATE_AVAILABLE,
CMD_UPDATE_FORCED,
// Config
CMD_INIT_CONFIG = 1201,
CMD_LOAD_CONFIG,
CMD_SAVE_CONFIG,
CMD_SEND_CONFIG,
CMD_RECV_CONFIG,
CMD_SEND_CONFIG_SERVER,
CMD_LOAD_CONFIG_SERVER,
// PID
CMD_INIT_PID_PARAM = 1301,
CMD_LOAD_PID_PARAM,
CMD_SAVE_PID_PARAM,
CMD_SET_PID,
CMD_GET_PID,
// Control
CMD_SET_CONTROL = 1401,
CMD_GET_CONTROL,
// Operation
CMD_SET_TEMP_TARGET = 1501,
CMD_SET_TEMP_TARGET_NIGHT,
CMD_SET_HUMID_TARGET,
CMD_SET_SENSOR_OFFSET,
CMD_SET_AC1_PARAM,
CMD_SET_AC2_PARAM,
CMD_SET_MIST_PARAM,
CMD_SET_FAN_PARAM,
CMD_SET_MOTOR_PARAM,
CMD_SET_LIGHT_PARAM,
// Status
CMD_SET_HEATER1_DUTY = 2101,
CMD_SET_HEATER2_DUTY,
CMD_SET_MIST_DUTY,
CMD_SET_FAN_DUTY,
CMD_SET_FAN_DUTY_AUTO,
CMD_SET_MOTOR_DUTY,
CMD_SET_MOTOR_DUTY_AUTO,
CMD_SET_LIGHT_DUTY,
// Manual Operations
CMD_SET_MANUAL_HEATER1 = 2201,
CMD_SET_MANUAL_HEATER2,
CMD_SET_MANUAL_MIST,
CMD_SET_MANUAL_FAN,
CMD_SET_MANUAL_MOTOR,
CMD_SET_MANUAL_LIGHT,
// Time
CMD_SET_TIME_HEATER1 = 2301,
CMD_SET_TIME_HEATER2,
CMD_SET_TIME_MIST,
CMD_SET_TIME_FAN,
CMD_SET_TIME_MOTOR,
CMD_SET_TIME_LIGHT,
CMD_SET_TIME_NIGHT,
// UI
CMD_SET_WIFI_CLIENT_DISPLAY = 2401, // Graph TempHigh, TempLow, TimeScale etc.
CMD_SET_OLED_CONTRAST,
CMD_SET_OLED_DISPLAY_CHECKAC,
// Debugging
CMD_HELLO_DEBUG = 9101,
CMD_SHOW_CODE,
COMPUTE_TIME_MAX,
CMD_INVALID = 9999
};
#pragma pack(push) /* push current alignment to stack */
#pragma pack(1) /* set alignment to 1 byte boundary */
// TCP Packet
typedef struct TCP_PACKET_STRUCT
{
uint16_t sig1;
uint16_t len;
uint16_t cmd;
uint16_t op; // 8
uint32_t time; // 4 : 12
union {
char ch[40];
uint8_t by[40];
int16_t n16[20];
uint16_t u16[20];
int32_t n32[10];
uint32_t u32[10];
float f[10];
STATUS_TYPE status;
DEVICE_PARAM_TYPE device;
}; //40 : 52
uint16_t sig2; // 2 : 54
} TCP_PACKET;
// UDP Packet
typedef struct UDP_PACKET_STRUCT
{
uint16_t sig1;
uint16_t m_nSize;
uint16_t m_nMessage;
uint16_t m_nDeviceType;
uint16_t m_nResetReason;
// 10
uint32_t m_nChipID;
uint32_t m_nDeviceID;
// 18
union {
uint32_t m_nVersion;
uint32_t clock;
};
// 22
union {
uint32_t dwIPAddress;
uint8_t byIPAddress[4];
};
// 26
uint16_t m_nPort;
// 28
uint8_t m_MACAddress[20];
// 48
char m_sDeviceName[32];
// 80
union {
char m_sService[32];
STATUS_TYPE status; //
};
// 112
char m_sCompanyName[32];
// 144
uint16_t sig2;
// Size: 146
} UDP_PACKET;
typedef struct {
UDP_PACKET udp;
CONFIG_TYPE con;
} UDP_CONFIG_TYPE;
#pragma pack(pop) /* restore original alignment from stack */
class CWiFiHost
{
public:
void Setup();
void Stop();
void Loop(unsigned long clock);
inline bool isConnected() { return m_bClientConnected; }
void CloseConnection();
void SendHeartBeat(unsigned long clock);
void MonitorUDP();
//inline void setPublicIPPort(uint32_t ip, uint16_t port) { m_dwPublicIP = ip; m_nPublicPort = port; }
private:
//void setupUDP();
//void loopUDP(unsigned long clock);
//bool checkOTA(bool bForceUpdate);
void CheckClient(unsigned long clock);
void ProcessPacket(TCP_PACKET& pkt);
void SendHeartBeat();
int SendConfig();
//void FillPacket();
private:
int SendPacket(TCP_PACKET& pkt);
size_t SendData(const uint8_t* data, size_t size);
bool SendData(unsigned long clockMills);
size_t ReceiveData(uint8_t* data, size_t size);
bool ReceiveData(unsigned long clockMills);
void Restart();
// Data Send/Receive Mode
char *m_pDataSend_data;
size_t m_nDataSend_size;
size_t m_nDataSend_sent;
char *m_pDataReceive_data;
size_t m_nDataReceive_size;
size_t m_nDataReceive_received;
bool m_bReceiveConfigPending;
bool m_bSendHistoryPending;
int16_t m_nPendingHistoryCount;
// SocketConnection
IPAddress externalServerIP;
//int sockfd = -1;
//unsigned long connectStartTime = 0;
//bool isConnecting = false;
//bool initiateConnection(unsigned long clock);
//bool checkConnection(unsigned long clock);
// Operation
uint8_t m_nMode;
bool m_bHelloSent;
unsigned long m_nLastReceivedTime;
unsigned long m_nLastHeartBeatSentTime;
unsigned long m_nLastUDPBroadcastTime;
volatile bool m_bClientConnected;
//uint32_t m_dwPublicIP;
//uint16_t m_nPublicPort;
// Send Status to VisionSoft HeartBeat service
IPAddress m_cExternalServerIPAddress;
WiFiUDP udpLocal, udpExternal;
WiFiServer wifiServer; //, wifiExternal;
WiFiClient wifiClient;
UDP_PACKET packetUDP;
TCP_PACKET hostPacket;
TCP_PACKET clientPacket;
};
extern CWiFiHost host;
#endif