#include "SocketThreadCrusader.h" #include <iostream> #include "MonitorLogging.h" #include "convert.h" using namespace std ; SocketThreadCrusader::SocketThreadCrusader(MonitorConfiguration *config, int LOCKNUM, int PortNum) : SocketThread(config, LOCKNUM, PortNum, monitord) { telegrammCounter=0 ; } SocketThreadCrusader::~SocketThreadCrusader() { } void SocketThreadCrusader::sayWelcome() { } std::string SocketThreadCrusader::createFMSOutputString(ModuleResultBase Result) { std::string baustufeCString, richtungCString ; std::string counterCString ; std::string socketText ; baustufeCString = convertStringBoolText (Result["baustufe"]); richtungCString = convertStringBoolText (Result["richtung"]); counterCString=convertIntToString(telegrammCounter++) ; socketText = Result["datum"] // dateStr + "#![]!#" + Result["uhrzeit"] //timeStr + "#![]!#" + Result["fmskennung"] // fahrzeugKennung + "#![]!#" + Result["status"] // statusString + "#![]!#" + baustufeCString + "#![]!#" + richtungCString + "#![]!#" + Result["tki"] + "#![]!#-1#![]!#false#![]!#false#![]!#" + counterCString ; /* if ( (Result["textuebertragung"].size()>0) && (convertToInt(Result["status"])==10)) { socketText+= "#![]!#" + Result["textuebertragung"] + "#![]!#" ; } */ return socketText ; } std::string SocketThreadCrusader::createZVEIOutputString(ModuleResultBase Result) { std::string socketText ; std::string hexText ; std::string counterCString ; convertStringToHex(Result["text"],hexText) ; counterCString=convertIntToString(telegrammCounter++) ; socketText = Result["datum"] + "#![]!#" + Result["uhrzeit"] + "#![]!#" + Result["zvei"] + "#![]!#16#![]!#false#![]!#true#![]!#-1#![]!#-1#![]!#false#![]!#false#![]!#" + counterCString + "#![]!#Melderalarm#![]!#" ; return socketText ; } std::string SocketThreadCrusader::createPOCSAGOutputString(ModuleResultBase Result) { std::string socketText ; std::string hexText ; std::string counterCString ; counterCString=convertIntToString(telegrammCounter++) ; convertStringToHex(Result["text"],hexText) ; socketText = Result["datum"] + "#![]!#" + Result["uhrzeit"] + "#![]!#" + Result["ric"] + Result["subhex"] + "#![]!#17#![]!#false#![]!#true#![]!#0#![]!#-1#![]!#false#![]!#false#![]!#" + counterCString + "#![]!#" + Result["text"] + "#![]!#" ; return socketText ; } void SocketThreadCrusader::processInput() { // Anmeldung ? std::string Kommando=m_CommandBuffer ; if (Kommando.substr(0,5)=="PASS:") { std::string password=Kommando.substr(5) ; checkLogin(password) ; } else if (Kommando=="ClientCiao") { doLogout() ; } else if (Kommando.substr(8, 6) == "#![]!#") { ModuleResultBase *pfms = new ModuleResultBase(); size_t position; std::string datum, zeit, fmskennung, status, a, b, c, d, e, f, g, text; /* Status im Crusader manuell gesetzt: * 23.07.08#![]!#22:19:36#![]!#93185811#![]!#7#![]!#true#![]!#false#![]!#3#![]!#1#![]!#false#![]!#true#![]!#-1#![]!#7 TelegrammText#![]!# */ FILE_LOG (logDEBUG) << "manueller Status von Crusader Client empfangen."; /* es wird nur FMS betrachtet */ pfms->set ("typ", "fms"); /* Feld 1: Datum */ pfms->set ("datum", Kommando.substr(0, 8)); /* Feld 2: Uhrzeit */ position = Kommando.find_first_of(CRUSADER_DELIMITER) + 6; pfms->set ("uhrzeit", Kommando.substr(position, 8)); /* Feld 3: FMS Kennung */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; fmskennung = Kommando.substr(position, 8); pfms->set ("fmskennung", fmskennung); pfms->set ("bosdezimal", convertIntToString (convertNibbleToInt (fmskennung[0]))); pfms->set ("landdezimal", convertIntToString (convertNibbleToInt (fmskennung[1]))); pfms->set ("bos", fmskennung.substr(0, 1)); pfms->set ("land", fmskennung.substr(1, 1)); pfms->set ("ort", fmskennung.substr(2, 2)); pfms->set ("kfz", fmskennung.substr(4, 4)); /* Feld 4: Fahrzeugstatus */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; status = Kommando.substr(position, 1); pfms->set ("status", status); pfms->set ("statusdezimal", convertIntToString (convertNibbleToInt (status[0]))); // TODO Status 16 bedeutet ZVEI und 17 POCSAG /* Feld 5: Baustufe */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; pfms->set ("baustufe", convertStringTextBool(Kommando.substr(position, Kommando.find_first_of(CRUSADER_DELIMITER, position) - position))); /* Feld 6: Richtung */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; pfms->set ("richtung", convertStringTextBool(Kommando.substr(position, Kommando.find_first_of(CRUSADER_DELIMITER, position) - position))); /* Feld 7: TKI */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; pfms->set ("tki", Kommando.substr(position, 1)); /* Feld 8: ? */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; /* Feld 9: ? */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; /* Feld 10: ? */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; /* Feld 11: ? */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; /* Feld 12: Text */ position = Kommando.find_first_of(CRUSADER_DELIMITER, position) + 6; pfms->set ("textuebertragung", Kommando.substr(position, Kommando.find_first_of(CRUSADER_DELIMITER, position) - position)); FILE_LOG(logDEBUG) << "Debug(FMS vom Crusader):" << endl << (*pfms); GlobalDispatcher->addResult (pfms); } else { FILE_LOG (logDEBUG) << "received from Crusader: " << m_CommandBuffer ; } } void SocketThreadCrusader::checkLogin(std::string password) { if (m_MonitorConfiguration->IsValidLogin(m_MonitorConfiguration->m_crusaderUsername,password,m_sClientIP)) { m_authenticated=true ; FILE_LOG(logINFO) << "login accepted (crusader pw allowed): from ip " << m_sClientIP ; } else { FILE_LOG(logINFO) << "login denied (crusader pw not allowed): " << password << " from ip " << m_sClientIP ; } }