Multi-Hackers / SocketModem

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
sgodinez
Date:
Fri Dec 20 16:26:10 2013 +0000
Revision:
55:56d9a9d98079
Child:
71:82205735732b
Got UDP working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgodinez 55:56d9a9d98079 1 #ifndef _TEST_UDP_SOCKET_ECHO_H_
sgodinez 55:56d9a9d98079 2 #define _TEST_UDP_SOCKET_ECHO_H_
sgodinez 55:56d9a9d98079 3
sgodinez 55:56d9a9d98079 4
sgodinez 55:56d9a9d98079 5 //Setup a netcat server with command: ncat -l 5798 -k -c 'xargs -n1 --null echo'
sgodinez 55:56d9a9d98079 6
sgodinez 55:56d9a9d98079 7 void testUdpSocket() {
sgodinez 55:56d9a9d98079 8 using namespace mts;
sgodinez 55:56d9a9d98079 9
sgodinez 55:56d9a9d98079 10 Cellular::Code code;
sgodinez 55:56d9a9d98079 11 const int TEST_PORT = 5798;
sgodinez 55:56d9a9d98079 12 const std::string TEST_SERVER("204.26.122.96");
sgodinez 55:56d9a9d98079 13 const char buffer[] = "*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890*";
sgodinez 55:56d9a9d98079 14 const int size = sizeof(buffer);
sgodinez 55:56d9a9d98079 15 char receiveBuffer[size];
sgodinez 55:56d9a9d98079 16
sgodinez 55:56d9a9d98079 17 printf("UDP SOCKET TESTING\r\n");
sgodinez 55:56d9a9d98079 18 printf("Setting APN\r\n");
sgodinez 55:56d9a9d98079 19 code = Cellular::getInstance()->setApn("b2b.tmobile.com");
sgodinez 55:56d9a9d98079 20 if(code == Cellular::CELL_OK) {
sgodinez 55:56d9a9d98079 21 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 22 } else {
sgodinez 55:56d9a9d98079 23 printf("Error during APN setup [%d]\r\n", (int)code);
sgodinez 55:56d9a9d98079 24 }
sgodinez 55:56d9a9d98079 25
sgodinez 55:56d9a9d98079 26 printf("Setting Socket Closeable\r\n");
sgodinez 55:56d9a9d98079 27 code = Cellular::getInstance()->setSocketCloseable();
sgodinez 55:56d9a9d98079 28 if(code == Cellular::CELL_OK) {
sgodinez 55:56d9a9d98079 29 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 30 } else {
sgodinez 55:56d9a9d98079 31 printf("Error setting socket closeable [%d]\r\n", (int)code);
sgodinez 55:56d9a9d98079 32 }
sgodinez 55:56d9a9d98079 33
sgodinez 55:56d9a9d98079 34 printf("Setting Local Port\r\n");
sgodinez 55:56d9a9d98079 35 if(Cellular::getInstance()->bind(5000)) {
sgodinez 55:56d9a9d98079 36 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 37 } else {
sgodinez 55:56d9a9d98079 38 printf("Error setting local port [%d]\r\n", (int)code);
sgodinez 55:56d9a9d98079 39 }
sgodinez 55:56d9a9d98079 40
sgodinez 55:56d9a9d98079 41 printf("Setting Primary DNS\r\n");
sgodinez 55:56d9a9d98079 42 code = Cellular::getInstance()->setDns("8.8.8.8");
sgodinez 55:56d9a9d98079 43 if(code == Cellular::CELL_OK) {
sgodinez 55:56d9a9d98079 44 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 45 } else {
sgodinez 55:56d9a9d98079 46 printf("Error setting primary DNS [%d]\r\n", (int)code);
sgodinez 55:56d9a9d98079 47 }
sgodinez 55:56d9a9d98079 48
sgodinez 55:56d9a9d98079 49 printf("Establishing PPP Connection\r\n");
sgodinez 55:56d9a9d98079 50 if(Cellular::getInstance()->connect()) {
sgodinez 55:56d9a9d98079 51 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 52 } else {
sgodinez 55:56d9a9d98079 53 printf("Error during PPP connection. Aborting.\r\n");
sgodinez 55:56d9a9d98079 54 return;
sgodinez 55:56d9a9d98079 55 }
sgodinez 55:56d9a9d98079 56
sgodinez 55:56d9a9d98079 57 printf("Opening a UDP Socket\r\n");
sgodinez 55:56d9a9d98079 58 if(Cellular::getInstance()->open(TEST_SERVER, TEST_PORT, IPStack::UDP)) {
sgodinez 55:56d9a9d98079 59 printf("Success!\r\n");
sgodinez 55:56d9a9d98079 60 } else {
sgodinez 55:56d9a9d98079 61 printf("Error during UDP socket open [%s:%d]. Aborting.\r\n", TEST_SERVER.c_str(), TEST_PORT);
sgodinez 55:56d9a9d98079 62 return;
sgodinez 55:56d9a9d98079 63 }
sgodinez 55:56d9a9d98079 64
sgodinez 55:56d9a9d98079 65 printf("Sending buffer\r\n");
sgodinez 55:56d9a9d98079 66 int bytesWritten = Cellular::getInstance()->write(buffer, size, 10000);
sgodinez 55:56d9a9d98079 67 if(bytesWritten == size) {
sgodinez 55:56d9a9d98079 68 printf("Successfully sent buffer\r\n");
sgodinez 55:56d9a9d98079 69 } else {
sgodinez 55:56d9a9d98079 70 printf("Failed to send buffer. Closing socket and aborting.\r\n");
sgodinez 55:56d9a9d98079 71 Cellular::getInstance()->close();
sgodinez 55:56d9a9d98079 72 return;
sgodinez 55:56d9a9d98079 73 }
sgodinez 55:56d9a9d98079 74
sgodinez 55:56d9a9d98079 75 printf("Receiving echo (timeout = 15 seconds)\r\n");
sgodinez 55:56d9a9d98079 76 Timer tmr;
sgodinez 55:56d9a9d98079 77 int bytesRead = 0;
sgodinez 55:56d9a9d98079 78 tmr.start();
sgodinez 55:56d9a9d98079 79 do {
sgodinez 55:56d9a9d98079 80 int status = Cellular::getInstance()->read(&receiveBuffer[bytesRead], size - bytesRead, 1000);
sgodinez 55:56d9a9d98079 81 if(status != -1) {
sgodinez 55:56d9a9d98079 82 bytesRead += status;
sgodinez 55:56d9a9d98079 83 } else {
sgodinez 55:56d9a9d98079 84 printf("Error reading from socket. Closing socket and aborting.\r\n");
sgodinez 55:56d9a9d98079 85 Cellular::getInstance()->close();
sgodinez 55:56d9a9d98079 86 return;
sgodinez 55:56d9a9d98079 87 }
sgodinez 55:56d9a9d98079 88 printf("Total bytes read %d\r\n", bytesRead);
sgodinez 55:56d9a9d98079 89 } while (tmr.read_ms() <= 15000 && bytesRead < size);
sgodinez 55:56d9a9d98079 90
sgodinez 55:56d9a9d98079 91
sgodinez 55:56d9a9d98079 92 //Safely Cap at Max Size
sgodinez 55:56d9a9d98079 93 receiveBuffer[size - 1] = '\0';
sgodinez 55:56d9a9d98079 94 printf("Comparing Buffers\r\n");
sgodinez 55:56d9a9d98079 95 printf("SENT: [%s]\r\n", buffer);
sgodinez 55:56d9a9d98079 96 printf("RECV: [%s]\r\n", receiveBuffer);
sgodinez 55:56d9a9d98079 97
sgodinez 55:56d9a9d98079 98 printf("Closing socket\r\n");
sgodinez 55:56d9a9d98079 99 Cellular::getInstance()->close();
sgodinez 55:56d9a9d98079 100
sgodinez 55:56d9a9d98079 101
sgodinez 55:56d9a9d98079 102 printf("Disconnecting\r\n");
sgodinez 55:56d9a9d98079 103 Cellular::getInstance()->disconnect();
sgodinez 55:56d9a9d98079 104 }
sgodinez 55:56d9a9d98079 105
sgodinez 55:56d9a9d98079 106 #endif