/*------------------------------------------------------------------------------------------------------------*/ void telnet_thread() { static struct TELNET_SESSION telnet_session; struct STDOUT oldstream; char Data; int i; // keine alte Verbindung offen? if ( telnet_session.SOCKET == NO_SOCKET_USED ) { // auf neue Verbindung testen telnet_session.SOCKET = CheckPortRequest( TELNET_PORT ); if ( telnet_session.SOCKET != NO_SOCKET_USED ) { STDOUT_save( &oldstream ); STDOUT_set( _TCP, telnet_session.SOCKET ); // Wenn ja, Startmeldung ausgeben und startzustand herstellen für telnet printf_P( PSTR( "Welcome on Tiny-Telnetserver 0.2!\r\n" "Und, los geht's...!!! (\"help\" hilft :-))\r\n> " )); STDOUT_restore( &oldstream ); // TELNET_BUFFER leeren und auf Ausgangszustand setzen telnet_session.STATE = 0; telnet_session.POS = 0; telnet_session.BUFFER[0] = '\0'; telnet_session.STATE = 0; FlushSocketData( telnet_session.SOCKET ); } } // Wenn alte Verbindung offen hier weiter: else { // checken, ob noch offen ist if( CheckSocketState( telnet_session.SOCKET ) == SOCKET_NOT_USE ) { CloseTCPSocket( telnet_session.SOCKET ); telnet_session.SOCKET = NO_SOCKET_USED; return; } // Auf neue Daten zum zusammenbauen testen // hier wird der TELNET_BUFFER aufgefüllt bis 0x0a oder 0x0d eintreffen. der Puffer ist statisch // Wenn ein 0x0a oder 0x0d empfangen wurde, wird der TELNET_STATE auf 1 gesetzt, damit er verarbeitet werden kann if ( telnet_session.STATE == 0 ) { while( GetBytesInSocketData( telnet_session.SOCKET ) >= 1 ) { Data = ( GetByteFromSocketData ( telnet_session.SOCKET ) ); if ( Data != 0x0a && Data <= 0x7f) { if ( telnet_session.POS < TELNET_BUFFER_LEN ) { telnet_session.BUFFER[ telnet_session.POS++ ] = Data; telnet_session.BUFFER[ telnet_session.POS ] = '\0'; } if ( Data == 0x0d ) { telnet_session.STATE = 1; break; } } } } // Wenn TELNET_BUFFER eine Zeile vollständig hat gehts hier weiter if ( telnet_session.STATE == 1 ) { STDOUT_save( &oldstream ); STDOUT_set( _TCP, telnet_session.SOCKET ); telnet_session.argc = TELNET_pharse( telnet_session.BUFFER, telnet_session.argv, MAX_ARGC ); TELNET_runcmd( telnet_session.argc, telnet_session.argv ); // auf QUIT checken if ( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("quit") ) ) { // Socket schließen printf_P( PSTR("Verbindung wird geschlossen\r\n") ); STDOUT_Flush(); STDOUT_set( RS232, 0); CloseTCPSocket( telnet_session.SOCKET ); telnet_session.SOCKET = NO_SOCKET_USED; return; } else if( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("help") ) ) { printf_P( PSTR("Folgende Befehle sind vorhanden:\r\n\r\n") ); for( i = 0 ; i < MAX_TELNET_ENTRYS ; i++ ) { if ( telnet_cmd_table[ i ].functionname != NULL ) { printf_P( telnet_cmd_table[ i ].functionname ); printf_P( PSTR("\r\n") ); } } } printf_P( PSTR("> ") ); STDOUT_restore( &oldstream ); telnet_session.STATE = 0; telnet_session.POS = 0; telnet_session.BUFFER[0] = '\0'; telnet_session.STATE = 0; } } }
/** * \brief Der Telnet-client an sich. Er wird zyklisch aufgerufen und schaut nach ob eine Verbindung auf den * registrierten Port eingegangen ist. Wenn ja holt er sich die Socketnummer der Verbindung und speichert diese. * Wenn eine Verbindung zustande gekommen ist wird diese wiederrum zyklisch nach neuen Daten abgefragt und entsprechend * reagiert. * \param NONE * \return NONE */ void telnet_thread( void ) { struct STDOUT oldstream; char Data; // keine alte Verbindung offen? if ( telnet_session.SOCKET == NO_SOCKET_USED ) { // auf neue Verbindung testen telnet_session.SOCKET = CheckPortRequest( TELNET_PORT ); if ( telnet_session.SOCKET != NO_SOCKET_USED ) { STDOUT_save( &oldstream ); STDOUT_set( _TCP, telnet_session.SOCKET ); // Wenn ja, Startmeldung ausgeben und startzustand herstellen für telnet printf_P( PSTR( "Und, los geht's...!!! (\"help\" hilft :-))\r\n> " )); STDOUT_restore( &oldstream ); // TELNET_BUFFER leeren und auf Ausgangszustand setzen telnet_session.STATE = 0; telnet_session.POS = 0; telnet_session.BUFFER[0] = '\0'; telnet_session.STATE = 0; FlushSocketData( telnet_session.SOCKET ); } } // Wenn alte Verbindung offen hier weiter: else { // checken, ob noch offen ist if( CheckSocketState( telnet_session.SOCKET ) != SOCKET_READY ) { telnet_session.SOCKET = NO_SOCKET_USED; return; } // Auf neue Daten zum zusammenbauen testen // hier wird der TELNET_BUFFER aufgefüllt bis 0x0a oder 0x0d eintreffen. der Puffer ist statisch // Wenn ein 0x0a oder 0x0d empfangen wurde, wird der TELNET_STATE auf 1 gesetzt, damit er verarbeitet werden kann if ( telnet_session.STATE == 0 ) { while( GetBytesInSocketData( telnet_session.SOCKET ) >= 1 ) { Data = ( GetByteFromSocketData ( telnet_session.SOCKET ) ); if ( Data != 0x0a && Data <= 0x7f) { if ( telnet_session.POS < TELNET_BUFFER_LEN ) { telnet_session.BUFFER[ telnet_session.POS++ ] = Data; telnet_session.BUFFER[ telnet_session.POS ] = '\0'; } if ( Data == 0x0d ) { telnet_session.STATE = 1; break; } } } } // Wenn TELNET_BUFFER eine Zeile vollständig hat gehts hier weiter if ( telnet_session.STATE == 1 ) { STDOUT_save( &oldstream ); STDOUT_set( _TCP, telnet_session.SOCKET ); telnet_session.argc = SHELL_pharse( telnet_session.BUFFER, telnet_session.argv, MAX_ARGC ); // auf QUIT checken if ( !strcmp_P( telnet_session.argv[ 0 ] , PSTR("quit") ) ) { // Socket schließen printf_P( PSTR("Quiting\r\n") ); STDOUT_Flush(); STDOUT_set( RS232, 0); CloseTCPSocket( telnet_session.SOCKET ); telnet_session.SOCKET = NO_SOCKET_USED; return; } else /************************************************************************/ /* help value for openhab just intended to simulate a connection */ /************************************************************************/ if(!strcmp_P( telnet_session.argv[ 0 ] , PSTR("value") )){ printf_P( PSTR("openhab") ); STDOUT_Flush(); } else { SHELL_runcmd( telnet_session.argc, telnet_session.argv ); } printf_P( PSTR("> ") ); STDOUT_restore( &oldstream ); telnet_session.STATE = 0; telnet_session.POS = 0; telnet_session.BUFFER[0] = '\0'; telnet_session.STATE = 0; } } }