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
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>
- include <stdio.h>
- include <stdlib.h>
- include <unistd.h>
- include <string.h>
- include <sys/types.h>
- include <sys/socket.h>
- include <netinet/in.h>
- 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>
Revision 4:9f88f8b4e739, committed 2015-01-11
- Comitter:
- danielashercohen
- Date:
- Sun Jan 11 05:36:29 2015 +0000
- Parent:
- 3:af736e1af4a9
- Commit message:
- 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.
Changed in this revision
diff -r af736e1af4a9 -r 9f88f8b4e739 SeeedGrayOLED.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SeeedGrayOLED.lib Sun Jan 11 05:36:29 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/danielashercohen/code/SeeedGrayOLED/#05a64dcb7603
diff -r af736e1af4a9 -r 9f88f8b4e739 USBDevice.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice.lib Sun Jan 11 05:36:29 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/USBDevice/#335f2506f422
diff -r af736e1af4a9 -r 9f88f8b4e739 main.cpp --- a/main.cpp Sat Feb 15 13:48:46 2014 +0000 +++ b/main.cpp Sun Jan 11 05:36:29 2015 +0000 @@ -1,88 +1,130 @@ /* - * Author: Edoardo De Marchi + * Author: Dan Cohen * Date: 15/02/14 - * Notes: Checks the Ethernet cable connection + * Notes: Displays the IP address then any data that is sent from a connecting client + * Client command line on my system: + * ./client 192.168.2.3 2000 + * */ #include "mbed.h" #include "EthernetInterface.h" #include "eth_status.h" +#include "SeeedGrayOLED.h" +#include "USBSerial.h" -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); - +SeeedGrayOLED SeeedGrayOled(P0_10, P0_11); + +USBSerial serial; + //ETHERNET #define ECHO_SERVER_PORT 2000 -char* ip = "192.168.153.153"; // ip -char* mask = "255.255.255.0"; // mask -char* gateway = "192.168.153.100"; // gateway -EthernetInterface eth; -TCPSocketConnection client; -TCPSocketServer server; +EthernetInterface eth; +TCPSocketServer server; +TCPSocketConnection connection; + +char readBuffer[1024]; +// This is required because the Seeed Arch Pro doesn't have a +// unique MAC address (if you don't have this function then the Ethernet Interface init() +// function will hang when it tries to find it. +extern "C" void mbed_mac_address(char *mac) +{ + + mac[0] = 0x00; + mac[1] = 0x02; + mac[2] = 0xF7; + mac[3] = 0xF1; + mac[4] = 0x91; + mac[5] = 0x9F; +}; int Init() { - led1 = 0; - led2 = 0; - led3 = 0; - led4 = 0; - - - // ETHERNET - eth.init(ip, mask, gateway); + led1 = 1; + led2 = 1; + led3 = 1; + led4 = 1; + + // Initialize the OLED display + SeeedGrayOled.init(); // initialize SEEED OLED display + SeeedGrayOled.clearDisplay(); // Clear Display. + SeeedGrayOled.setNormalDisplay(); // Set Normal Display Mode + SeeedGrayOled.setVerticalMode(); // Set to vertical mode for displaying text + + SeeedGrayOled.setTextXY(1,0); //set Cursor to first line, 0th column + + SeeedGrayOled.setGrayLevel(15); //Set Grayscale level. Any number between 0 - 15. + + eth.init(); + serial.printf("initiated\n"); + eth.connect(); + serial.printf("connected\n"); + serial.printf("My IP address: %s\n\n", eth.getIPAddress()); + SeeedGrayOled.clearDisplay(); // Clear Display. + SeeedGrayOled.setTextXY(1,0); + SeeedGrayOled.putString("My IP:"); + SeeedGrayOled.setTextXY(3,0); + SeeedGrayOled.putString(eth.getIPAddress()); + server.bind(ECHO_SERVER_PORT); + serial.printf("bound to port %d\n", ECHO_SERVER_PORT); server.listen(1); - printf("IP Address is %s\r\n", eth.getIPAddress()); - printf("%s - Speed: %d Mbps\n", get_transmission_status(), get_connection_speed()); - + serial.printf("%s - Speed: %d Mbps\n", get_transmission_status(), get_connection_speed()); + return 0; } - - -int main() +int main() { - bool eth_status = false; - bool eth_status_temp = true; - + Init(); - - - while(true) - { - printf("\nWait for new connection...\n"); - server.accept(client); - - printf("Connection from: %s\n", client.get_address()); + + while(true) { + serial.printf("\nWait for new connection...\n"); + server.accept(connection); + + led3 = 0; + + serial.printf("Connection from: %s\n", connection.get_address()); + SeeedGrayOled.setTextXY(5,0); + SeeedGrayOled.putString("Connect IP: "); + SeeedGrayOled.setTextXY(7,0); + SeeedGrayOled.putString(connection.get_address()); + + char buffer[300]; + int ret; - while (true) - { - if(!get_link_status()) - { - eth_status = true; - }else - { - eth_status = false; - eth_status_temp = true; - led1 = 0; - } - - if(eth_status == eth_status_temp) - { - eth_status_temp = !eth_status; - printf("Check cable connection\r\n"); - led1 = 1; - eth_status = false; - } - led2 = !led2; - osDelay(500); - } + ret = connection.receive(buffer, sizeof(buffer)-1); + if (ret <= 0) { + serial.printf("didn't get any message from the server connection\n"); + } else { + buffer[ret] = '\0'; + serial.printf("Received %d chars from server:\n%s\n", ret, buffer); + } + + char retBuffer[300]; + sprintf(retBuffer, "%d", buffer); + + serial.printf("Sending %d chars back to client :\n%s\n", ret, buffer); + ret = connection.send_all (buffer, sizeof(buffer)-1); + SeeedGrayOled.setTextXY(9,0); + SeeedGrayOled.putString("D: "); + SeeedGrayOled.setTextXY(9,4); + SeeedGrayOled.putString(buffer); + + connection.close(); + + led3 = 1; + } + }