UDP echo with thread

main.cpp

Committer:
JohnnyK
Date:
2020-05-08
Revision:
3:9ab431fc54e2
Parent:
2:01b03970605d
Child:
4:2579ef3b025f

File content as of revision 3:9ab431fc54e2:

#include "mbed.h" //MbedOS 5.15
#include "EthernetInterface.h" 

#define ROUTER
#ifndef ROUTER
    #define IP          "192.168.1.1"   //Here place your defined IP of Mbed
    #define GATEWAY     "0.0.0.0"
    #define MASK        "255.255.255.0"
#endif
#define ADDRESS         "10.0.1.29"     //Here place IP of your PC. Run cmd.exe and write command ipconfig
#define LOCALPORT         20
#define REMOTEPORT      2000

Thread thread;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
SocketAddress targetAddr(ADDRESS,REMOTEPORT); 

void udpEcho(){
    EthernetInterface eth;
    int eth_stat;
#ifndef ROUTER
    eth.disconnect();
    eth_stat = eth.set_network(IP,MASK,GATEWAY);
    printf("set IP status: %i\n",eth_stat);
#endif
    eth_stat = eth.connect();
    printf("connect status: %i\n",eth_stat);
    
    SocketAddress ip; 
    eth.get_ip_address(&ip);
    const char *p_ip = ip.get_ip_address();
    printf("IP address: %s\n", p_ip ? p_ip : "None");
    SocketAddress mask;
    eth.get_netmask(&mask);
    const char *p_mask = mask.get_ip_address();
    printf("Netmask: %s\n", p_mask ? p_mask : "None");
    SocketAddress gateway;
    eth.get_gateway(&gateway);
    const char *p_gateway = gateway.get_ip_address();
    printf("Gateway: %s\n", p_gateway ? p_gateway : "None");

    // Check ip
    if(ip){// Check ip
        UDPSocket sock; 
        SocketAddress addr;
        sock.open(&eth);
        sock.bind(LOCALPORT);
        printf("Listen on local port: %d and send to remote port %d\n", LOCALPORT, REMOTEPORT);
        char buffer[] = "Hello World, UDP Echo"; 
        printf("Sending message '%s' to (%s)\n",buffer,targetAddr.get_ip_address()); 
        sock.sendto(targetAddr, buffer, sizeof(buffer));
        printf("Waiting for message...\n");
        
        while(1) {
            char in_buffer[80];
            int n = sock.recvfrom(&addr, &in_buffer, sizeof(in_buffer)); 
            in_buffer[n] = '\0'; 
            printf("Recieved: %s\n", in_buffer);
            char out_buffer[80];
            n = sprintf(out_buffer,"Echo - %s", in_buffer);
            out_buffer[n] = '\0';
            printf("Send back: %s\n", out_buffer);
            sock.sendto(targetAddr, out_buffer, sizeof(out_buffer));
            led2 =! led2;
        } 
    }else{
        printf("No IP\n");
        //eth.disconnect();
        printf("Thread end\n");
    }
}


int main() { 
    printf("UDP echo starting...\n");
    thread.start(callback(udpEcho));
    ThisThread::sleep_for(1000);
    
    while(1) {
        led1 =! led1;
        ThisThread::sleep_for(1000);
    } 
}