diff --git a/Code/Arduino/HanReader/src/HanReader.cpp b/Code/Arduino/HanReader/src/HanReader.cpp index 02993f11..5cb385b3 100644 --- a/Code/Arduino/HanReader/src/HanReader.cpp +++ b/Code/Arduino/HanReader/src/HanReader.cpp @@ -35,11 +35,56 @@ bool HanReader::read(byte data) if (reader.Read(data)) { bytesRead = reader.GetRawData(buffer, 0, 512); - listSize = getInt(1, buffer, 0, bytesRead); + if (debug) + { + debug->print("Got valid DLMS data ("); + debug->print(bytesRead); + debug->println(" bytes):"); + debugPrint(buffer, 0, bytesRead); + } + + /* + Data should start with E6 E7 00 0F + and continue with four bytes for the InvokeId + */ + if (bytesRead < 9) + { + if (debug) debug->println("Invalid HAN data: Less than 9 bytes received"); + return false; + } + else if ( + buffer[0] != 0xE6 || + buffer[1] != 0xE7 || + buffer[2] != 0x00 || + buffer[3] != 0x0F + ) + { + if (debug) debug->println("Invalid HAN data: Start should be E6 E7 00 0F"); + return false; + } + + if (debug) debug->println("HAN data is valid"); + listSize = getInt(0, buffer, 0, bytesRead); return true; } } +void HanReader::debugPrint(byte *buffer, int start, int length) +{ + for (int i = start; i < start + length; i++) + { + if (buffer[i] < 0x10) + debug->print("0"); + debug->print(buffer[i], HEX); + debug->print(" "); + if ((i - start + 1) % 16 == 0) + debug->println(""); + else if ((i - start + 1) % 4 == 0) + debug->print(" "); + } + debug->println(""); +} + bool HanReader::read() { if (han->available()) @@ -57,7 +102,7 @@ int HanReader::getListSize() time_t HanReader::getPackageTime() { - return getTime(0); + return getTime(buffer, 8, bytesRead); } time_t HanReader::getTime(int objectId) @@ -78,7 +123,11 @@ String HanReader::getString(int objectId) int HanReader::findValuePosition(int dataPosition, byte *buffer, int start, int length) { - for (int i = start + dataHeader; i