esp32_ethernet_milight_hub/lib/Udp/V6MiLightUdpServer.h
2021-01-15 22:49:01 +01:00

89 lines
2.1 KiB
C++

// This protocol is documented here:
// http://www.limitlessled.com/dev/
#include <Arduino.h>
#include <MiLightClient.h>
#include <WiFiUdp.h>
#include <MiLightUdpServer.h>
#include <V6CommandHandler.h>
#define V6_COMMAND_LEN 8
#define V6_MAX_SESSIONS 10
#ifndef _V6_MILIGHT_UDP_SERVER
#define _V6_MILIGHT_UDP_SERVER
struct V6Session {
V6Session(IPAddress ipAddr, uint16_t port, uint16_t sessionId)
: ipAddr(ipAddr),
port(port),
sessionId(sessionId),
next(NULL)
{ }
IPAddress ipAddr;
uint16_t port;
uint16_t sessionId;
V6Session* next;
};
class V6MiLightUdpServer : public MiLightUdpServer {
public:
V6MiLightUdpServer(MiLightClient*& client, uint16_t port, uint16_t deviceId)
: MiLightUdpServer(client, port, deviceId),
sessionId(0),
numSessions(0),
firstSession(NULL)
{ }
~V6MiLightUdpServer();
// Should return size of the response packet
virtual void handlePacket(uint8_t* packet, size_t packetSize);
template <typename T>
static T readInt(uint8_t* packet);
template <typename T>
static uint8_t* writeInt(const T& value, uint8_t* packet);
protected:
static V6CommandDemuxer COMMAND_DEMUXER;
static uint8_t START_SESSION_COMMAND[];
static uint8_t START_SESSION_RESPONSE[];
static uint8_t COMMAND_HEADER[];
static uint8_t COMMAND_RESPONSE[];
static uint8_t LOCAL_SEARCH_COMMAND[];
static uint8_t HEARTBEAT_HEADER[];
static uint8_t HEARTBEAT_HEADER2[];
static uint8_t SEARCH_COMMAND[];
static uint8_t SEARCH_RESPONSE[];
static uint8_t OPEN_COMMAND_RESPONSE[];
uint16_t sessionId;
size_t numSessions;
V6Session* firstSession;
uint16_t beginSession();
bool sendResponse(uint16_t sessionId, uint8_t* responseBuffer, size_t responseSize);
bool matchesPacket(uint8_t* packet1, size_t packet1Len, uint8_t* packet2, size_t packet2Len);
void writeMacAddr(uint8_t* packet);
void handleSearch();
void handleStartSession();
bool handleOpenCommand(uint16_t sessionId);
void handleHeartbeat(uint16_t sessionId);
void handleCommand(
uint16_t sessionId,
uint8_t sequenceNum,
uint8_t* cmd,
uint8_t group,
uint8_t checksum
);
};
#endif