Zoltan Hudak
/
TcpClient_ENC28J60
Simple TCP/IP Client using the UIPEthernet library for ENC28J60 Ethernet boards.
main.cpp@3:9c32e3375fc5, 2019-08-31 (annotated)
- Committer:
- hudakz
- Date:
- Sat Aug 31 20:48:02 2019 +0000
- Revision:
- 3:9c32e3375fc5
- Parent:
- 2:5656f7efd7c7
- Child:
- 4:9f42e50733be
Mbed OS 5 enabled.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:5e91bb901022 | 1 | /* |
hudakz | 3:9c32e3375fc5 | 2 | * TcpClient example using the UIPEthernet library for ENC28J60 Ethernet boards. |
hudakz | 0:5e91bb901022 | 3 | * |
hudakz | 0:5e91bb901022 | 4 | */ |
hudakz | 3:9c32e3375fc5 | 5 | #include "mbed.h" |
hudakz | 3:9c32e3375fc5 | 6 | #include "UipEthernet.h" |
hudakz | 3:9c32e3375fc5 | 7 | #include "TcpClient.h" |
hudakz | 0:5e91bb901022 | 8 | |
hudakz | 3:9c32e3375fc5 | 9 | const uint8_t MAC[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; |
hudakz | 3:9c32e3375fc5 | 10 | UipEthernet net(MAC, D11, D12, D13, D10); // mac, mosi, miso, sck, cs |
hudakz | 0:5e91bb901022 | 11 | |
hudakz | 3:9c32e3375fc5 | 12 | /** |
hudakz | 3:9c32e3375fc5 | 13 | * @brief |
hudakz | 3:9c32e3375fc5 | 14 | * @note |
hudakz | 3:9c32e3375fc5 | 15 | * @param |
hudakz | 3:9c32e3375fc5 | 16 | * @retval |
hudakz | 3:9c32e3375fc5 | 17 | */ |
hudakz | 0:5e91bb901022 | 18 | int main() |
hudakz | 0:5e91bb901022 | 19 | { |
hudakz | 3:9c32e3375fc5 | 20 | const time_t TIMEOUT = 5; // Connection timeout time |
hudakz | 3:9c32e3375fc5 | 21 | time_t timeOut; |
hudakz | 3:9c32e3375fc5 | 22 | char data[] = "GET / HTTP/1.1\r\nHost: ifconfig.io\r\nConnection: close\r\n\r\n"; |
hudakz | 3:9c32e3375fc5 | 23 | char* remaining; |
hudakz | 3:9c32e3375fc5 | 24 | uint8_t* recvBuf; |
hudakz | 3:9c32e3375fc5 | 25 | int result; |
hudakz | 3:9c32e3375fc5 | 26 | |
hudakz | 3:9c32e3375fc5 | 27 | printf("Starting ...\r\n"); |
hudakz | 3:9c32e3375fc5 | 28 | |
hudakz | 3:9c32e3375fc5 | 29 | net.connect(); |
hudakz | 0:5e91bb901022 | 30 | |
hudakz | 3:9c32e3375fc5 | 31 | // Show the network address |
hudakz | 3:9c32e3375fc5 | 32 | const char* ip = net.get_ip_address(); |
hudakz | 3:9c32e3375fc5 | 33 | const char* netmask = net.get_netmask(); |
hudakz | 3:9c32e3375fc5 | 34 | const char* gateway = net.get_gateway(); |
hudakz | 3:9c32e3375fc5 | 35 | printf("IP address: %s\n", ip ? ip : "None"); |
hudakz | 3:9c32e3375fc5 | 36 | printf("Netmask: %s\n", netmask ? netmask : "None"); |
hudakz | 3:9c32e3375fc5 | 37 | printf("Gateway: %s\n", gateway ? gateway : "None"); |
hudakz | 3:9c32e3375fc5 | 38 | |
hudakz | 3:9c32e3375fc5 | 39 | // Open a socket on the network interface, and create a TCP connection to ifconfig.io |
hudakz | 3:9c32e3375fc5 | 40 | TcpClient socket; |
hudakz | 3:9c32e3375fc5 | 41 | |
hudakz | 3:9c32e3375fc5 | 42 | result = socket.open(&net); |
hudakz | 3:9c32e3375fc5 | 43 | if (result != 0) { |
hudakz | 3:9c32e3375fc5 | 44 | printf("Error! socket.open() returned: %d\n", result); |
hudakz | 0:5e91bb901022 | 45 | } |
hudakz | 0:5e91bb901022 | 46 | |
hudakz | 3:9c32e3375fc5 | 47 | timeOut = time(NULL) + TIMEOUT; |
hudakz | 3:9c32e3375fc5 | 48 | printf("Connecting to the 'ifconfig.io' server ...\r\n"); |
hudakz | 3:9c32e3375fc5 | 49 | |
hudakz | 3:9c32e3375fc5 | 50 | result = socket.connect("ifconfig.io", 80); |
hudakz | 3:9c32e3375fc5 | 51 | if (result != 0) { |
hudakz | 3:9c32e3375fc5 | 52 | printf("Error! socket.connect() returned: %d\n", result); |
hudakz | 3:9c32e3375fc5 | 53 | goto DISCONNECT; |
hudakz | 3:9c32e3375fc5 | 54 | } |
hudakz | 3:9c32e3375fc5 | 55 | |
hudakz | 3:9c32e3375fc5 | 56 | printf("Server connected.\r\n"); |
hudakz | 3:9c32e3375fc5 | 57 | printf("Sending data to server:\r\n"); |
hudakz | 3:9c32e3375fc5 | 58 | remaining = data; |
hudakz | 3:9c32e3375fc5 | 59 | result = strlen(remaining); |
hudakz | 3:9c32e3375fc5 | 60 | while (result) { |
hudakz | 3:9c32e3375fc5 | 61 | result = socket.send((uint8_t*)remaining, strlen(remaining)); |
hudakz | 3:9c32e3375fc5 | 62 | if (result < 0) { |
hudakz | 3:9c32e3375fc5 | 63 | printf("Error! socket.send() returned: %d\n", result); |
hudakz | 3:9c32e3375fc5 | 64 | goto DISCONNECT; |
hudakz | 3:9c32e3375fc5 | 65 | } |
hudakz | 3:9c32e3375fc5 | 66 | printf("%.*s", result, remaining); |
hudakz | 3:9c32e3375fc5 | 67 | remaining += result; |
hudakz | 3:9c32e3375fc5 | 68 | } |
hudakz | 3:9c32e3375fc5 | 69 | |
hudakz | 3:9c32e3375fc5 | 70 | printf("Waiting for data from server:\r\n"); |
hudakz | 3:9c32e3375fc5 | 71 | while (socket.available() == 0) { |
hudakz | 3:9c32e3375fc5 | 72 | if (time(NULL) > timeOut) { |
hudakz | 3:9c32e3375fc5 | 73 | printf("Connection time out.\r\n"); |
hudakz | 3:9c32e3375fc5 | 74 | goto DISCONNECT; |
hudakz | 0:5e91bb901022 | 75 | } |
hudakz | 0:5e91bb901022 | 76 | } |
hudakz | 3:9c32e3375fc5 | 77 | |
hudakz | 3:9c32e3375fc5 | 78 | printf("Data received:\r\n"); |
hudakz | 3:9c32e3375fc5 | 79 | while ((result = socket.available()) > 0) { |
hudakz | 3:9c32e3375fc5 | 80 | recvBuf = (uint8_t*)malloc(result); |
hudakz | 3:9c32e3375fc5 | 81 | result = socket.recv(recvBuf, result); |
hudakz | 3:9c32e3375fc5 | 82 | if (result < 0) { |
hudakz | 3:9c32e3375fc5 | 83 | printf("Error! socket.recv() returned: %d\n", result); |
hudakz | 3:9c32e3375fc5 | 84 | goto DISCONNECT; |
hudakz | 3:9c32e3375fc5 | 85 | } |
hudakz | 3:9c32e3375fc5 | 86 | printf("%.*s\r\n", result, recvBuf); |
hudakz | 3:9c32e3375fc5 | 87 | free(recvBuf); |
hudakz | 3:9c32e3375fc5 | 88 | } |
hudakz | 3:9c32e3375fc5 | 89 | |
hudakz | 3:9c32e3375fc5 | 90 | printf("\r\n"); |
hudakz | 3:9c32e3375fc5 | 91 | |
hudakz | 3:9c32e3375fc5 | 92 | DISCONNECT: |
hudakz | 3:9c32e3375fc5 | 93 | // Close the socket to return its memory and bring down the network interface |
hudakz | 3:9c32e3375fc5 | 94 | socket.close(); |
hudakz | 3:9c32e3375fc5 | 95 | |
hudakz | 3:9c32e3375fc5 | 96 | // Bring down the ethernet interface |
hudakz | 3:9c32e3375fc5 | 97 | net.disconnect(); |
hudakz | 3:9c32e3375fc5 | 98 | printf("Done\n"); |
hudakz | 0:5e91bb901022 | 99 | } |