287 lines
6.4 KiB
C++
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 |