This example shows using the SeeedStudio arch pro as an Ethernet server. It will initialize the Ethernet port, display its IP address, display the IP address of connecting clients and then return data sent from the client.

Dependencies:   EthernetInterface SeeedGrayOLED USBDevice mbed-rtos mbed

Fork of Ethernet_Status_HelloWorld by Edoardo De Marchi

This mbed server example for SeeedStudio also needs a client to connect.

I compiled and ran this on my opensuse linux virtual machine but I think it should compile and run fine on most linux distrubutions and probably on OSX as well:

<codei>

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <unistd.h>
  4. include <string.h>
  5. include <sys/types.h>
  6. include <sys/socket.h>
  7. include <netinet/in.h>
  8. include <netdb.h>

void error(const char *msg) { perror(msg); exit(0); }

int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server;

char buffer[256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting"); printf("Please enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); n = write(sockfd,buffer,strlen(buffer)); if (n < 0) error("ERROR writing to socket"); bzero(buffer,256); n = read(sockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("%s\n",buffer); close(sockfd); return 0; } <code>

Committer:
danielashercohen
Date:
Sun Jan 11 05:36:29 2015 +0000
Revision:
4:9f88f8b4e739
Parent:
3:af736e1af4a9
This acts as a server,  when started it displays it's own IP address,   when a client connects it displays the connecting IP address,  it then displays the data sent and returns it to the client.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 0:9e8b3fd68f6c 1 /*
danielashercohen 4:9f88f8b4e739 2 * Author: Dan Cohen
edodm85 2:922ee74b0192 3 * Date: 15/02/14
danielashercohen 4:9f88f8b4e739 4 * Notes: Displays the IP address then any data that is sent from a connecting client
danielashercohen 4:9f88f8b4e739 5 * Client command line on my system:
danielashercohen 4:9f88f8b4e739 6 * ./client 192.168.2.3 2000
danielashercohen 4:9f88f8b4e739 7 *
edodm85 0:9e8b3fd68f6c 8 */
edodm85 0:9e8b3fd68f6c 9
edodm85 0:9e8b3fd68f6c 10
edodm85 0:9e8b3fd68f6c 11 #include "mbed.h"
edodm85 0:9e8b3fd68f6c 12 #include "EthernetInterface.h"
edodm85 0:9e8b3fd68f6c 13 #include "eth_status.h"
danielashercohen 4:9f88f8b4e739 14 #include "SeeedGrayOLED.h"
danielashercohen 4:9f88f8b4e739 15 #include "USBSerial.h"
edodm85 0:9e8b3fd68f6c 16
danielashercohen 4:9f88f8b4e739 17 DigitalOut led1(LED1);
danielashercohen 4:9f88f8b4e739 18 DigitalOut led2(LED2);
danielashercohen 4:9f88f8b4e739 19 DigitalOut led3(LED3);
danielashercohen 4:9f88f8b4e739 20 DigitalOut led4(LED4);
edodm85 2:922ee74b0192 21
danielashercohen 4:9f88f8b4e739 22 SeeedGrayOLED SeeedGrayOled(P0_10, P0_11);
danielashercohen 4:9f88f8b4e739 23
danielashercohen 4:9f88f8b4e739 24 USBSerial serial;
danielashercohen 4:9f88f8b4e739 25
edodm85 0:9e8b3fd68f6c 26 //ETHERNET
edodm85 0:9e8b3fd68f6c 27 #define ECHO_SERVER_PORT 2000
edodm85 0:9e8b3fd68f6c 28
danielashercohen 4:9f88f8b4e739 29 EthernetInterface eth;
danielashercohen 4:9f88f8b4e739 30 TCPSocketServer server;
danielashercohen 4:9f88f8b4e739 31 TCPSocketConnection connection;
danielashercohen 4:9f88f8b4e739 32
danielashercohen 4:9f88f8b4e739 33 char readBuffer[1024];
edodm85 0:9e8b3fd68f6c 34
danielashercohen 4:9f88f8b4e739 35 // This is required because the Seeed Arch Pro doesn't have a
danielashercohen 4:9f88f8b4e739 36 // unique MAC address (if you don't have this function then the Ethernet Interface init()
danielashercohen 4:9f88f8b4e739 37 // function will hang when it tries to find it.
danielashercohen 4:9f88f8b4e739 38 extern "C" void mbed_mac_address(char *mac)
danielashercohen 4:9f88f8b4e739 39 {
danielashercohen 4:9f88f8b4e739 40
danielashercohen 4:9f88f8b4e739 41 mac[0] = 0x00;
danielashercohen 4:9f88f8b4e739 42 mac[1] = 0x02;
danielashercohen 4:9f88f8b4e739 43 mac[2] = 0xF7;
danielashercohen 4:9f88f8b4e739 44 mac[3] = 0xF1;
danielashercohen 4:9f88f8b4e739 45 mac[4] = 0x91;
danielashercohen 4:9f88f8b4e739 46 mac[5] = 0x9F;
danielashercohen 4:9f88f8b4e739 47 };
edodm85 0:9e8b3fd68f6c 48
edodm85 0:9e8b3fd68f6c 49 int Init()
edodm85 0:9e8b3fd68f6c 50 {
danielashercohen 4:9f88f8b4e739 51 led1 = 1;
danielashercohen 4:9f88f8b4e739 52 led2 = 1;
danielashercohen 4:9f88f8b4e739 53 led3 = 1;
danielashercohen 4:9f88f8b4e739 54 led4 = 1;
danielashercohen 4:9f88f8b4e739 55
danielashercohen 4:9f88f8b4e739 56 // Initialize the OLED display
danielashercohen 4:9f88f8b4e739 57 SeeedGrayOled.init(); // initialize SEEED OLED display
danielashercohen 4:9f88f8b4e739 58 SeeedGrayOled.clearDisplay(); // Clear Display.
danielashercohen 4:9f88f8b4e739 59 SeeedGrayOled.setNormalDisplay(); // Set Normal Display Mode
danielashercohen 4:9f88f8b4e739 60 SeeedGrayOled.setVerticalMode(); // Set to vertical mode for displaying text
danielashercohen 4:9f88f8b4e739 61
danielashercohen 4:9f88f8b4e739 62 SeeedGrayOled.setTextXY(1,0); //set Cursor to first line, 0th column
danielashercohen 4:9f88f8b4e739 63
danielashercohen 4:9f88f8b4e739 64 SeeedGrayOled.setGrayLevel(15); //Set Grayscale level. Any number between 0 - 15.
danielashercohen 4:9f88f8b4e739 65
danielashercohen 4:9f88f8b4e739 66 eth.init();
danielashercohen 4:9f88f8b4e739 67 serial.printf("initiated\n");
danielashercohen 4:9f88f8b4e739 68
edodm85 0:9e8b3fd68f6c 69 eth.connect();
danielashercohen 4:9f88f8b4e739 70 serial.printf("connected\n");
danielashercohen 4:9f88f8b4e739 71 serial.printf("My IP address: %s\n\n", eth.getIPAddress());
danielashercohen 4:9f88f8b4e739 72 SeeedGrayOled.clearDisplay(); // Clear Display.
danielashercohen 4:9f88f8b4e739 73 SeeedGrayOled.setTextXY(1,0);
danielashercohen 4:9f88f8b4e739 74 SeeedGrayOled.putString("My IP:");
danielashercohen 4:9f88f8b4e739 75 SeeedGrayOled.setTextXY(3,0);
danielashercohen 4:9f88f8b4e739 76 SeeedGrayOled.putString(eth.getIPAddress());
danielashercohen 4:9f88f8b4e739 77
edodm85 0:9e8b3fd68f6c 78 server.bind(ECHO_SERVER_PORT);
danielashercohen 4:9f88f8b4e739 79 serial.printf("bound to port %d\n", ECHO_SERVER_PORT);
edodm85 0:9e8b3fd68f6c 80 server.listen(1);
danielashercohen 4:9f88f8b4e739 81 serial.printf("%s - Speed: %d Mbps\n", get_transmission_status(), get_connection_speed());
danielashercohen 4:9f88f8b4e739 82
edodm85 0:9e8b3fd68f6c 83 return 0;
edodm85 0:9e8b3fd68f6c 84 }
edodm85 0:9e8b3fd68f6c 85
danielashercohen 4:9f88f8b4e739 86 int main()
edodm85 0:9e8b3fd68f6c 87 {
danielashercohen 4:9f88f8b4e739 88
edodm85 0:9e8b3fd68f6c 89 Init();
danielashercohen 4:9f88f8b4e739 90
danielashercohen 4:9f88f8b4e739 91 while(true) {
danielashercohen 4:9f88f8b4e739 92 serial.printf("\nWait for new connection...\n");
danielashercohen 4:9f88f8b4e739 93 server.accept(connection);
danielashercohen 4:9f88f8b4e739 94
danielashercohen 4:9f88f8b4e739 95 led3 = 0;
danielashercohen 4:9f88f8b4e739 96
danielashercohen 4:9f88f8b4e739 97 serial.printf("Connection from: %s\n", connection.get_address());
danielashercohen 4:9f88f8b4e739 98 SeeedGrayOled.setTextXY(5,0);
danielashercohen 4:9f88f8b4e739 99 SeeedGrayOled.putString("Connect IP: ");
danielashercohen 4:9f88f8b4e739 100 SeeedGrayOled.setTextXY(7,0);
danielashercohen 4:9f88f8b4e739 101 SeeedGrayOled.putString(connection.get_address());
danielashercohen 4:9f88f8b4e739 102
danielashercohen 4:9f88f8b4e739 103 char buffer[300];
danielashercohen 4:9f88f8b4e739 104 int ret;
edodm85 0:9e8b3fd68f6c 105
danielashercohen 4:9f88f8b4e739 106 ret = connection.receive(buffer, sizeof(buffer)-1);
danielashercohen 4:9f88f8b4e739 107 if (ret <= 0) {
danielashercohen 4:9f88f8b4e739 108 serial.printf("didn't get any message from the server connection\n");
danielashercohen 4:9f88f8b4e739 109 } else {
danielashercohen 4:9f88f8b4e739 110 buffer[ret] = '\0';
danielashercohen 4:9f88f8b4e739 111 serial.printf("Received %d chars from server:\n%s\n", ret, buffer);
danielashercohen 4:9f88f8b4e739 112 }
danielashercohen 4:9f88f8b4e739 113
danielashercohen 4:9f88f8b4e739 114 char retBuffer[300];
danielashercohen 4:9f88f8b4e739 115 sprintf(retBuffer, "%d", buffer);
danielashercohen 4:9f88f8b4e739 116
danielashercohen 4:9f88f8b4e739 117 serial.printf("Sending %d chars back to client :\n%s\n", ret, buffer);
danielashercohen 4:9f88f8b4e739 118 ret = connection.send_all (buffer, sizeof(buffer)-1);
danielashercohen 4:9f88f8b4e739 119 SeeedGrayOled.setTextXY(9,0);
danielashercohen 4:9f88f8b4e739 120 SeeedGrayOled.putString("D: ");
danielashercohen 4:9f88f8b4e739 121 SeeedGrayOled.setTextXY(9,4);
danielashercohen 4:9f88f8b4e739 122 SeeedGrayOled.putString(buffer);
danielashercohen 4:9f88f8b4e739 123
danielashercohen 4:9f88f8b4e739 124 connection.close();
danielashercohen 4:9f88f8b4e739 125
danielashercohen 4:9f88f8b4e739 126 led3 = 1;
danielashercohen 4:9f88f8b4e739 127
edodm85 0:9e8b3fd68f6c 128 }
danielashercohen 4:9f88f8b4e739 129
edodm85 0:9e8b3fd68f6c 130 }