mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mayur098 0:8f8e8f3cbd1c 1 #include "mbed.h"
mayur098 0:8f8e8f3cbd1c 2 #include "ESP8266Interface.h"
mayur098 0:8f8e8f3cbd1c 3 #include "UDPSocket.h"
mayur098 0:8f8e8f3cbd1c 4 #include "greentea-client/test_env.h"
mayur098 0:8f8e8f3cbd1c 5 #include "unity/unity.h"
mayur098 0:8f8e8f3cbd1c 6 #include "utest.h"
mayur098 0:8f8e8f3cbd1c 7
mayur098 0:8f8e8f3cbd1c 8 using namespace utest::v1;
mayur098 0:8f8e8f3cbd1c 9
mayur098 0:8f8e8f3cbd1c 10
mayur098 0:8f8e8f3cbd1c 11 #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE
mayur098 0:8f8e8f3cbd1c 12 #define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64
mayur098 0:8f8e8f3cbd1c 13 #endif
mayur098 0:8f8e8f3cbd1c 14
mayur098 0:8f8e8f3cbd1c 15 #ifndef MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT
mayur098 0:8f8e8f3cbd1c 16 #define MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT 500
mayur098 0:8f8e8f3cbd1c 17 #endif
mayur098 0:8f8e8f3cbd1c 18
mayur098 0:8f8e8f3cbd1c 19 #ifndef MBED_CFG_ESP8266_TX
mayur098 0:8f8e8f3cbd1c 20 #define MBED_CFG_ESP8266_TX D1
mayur098 0:8f8e8f3cbd1c 21 #endif
mayur098 0:8f8e8f3cbd1c 22
mayur098 0:8f8e8f3cbd1c 23 #ifndef MBED_CFG_ESP8266_RX
mayur098 0:8f8e8f3cbd1c 24 #define MBED_CFG_ESP8266_RX D0
mayur098 0:8f8e8f3cbd1c 25 #endif
mayur098 0:8f8e8f3cbd1c 26
mayur098 0:8f8e8f3cbd1c 27 #ifndef MBED_CFG_ESP8266_DEBUG
mayur098 0:8f8e8f3cbd1c 28 #define MBED_CFG_ESP8266_DEBUG false
mayur098 0:8f8e8f3cbd1c 29 #endif
mayur098 0:8f8e8f3cbd1c 30
mayur098 0:8f8e8f3cbd1c 31 #define STRINGIZE(x) STRINGIZE2(x)
mayur098 0:8f8e8f3cbd1c 32 #define STRINGIZE2(x) #x
mayur098 0:8f8e8f3cbd1c 33
mayur098 0:8f8e8f3cbd1c 34
mayur098 0:8f8e8f3cbd1c 35 namespace {
mayur098 0:8f8e8f3cbd1c 36 char tx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
mayur098 0:8f8e8f3cbd1c 37 char rx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
mayur098 0:8f8e8f3cbd1c 38 const char ASCII_MAX = '~' - ' ';
mayur098 0:8f8e8f3cbd1c 39 const int ECHO_LOOPS = 16;
mayur098 0:8f8e8f3cbd1c 40 char uuid[48] = {0};
mayur098 0:8f8e8f3cbd1c 41 }
mayur098 0:8f8e8f3cbd1c 42
mayur098 0:8f8e8f3cbd1c 43 void prep_buffer(char *uuid, char *tx_buffer, size_t tx_size) {
mayur098 0:8f8e8f3cbd1c 44 size_t i = 0;
mayur098 0:8f8e8f3cbd1c 45
mayur098 0:8f8e8f3cbd1c 46 memcpy(tx_buffer, uuid, strlen(uuid));
mayur098 0:8f8e8f3cbd1c 47 i += strlen(uuid);
mayur098 0:8f8e8f3cbd1c 48
mayur098 0:8f8e8f3cbd1c 49 tx_buffer[i++] = ' ';
mayur098 0:8f8e8f3cbd1c 50
mayur098 0:8f8e8f3cbd1c 51 for (; i<tx_size; ++i) {
mayur098 0:8f8e8f3cbd1c 52 tx_buffer[i] = (rand() % 10) + '0';
mayur098 0:8f8e8f3cbd1c 53 }
mayur098 0:8f8e8f3cbd1c 54 }
mayur098 0:8f8e8f3cbd1c 55
mayur098 0:8f8e8f3cbd1c 56 void test_udp_echo() {
mayur098 0:8f8e8f3cbd1c 57 ESP8266Interface net(MBED_CFG_ESP8266_TX, MBED_CFG_ESP8266_RX, MBED_CFG_ESP8266_DEBUG);
mayur098 0:8f8e8f3cbd1c 58
mayur098 0:8f8e8f3cbd1c 59 int err = net.connect(STRINGIZE(MBED_CFG_ESP8266_SSID), STRINGIZE(MBED_CFG_ESP8266_PASS));
mayur098 0:8f8e8f3cbd1c 60 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 61
mayur098 0:8f8e8f3cbd1c 62 if (err) {
mayur098 0:8f8e8f3cbd1c 63 printf("MBED: failed to connect with an error of %d\r\n", err);
mayur098 0:8f8e8f3cbd1c 64 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 65 }
mayur098 0:8f8e8f3cbd1c 66
mayur098 0:8f8e8f3cbd1c 67 printf("UDP client IP Address is %s\n", net.get_ip_address());
mayur098 0:8f8e8f3cbd1c 68
mayur098 0:8f8e8f3cbd1c 69 greentea_send_kv("target_ip", net.get_ip_address());
mayur098 0:8f8e8f3cbd1c 70
mayur098 0:8f8e8f3cbd1c 71 char recv_key[] = "host_port";
mayur098 0:8f8e8f3cbd1c 72 char ipbuf[60] = {0};
mayur098 0:8f8e8f3cbd1c 73 char portbuf[16] = {0};
mayur098 0:8f8e8f3cbd1c 74 unsigned int port = 0;
mayur098 0:8f8e8f3cbd1c 75
mayur098 0:8f8e8f3cbd1c 76 UDPSocket sock;
mayur098 0:8f8e8f3cbd1c 77 sock.open(&net);
mayur098 0:8f8e8f3cbd1c 78 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
mayur098 0:8f8e8f3cbd1c 79
mayur098 0:8f8e8f3cbd1c 80 greentea_send_kv("host_ip", " ");
mayur098 0:8f8e8f3cbd1c 81 greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf));
mayur098 0:8f8e8f3cbd1c 82
mayur098 0:8f8e8f3cbd1c 83 greentea_send_kv("host_port", " ");
mayur098 0:8f8e8f3cbd1c 84 greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf));
mayur098 0:8f8e8f3cbd1c 85 sscanf(portbuf, "%u", &port);
mayur098 0:8f8e8f3cbd1c 86
mayur098 0:8f8e8f3cbd1c 87 printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port);
mayur098 0:8f8e8f3cbd1c 88 SocketAddress udp_addr(ipbuf, port);
mayur098 0:8f8e8f3cbd1c 89
mayur098 0:8f8e8f3cbd1c 90 int success = 0;
mayur098 0:8f8e8f3cbd1c 91 for (int i = 0; success < ECHO_LOOPS; i++) {
mayur098 0:8f8e8f3cbd1c 92 prep_buffer(uuid, tx_buffer, sizeof(tx_buffer));
mayur098 0:8f8e8f3cbd1c 93 const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
mayur098 0:8f8e8f3cbd1c 94 if (ret >= 0) {
mayur098 0:8f8e8f3cbd1c 95 printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer);
mayur098 0:8f8e8f3cbd1c 96 } else {
mayur098 0:8f8e8f3cbd1c 97 printf("[%02d] Network error %d\n", i, ret);
mayur098 0:8f8e8f3cbd1c 98 continue;
mayur098 0:8f8e8f3cbd1c 99 }
mayur098 0:8f8e8f3cbd1c 100
mayur098 0:8f8e8f3cbd1c 101 SocketAddress temp_addr;
mayur098 0:8f8e8f3cbd1c 102 const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
mayur098 0:8f8e8f3cbd1c 103 if (n >= 0) {
mayur098 0:8f8e8f3cbd1c 104 printf("[%02d] recv %d bytes - %.*s \n", i, n, n, tx_buffer);
mayur098 0:8f8e8f3cbd1c 105 } else {
mayur098 0:8f8e8f3cbd1c 106 printf("[%02d] Network error %d\n", i, n);
mayur098 0:8f8e8f3cbd1c 107 continue;
mayur098 0:8f8e8f3cbd1c 108 }
mayur098 0:8f8e8f3cbd1c 109
mayur098 0:8f8e8f3cbd1c 110 if ((temp_addr == udp_addr &&
mayur098 0:8f8e8f3cbd1c 111 n == sizeof(tx_buffer) &&
mayur098 0:8f8e8f3cbd1c 112 memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
mayur098 0:8f8e8f3cbd1c 113 success += 1;
mayur098 0:8f8e8f3cbd1c 114
mayur098 0:8f8e8f3cbd1c 115 printf("[%02d] success #%d\n", i, success);
mayur098 0:8f8e8f3cbd1c 116 continue;
mayur098 0:8f8e8f3cbd1c 117 }
mayur098 0:8f8e8f3cbd1c 118
mayur098 0:8f8e8f3cbd1c 119 // failed, clean out any remaining bad packets
mayur098 0:8f8e8f3cbd1c 120 sock.set_timeout(0);
mayur098 0:8f8e8f3cbd1c 121 while (true) {
mayur098 0:8f8e8f3cbd1c 122 err = sock.recvfrom(NULL, NULL, 0);
mayur098 0:8f8e8f3cbd1c 123 if (err == NSAPI_ERROR_WOULD_BLOCK) {
mayur098 0:8f8e8f3cbd1c 124 break;
mayur098 0:8f8e8f3cbd1c 125 }
mayur098 0:8f8e8f3cbd1c 126 }
mayur098 0:8f8e8f3cbd1c 127 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
mayur098 0:8f8e8f3cbd1c 128 }
mayur098 0:8f8e8f3cbd1c 129
mayur098 0:8f8e8f3cbd1c 130 sock.close();
mayur098 0:8f8e8f3cbd1c 131 net.disconnect();
mayur098 0:8f8e8f3cbd1c 132 TEST_ASSERT_EQUAL(ECHO_LOOPS, success);
mayur098 0:8f8e8f3cbd1c 133 }
mayur098 0:8f8e8f3cbd1c 134
mayur098 0:8f8e8f3cbd1c 135
mayur098 0:8f8e8f3cbd1c 136 // Test setup
mayur098 0:8f8e8f3cbd1c 137 utest::v1::status_t test_setup(const size_t number_of_cases) {
mayur098 0:8f8e8f3cbd1c 138 GREENTEA_SETUP(120, "udp_echo");
mayur098 0:8f8e8f3cbd1c 139 return verbose_test_setup_handler(number_of_cases);
mayur098 0:8f8e8f3cbd1c 140 }
mayur098 0:8f8e8f3cbd1c 141
mayur098 0:8f8e8f3cbd1c 142 Case cases[] = {
mayur098 0:8f8e8f3cbd1c 143 Case("UDP echo", test_udp_echo),
mayur098 0:8f8e8f3cbd1c 144 };
mayur098 0:8f8e8f3cbd1c 145
mayur098 0:8f8e8f3cbd1c 146 Specification specification(test_setup, cases);
mayur098 0:8f8e8f3cbd1c 147
mayur098 0:8f8e8f3cbd1c 148 int main() {
mayur098 0:8f8e8f3cbd1c 149 return !Harness::run(specification);
mayur098 0:8f8e8f3cbd1c 150 }
mayur098 0:8f8e8f3cbd1c 151