Selaa lähdekoodia

handle heartbeats

Chris Mullins 8 vuotta sitten
vanhempi
commit
4753b16c46
2 muutettua tiedostoa jossa 19 lisäystä ja 1 poistoa
  1. 17 1
      lib/Udp/V6MiLightUdpServer.cpp
  2. 2 0
      lib/Udp/V6MiLightUdpServer.h

+ 17 - 1
lib/Udp/V6MiLightUdpServer.cpp

@@ -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];

+ 2 - 0
lib/Udp/V6MiLightUdpServer.h

@@ -62,6 +62,7 @@ protected:
   static uint8_t COMMAND_RESPONSE[];
   static uint8_t SEARCH_COMMAND[];
   static uint8_t LOCAL_SEARCH_COMMAND[];
+  static uint8_t HEARTBEAT_HEADER[];
   
   V6Session* firstSession;
   size_t numSessions;
@@ -71,6 +72,7 @@ protected:
   void sendResponse(uint16_t sessionId, uint8_t* responseBuffer, size_t responseSize);
   
   void handleStartSession();
+  void handleHeartbeat(uint16_t sessionId);
   void handleCommand(
     uint16_t sessionId,
     uint8_t sequenceNum,