Example #1
0
/*------------------------------------------------------------------------------------------------------------*/	
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;
			}
		}
	}
Example #2
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;
		}
	}
}