|
|
@@ -20,6 +20,10 @@ uint8_t V6MiLightUdpServer::COMMAND_HEADER[] = {
|
|
|
0x80, 0x00, 0x00, 0x00
|
|
|
};
|
|
|
|
|
|
+uint8_t V6MiLightUdpServer::HEARTBEAT_HEADER[] = {
|
|
|
+ 0xD0, 0x00, 0x00, 0x00, 0x02
|
|
|
+};
|
|
|
+
|
|
|
uint8_t V6MiLightUdpServer::COMMAND_RESPONSE[] = {
|
|
|
0x88, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0x00
|
|
|
};
|
|
|
@@ -209,11 +213,23 @@ void V6MiLightUdpServer::handleCommand(
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+void V6MiLightUdpServer::handleHeartbeat(uint16_t sessionId) {
|
|
|
+ char header[] = { 0xD0, 0x00, 0x00, 0x00, 0x07 };
|
|
|
+ memcpy(responseBuffer, header, size(header));
|
|
|
+ WiFi.macAddress(responseBuffer+5);
|
|
|
+ responseBuffer[11] = 0;
|
|
|
+
|
|
|
+ sendResponse(sessionId, responseBuffer, 12);
|
|
|
+}
|
|
|
+
|
|
|
void V6MiLightUdpServer::handlePacket(uint8_t* packet, size_t packetSize) {
|
|
|
printf("Packet size: %d\n", packetSize);
|
|
|
|
|
|
- if (packetSize == size(START_SESSION_COMMAND) && memcmp(START_SESSION_COMMAND, packet, packetSize) == 0) {
|
|
|
+ if (packetSize >= size(START_SESSION_COMMAND) && memcmp(START_SESSION_COMMAND, packet, size(START_SESSION_COMMAND)) == 0) {
|
|
|
handleStartSession();
|
|
|
+ } else if (packetSize >= size(HEARTBEAT_HEADER) && memcmp(HEARTBEAT_HEADER, packet, size(HEARTBEAT_HEADER)) == 0) {
|
|
|
+ uint16_t sessionId = readInt<uint16_t>(packet+5);
|
|
|
+ handleHeartbeat(sessionId);
|
|
|
} else if (packetSize == 22 && memcmp(COMMAND_HEADER, packet, size(COMMAND_HEADER)) == 0) {
|
|
|
uint16_t sessionId = readInt<uint16_t>(packet+5);
|
|
|
uint8_t sequenceNum = packet[8];
|