Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Impedance_Fast_Circuitry by
main.cpp@18:b17ddeeb1c09, 2014-11-14 (annotated)
- Committer:
- timmey9
- Date:
- Fri Nov 14 20:39:34 2014 +0000
- Revision:
- 18:b17ddeeb1c09
- Parent:
- 17:2f978f823020
- Child:
- 20:f533b3c9296f
Reverted EthernetInterface.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
timmey9 | 18:b17ddeeb1c09 | 1 | #define SERVER 1 |
timmey9 | 16:c3f922f61b8f | 2 | |
timmey9 | 16:c3f922f61b8f | 3 | |
timmey9 | 17:2f978f823020 | 4 | |
timmey9 | 17:2f978f823020 | 5 | #if SERVER == 1 |
timmey9 | 16:c3f922f61b8f | 6 | |
donatien | 0:bb128f0e952f | 7 | #include "mbed.h" |
donatien | 0:bb128f0e952f | 8 | #include "EthernetInterface.h" |
timmey9 | 17:2f978f823020 | 9 | |
timmey9 | 17:2f978f823020 | 10 | #include "NetworkAPI/buffer.hpp" |
timmey9 | 17:2f978f823020 | 11 | #include "NetworkAPI/select.hpp" |
timmey9 | 17:2f978f823020 | 12 | #include "NetworkAPI/ip/address.hpp" |
timmey9 | 17:2f978f823020 | 13 | #include "NetworkAPI/tcp/socket.hpp" |
timmey9 | 18:b17ddeeb1c09 | 14 | |
timmey9 | 18:b17ddeeb1c09 | 15 | Serial pc(USBTX, USBRX); |
timmey9 | 18:b17ddeeb1c09 | 16 | DigitalOut led_red(LED_RED); |
timmey9 | 18:b17ddeeb1c09 | 17 | DigitalOut led_green(LED_GREEN); |
timmey9 | 18:b17ddeeb1c09 | 18 | DigitalOut led_blue(LED_BLUE); |
timmey9 | 18:b17ddeeb1c09 | 19 | |
timmey9 | 17:2f978f823020 | 20 | using namespace network; |
timmey9 | 17:2f978f823020 | 21 | |
timmey9 | 17:2f978f823020 | 22 | #define MAX_CLIENTS 5 |
timmey9 | 17:2f978f823020 | 23 | |
emilmont | 7:65188f4a8c25 | 24 | int main() { |
timmey9 | 18:b17ddeeb1c09 | 25 | led_red = 1; |
timmey9 | 18:b17ddeeb1c09 | 26 | led_green = 1; |
timmey9 | 18:b17ddeeb1c09 | 27 | led_blue = 1; |
timmey9 | 18:b17ddeeb1c09 | 28 | pc.baud(230400); |
timmey9 | 18:b17ddeeb1c09 | 29 | pc.printf("Starting Server\r\n"); |
timmey9 | 17:2f978f823020 | 30 | EthernetInterface interface; |
timmey9 | 17:2f978f823020 | 31 | interface.init(); |
timmey9 | 17:2f978f823020 | 32 | interface.connect(); |
timmey9 | 18:b17ddeeb1c09 | 33 | pc.printf("IP Address is %s\n\r", interface.getIPAddress()); |
timmey9 | 17:2f978f823020 | 34 | |
timmey9 | 17:2f978f823020 | 35 | Select select; |
timmey9 | 17:2f978f823020 | 36 | tcp::Socket server; |
timmey9 | 17:2f978f823020 | 37 | tcp::Socket client[MAX_CLIENTS]; |
timmey9 | 17:2f978f823020 | 38 | tcp::Socket *socket = NULL; |
timmey9 | 17:2f978f823020 | 39 | |
timmey9 | 17:2f978f823020 | 40 | int result = 0; |
timmey9 | 17:2f978f823020 | 41 | int index = 0; |
timmey9 | 17:2f978f823020 | 42 | |
timmey9 | 17:2f978f823020 | 43 | network::Buffer buffer(256); |
timmey9 | 17:2f978f823020 | 44 | std::string message("Hello world!"); |
timmey9 | 17:2f978f823020 | 45 | |
timmey9 | 17:2f978f823020 | 46 | // Configure the server socket (assume everty thing works) |
timmey9 | 17:2f978f823020 | 47 | server.open(); |
timmey9 | 17:2f978f823020 | 48 | server.bind(1234); |
timmey9 | 17:2f978f823020 | 49 | server.listen(MAX_CLIENTS); |
timmey9 | 17:2f978f823020 | 50 | |
timmey9 | 17:2f978f823020 | 51 | // Add sockets to the select api |
timmey9 | 17:2f978f823020 | 52 | select.set(&server, Select::Read); |
timmey9 | 17:2f978f823020 | 53 | for (index = 0; index < MAX_CLIENTS; index++) { |
timmey9 | 17:2f978f823020 | 54 | select.set(&client[index], Select::Read); |
timmey9 | 17:2f978f823020 | 55 | } |
timmey9 | 17:2f978f823020 | 56 | |
timmey9 | 17:2f978f823020 | 57 | do { |
timmey9 | 17:2f978f823020 | 58 | // Wait for activity |
timmey9 | 17:2f978f823020 | 59 | result = select.wait(); |
timmey9 | 17:2f978f823020 | 60 | if (result < -1) { |
timmey9 | 18:b17ddeeb1c09 | 61 | pc.printf("Failed to select\n\r"); |
emilmont | 7:65188f4a8c25 | 62 | break; |
timmey9 | 16:c3f922f61b8f | 63 | } |
timmey9 | 17:2f978f823020 | 64 | |
timmey9 | 17:2f978f823020 | 65 | // Get the first socket |
timmey9 | 17:2f978f823020 | 66 | socket = (tcp::Socket *)select.getReadable(); |
timmey9 | 17:2f978f823020 | 67 | |
timmey9 | 17:2f978f823020 | 68 | for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) { |
timmey9 | 17:2f978f823020 | 69 | // Check if there was a connection request. |
timmey9 | 17:2f978f823020 | 70 | if (socket->getHandle() == server.getHandle()) { |
timmey9 | 17:2f978f823020 | 71 | // Find an unused client |
timmey9 | 17:2f978f823020 | 72 | for (index = 0; index < MAX_CLIENTS; index++) { |
timmey9 | 17:2f978f823020 | 73 | if (client[index].getStatus() == network::Socket::Closed) { |
timmey9 | 17:2f978f823020 | 74 | break; |
timmey9 | 17:2f978f823020 | 75 | } |
timmey9 | 17:2f978f823020 | 76 | } |
timmey9 | 17:2f978f823020 | 77 | |
timmey9 | 17:2f978f823020 | 78 | // Maximum connections reached |
timmey9 | 17:2f978f823020 | 79 | if (index == MAX_CLIENTS) { |
timmey9 | 18:b17ddeeb1c09 | 80 | pc.printf("Maximum connections reached\n\r"); |
timmey9 | 17:2f978f823020 | 81 | continue; |
timmey9 | 17:2f978f823020 | 82 | } |
timmey9 | 17:2f978f823020 | 83 | |
timmey9 | 17:2f978f823020 | 84 | // Accept the client |
timmey9 | 17:2f978f823020 | 85 | socket->accept(client[index]); |
timmey9 | 18:b17ddeeb1c09 | 86 | pc.printf("Client connected %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 87 | client[index].getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 88 | client[index].getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 89 | |
timmey9 | 17:2f978f823020 | 90 | // Send a nice message to the client |
timmey9 | 17:2f978f823020 | 91 | client[index].write((void *)message.data(), message.size()); |
timmey9 | 17:2f978f823020 | 92 | continue; |
timmey9 | 16:c3f922f61b8f | 93 | } |
timmey9 | 17:2f978f823020 | 94 | |
timmey9 | 17:2f978f823020 | 95 | // It was not the server socket, so it must be a client talking to us. |
timmey9 | 17:2f978f823020 | 96 | switch (socket->read(buffer)) { |
timmey9 | 17:2f978f823020 | 97 | case 0: |
timmey9 | 17:2f978f823020 | 98 | // Remote end disconnected |
timmey9 | 18:b17ddeeb1c09 | 99 | pc.printf("Client disconnected %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 100 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 101 | socket->getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 102 | |
timmey9 | 17:2f978f823020 | 103 | // Close socket |
timmey9 | 17:2f978f823020 | 104 | socket->close(); |
timmey9 | 17:2f978f823020 | 105 | break; |
timmey9 | 17:2f978f823020 | 106 | |
timmey9 | 17:2f978f823020 | 107 | case -1: |
timmey9 | 18:b17ddeeb1c09 | 108 | pc.printf("Error while reading data from socket\n\r"); |
timmey9 | 17:2f978f823020 | 109 | socket->close(); |
timmey9 | 17:2f978f823020 | 110 | break; |
timmey9 | 17:2f978f823020 | 111 | |
timmey9 | 17:2f978f823020 | 112 | default: |
timmey9 | 18:b17ddeeb1c09 | 113 | pc.printf("Message from %s:%d\n\r", |
timmey9 | 17:2f978f823020 | 114 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
timmey9 | 17:2f978f823020 | 115 | socket->getRemoteEndpoint().getPort()); |
timmey9 | 17:2f978f823020 | 116 | |
timmey9 | 18:b17ddeeb1c09 | 117 | pc.printf("%s\n\r", (char *)buffer.data()); |
timmey9 | 17:2f978f823020 | 118 | break; |
timmey9 | 17:2f978f823020 | 119 | } |
timmey9 | 16:c3f922f61b8f | 120 | } |
timmey9 | 17:2f978f823020 | 121 | |
timmey9 | 17:2f978f823020 | 122 | } while (server.getStatus() == network::Socket::Listening); |
donatien | 0:bb128f0e952f | 123 | } |
timmey9 | 16:c3f922f61b8f | 124 | |
timmey9 | 16:c3f922f61b8f | 125 | |
timmey9 | 16:c3f922f61b8f | 126 | |
timmey9 | 18:b17ddeeb1c09 | 127 | #else // client |
timmey9 | 16:c3f922f61b8f | 128 | |
timmey9 | 17:2f978f823020 | 129 | #include "mbed.h" |
timmey9 | 17:2f978f823020 | 130 | #include "EthernetInterface.h" |
timmey9 | 17:2f978f823020 | 131 | |
timmey9 | 17:2f978f823020 | 132 | #include "NetworkAPI/buffer.hpp" |
timmey9 | 17:2f978f823020 | 133 | #include "NetworkAPI/ip/address.hpp" |
timmey9 | 17:2f978f823020 | 134 | #include "NetworkAPI/tcp/socket.hpp" |
timmey9 | 18:b17ddeeb1c09 | 135 | |
timmey9 | 18:b17ddeeb1c09 | 136 | Serial pc(USBTX, USBRX); |
timmey9 | 18:b17ddeeb1c09 | 137 | DigitalOut led_red(LED_RED); |
timmey9 | 18:b17ddeeb1c09 | 138 | DigitalOut led_green(LED_GREEN); |
timmey9 | 18:b17ddeeb1c09 | 139 | DigitalOut led_blue(LED_BLUE); |
timmey9 | 17:2f978f823020 | 140 | |
timmey9 | 16:c3f922f61b8f | 141 | int main() { |
timmey9 | 18:b17ddeeb1c09 | 142 | led_red = 1; |
timmey9 | 18:b17ddeeb1c09 | 143 | led_green = 1; |
timmey9 | 18:b17ddeeb1c09 | 144 | led_blue = 1; |
timmey9 | 18:b17ddeeb1c09 | 145 | pc.baud(230400); |
timmey9 | 18:b17ddeeb1c09 | 146 | pc.printf("Starting Client\r\n"); |
timmey9 | 17:2f978f823020 | 147 | EthernetInterface interface; |
timmey9 | 17:2f978f823020 | 148 | interface.init(); |
timmey9 | 17:2f978f823020 | 149 | interface.connect(); |
timmey9 | 18:b17ddeeb1c09 | 150 | pc.printf("IP Address is %s\n\r", interface.getIPAddress()); |
timmey9 | 17:2f978f823020 | 151 | |
timmey9 | 17:2f978f823020 | 152 | int result; |
timmey9 | 17:2f978f823020 | 153 | |
timmey9 | 17:2f978f823020 | 154 | network::tcp::Socket socket; |
timmey9 | 17:2f978f823020 | 155 | network::Buffer buffer(256); |
timmey9 | 17:2f978f823020 | 156 | std::string request("GET /media/uploads/donatien/hello.txt HTTP/1.1\r\nHost: %s\r\n\r\n"); |
timmey9 | 16:c3f922f61b8f | 157 | |
timmey9 | 17:2f978f823020 | 158 | if (socket.open() < 0) { |
timmey9 | 18:b17ddeeb1c09 | 159 | pc.printf("Failed to open TCP Socket\n\r"); |
timmey9 | 17:2f978f823020 | 160 | return -1; |
timmey9 | 17:2f978f823020 | 161 | } |
timmey9 | 16:c3f922f61b8f | 162 | |
timmey9 | 17:2f978f823020 | 163 | if (socket.connect("mbed.org", 80) < 0) { |
timmey9 | 18:b17ddeeb1c09 | 164 | pc.printf("Failed to connect with mbed.org\n\r"); |
timmey9 | 17:2f978f823020 | 165 | return -1; |
timmey9 | 17:2f978f823020 | 166 | } |
timmey9 | 16:c3f922f61b8f | 167 | |
timmey9 | 17:2f978f823020 | 168 | if (socket.write((void *)request.data(), request.size()) < 0) { |
timmey9 | 18:b17ddeeb1c09 | 169 | pc.printf("Failed to write HTTP request\n\r"); |
timmey9 | 17:2f978f823020 | 170 | return -1; |
timmey9 | 17:2f978f823020 | 171 | } |
timmey9 | 17:2f978f823020 | 172 | |
timmey9 | 17:2f978f823020 | 173 | do |
timmey9 | 16:c3f922f61b8f | 174 | { |
timmey9 | 17:2f978f823020 | 175 | result = socket.read(buffer); |
timmey9 | 18:b17ddeeb1c09 | 176 | pc.printf("Received %d bytes:\n\r%s\n\r", result, (char *)buffer.data(0)); |
timmey9 | 17:2f978f823020 | 177 | } while(result > 0); |
timmey9 | 16:c3f922f61b8f | 178 | |
timmey9 | 17:2f978f823020 | 179 | socket.close(); |
timmey9 | 17:2f978f823020 | 180 | return 0; |
timmey9 | 17:2f978f823020 | 181 | } |
timmey9 | 16:c3f922f61b8f | 182 | |
timmey9 | 16:c3f922f61b8f | 183 | #endif |