gefixte version 03122015

Dependencies:   EthernetInterface mbed-rtos

Fork of Telemetrie_eth_h2m by Hochschule München

Telemetry.cpp

Committer:
HMFK03LST1
Date:
2015-05-02
Revision:
0:c0179f2ad295
Child:
2:e19b937a29c1

File content as of revision 0:c0179f2ad295:

/*------------------------------------------------*/
/*Autor: Sebastian Hauzenberger                   */
/*------------------------------------------------*/

#include "Telemetry.h"

//LEDs definieren
#ifdef LED
DigitalOut ledserial(LED1);
DigitalOut ledeth(LED2);
DigitalOut ledsock(LED3);
DigitalOut ledwfa(LED4);
#endif

//Serielle Schnittstelle definieren
#ifdef DEBUG
Serial serial(USBTX, USBRX);
#endif

//Konstruktoren
EthernetInterface eth;
TCPSocketConnection sock_tcp;
UDPSocket           sock_udp;
    

//Globale Variable
bool InitSucceed = false;

Telemetry::Telemetry()
{
    
}

#ifdef DEBUG
void Telemetry::InitUSBSerialConnection()
{
    serial.baud(115200);
    
    #ifdef LED
    ledserial = 1;
    #endif
}
#endif

//Funktion überladen. Ohne Parameter DHCP und 10 Sekunden Timeout. Mit Parameter kein DHCP und 3 Sekunden Timeout
bool Telemetry::InitEthernetConnection()
{   
    bool ReturnValue = false;
    #ifdef DEBUG
    serial.printf("Initalisiere LAN Verbindung mit DHCP\r\n\r\n");
    #endif
    
    //Schnittstelle nur einmal initialisieren, sonst gibt es Fehler!
    if (!InitSucceed)
    {
        if (eth.init()==0)  //Init Interface
        {
            InitSucceed = true;
            ReturnValue = true;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {
        #ifdef DEBUG
        serial.printf("Verbinde\r\n\r\n");
        #endif
        
        if (eth.connect(10000)==0) //CONNECT
        {
            #ifdef DEBUG
            serial.printf("IP Adresse: %s\r\n\r\n", eth.getIPAddress());
            #endif
            
            #ifdef LED
            ledeth = 1;
            #endif
            
            ReturnValue = true;
        }
        else
        {
            ReturnValue = false;
        }
    }
    
    #ifdef DEBUG
    if (ReturnValue == false)
    {
        serial.printf("Fehlgeschlagen!");
    }
    #endif
    
    return ReturnValue;
}

bool Telemetry::InitEthernetConnection(const char* IPAdress, const char* SubNetMask, const char* GateWay)
{   
    bool ReturnValue = false;
    #ifdef DEBUG
    serial.printf("Initalisiere LAN Verbindung ohne DHCP\r\n\r\n");
    serial.printf("IP: %s - GateWay: %s - SubNetMask: %s\r\n\r\n",IPAdress, GateWay, SubNetMask);
    #endif
    
    //Schnittstelle nur einmal initialisieren, sonst gibt es Fehler!
    if (!InitSucceed)
    {
        if (eth.init(IPAdress, SubNetMask, GateWay)==0)  //Init Interface
        {
            InitSucceed = true;
            ReturnValue = true;
        }
    }
    
    //Nur wenn Initialisierung erfolgreich war!
    if (InitSucceed)
    {
        #ifdef DEBUG
        serial.printf("Verbinde\r\n\r\n");
        #endif
        
        if (eth.connect(3000)==0) //CONNECT
        {
            #ifdef DEBUG
            serial.printf("IP Adresse: %s\r\n\r\n", eth.getIPAddress());
            #endif
            
            #ifdef LED
            ledeth = 1;
            #endif
            
            ReturnValue = true;
        }
        else
        {
            ReturnValue = false;
        }
    }
    
    #ifdef DEBUG
    if (ReturnValue == false)
    {
        serial.printf("Fehlgeschlagen!");
    }
    #endif
    
    return ReturnValue;
}


void Telemetry::CloseEthernetConnection()
{
    eth.disconnect();
    
    #ifdef DEBUG
    serial.printf("LAN Verbindung geschlossen\r\n\r\n");
    #endif
    
    #ifdef LED
    ledeth = 0;
    #endif
}

void Telemetry::ConnectSocket_tcp(char* Host)
{
    sock_tcp.connect(Host, 80);
    
    #ifdef DEBUG
    serial.printf("TCP Socket geoeffnet.\r\n\r\n");
    #endif
    
    #ifdef LED
    ledsock = 1;
    #endif
}

void Telemetry::ConnectSocket_udp()
{
    sock_udp.init();
    
    #ifdef DEBUG
    serial.printf("UDP Socket geoeffnet.\r\n\r\n");
    #endif
    
}

void Telemetry::CloseSocket()
{
    sock_tcp.close();
    sock_udp.close();

    #ifdef DEBUG
    serial.printf("TCP/UDP Socket geschlossen.\r\n\r\n");
    #endif
    
    #ifdef LED
    ledsock = 0;
    #endif
}


void Telemetry::TransmitDataoverUDP(char *Host, int Port, string Daten)
{
    Endpoint data_server;
    data_server.set_address(Host, Port);
//Umwandeln in char*
    const char *DataBuf = Daten.c_str();
    char DataPaket[Daten.length()];
    strcpy(DataPaket,DataBuf);
    
    #ifdef DEBUG
    serial.printf("----\r\n%s----\r\n\r\n",DataPaket);
    serial.printf("Sende Paket UDP.\r\n\r\n");
    #endif
    
    sock_udp.sendTo(data_server, DataPaket, sizeof(DataPaket));   

    #ifdef DEBUG
    serial.printf("UDP Paket gesendet.\r\n\r\n");
    #endif
}

void Telemetry::TransmitDataoverTCP(char *Host, string Daten, string Username, string Passwort)
{
    #ifdef LED
    ledwfa = 1;
    #endif
    
    //Datenpaket schnüren
    string DATEN = "Username=" + Username + "&Passwort=" + Passwort + "&Paket=" + Daten;
    
    string POST = "POST /H2MClient/h2m_client.php HTTP/1.1\r\n";
    
    string HostString = Host;
    string HOST = "Host: " + HostString + "\r\n";
    
    string CONTENTTYPE = "Content-Type: application/x-www-form-urlencoded\r\n";
    
    string Length;
    stringstream convert;
    convert << DATEN.length();
    Length = convert.str();
    string CONTENTLENGTH = "Content-Length: " + Length + "\r\n\r\n";
    
    
    string datenpaket = POST + HOST + CONTENTTYPE + CONTENTLENGTH + DATEN + "\r\n";
    
    //Umwandeln in char*
    const char *DataBuf = datenpaket.c_str();
    char DataPaket[datenpaket.length()];
    strcpy(DataPaket,DataBuf);

    #ifdef DEBUG
    serial.printf("----\r\n%s----\r\n\r\n",DataPaket);
    serial.printf("Sende Paket.\r\n\r\n");
    #endif
    
    sock_tcp.send_all(DataPaket, sizeof(DataPaket)-1);
    
    #ifdef DEBUG
    serial.printf("Paket gesendet.\r\n\r\n");
    #endif
    
    #ifdef LED
    ledwfa = 0;
    #endif
}

void Telemetry::ReadAnswerandTransmitoverSerial()
{
    char buffer[300];
    int ret;
    while (true)
    {
        ret = sock_tcp.receive(buffer, sizeof(buffer)-1);
        if (ret <= 0)
            break;
        buffer[ret] = '\0';
        
        #ifdef DEBUG
        serial.printf("Received %d chars from server:\n%s\n", ret, buffer);
        #endif
    }
    #ifdef LED
    ledwfa = 0;
    #endif
}

string Telemetry::ReadAnswer()
{
    char buffer[300];
    int ret;
    while (true)
    {
        ret = sock_tcp.receive(buffer, sizeof(buffer)-1);
        if (ret <= 0)
            break;
        buffer[ret] = '\0';
    }
    
    #ifdef LED
    ledwfa = 0;
    #endif
    
    return buffer;
}