David Fletcher / Mbed 2 deprecated cc3100_Test_websock_Camera_CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Sun Jul 05 22:18:04 2015 +0000
Revision:
7:a069c1750fbc
Parent:
6:37fb696395d7
Child:
12:7d75ba5deed1
WIP commit 8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // Copyright (C) 2014 Texas Instruments Incorporated
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // All rights reserved. Property of Texas Instruments Incorporated.
dflet 0:50cedd586816 5 // Restricted rights to use, duplicate or disclose this code are
dflet 0:50cedd586816 6 // granted through contract.
dflet 0:50cedd586816 7 // The program may not be used without the written permission of
dflet 0:50cedd586816 8 // Texas Instruments Incorporated or against the terms and conditions
dflet 0:50cedd586816 9 // stipulated in the agreement under which this program has been supplied,
dflet 0:50cedd586816 10 // and under no circumstances can it be used with non-TI connectivity device.
dflet 0:50cedd586816 11 //
dflet 0:50cedd586816 12 //*****************************************************************************
dflet 0:50cedd586816 13
dflet 0:50cedd586816 14
dflet 0:50cedd586816 15 /**
dflet 0:50cedd586816 16 * @defgroup HttpSocket
dflet 0:50cedd586816 17 * This module performs all HTTP socket operations
dflet 0:50cedd586816 18 *
dflet 0:50cedd586816 19 * @{
dflet 0:50cedd586816 20 */
dflet 0:50cedd586816 21
dflet 0:50cedd586816 22 #include <string.h>
dflet 0:50cedd586816 23 #include "HttpDebug.h"
dflet 0:50cedd586816 24 #include "HttpSocket.h"
dflet 0:50cedd586816 25 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 26 #include "cc3100_socket.h"
dflet 0:50cedd586816 27
dflet 0:50cedd586816 28 #include "osi.h"
dflet 0:50cedd586816 29
dflet 0:50cedd586816 30 using namespace mbed_cc3100;
dflet 0:50cedd586816 31
dflet 0:50cedd586816 32 cc3100 _cc3100_Module(NC, NC, PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck
dflet 0:50cedd586816 33
dflet 0:50cedd586816 34 #define OSI_DELAY(x) osi_Sleep(x); //os idle
dflet 0:50cedd586816 35
dflet 0:50cedd586816 36 int OpenTCPServerSocket(unsigned int uiPortNum)
dflet 0:50cedd586816 37 {
dflet 0:50cedd586816 38 int iSockDesc, iRetVal;
dflet 0:50cedd586816 39 sockaddr_in sServerAddress;
dflet 0:50cedd586816 40 SlSockNonblocking_t enableOption;
dflet 0:50cedd586816 41 enableOption.NonblockingEnabled = 1;
dflet 0:50cedd586816 42
dflet 0:50cedd586816 43 //
dflet 0:50cedd586816 44 // opens a secure socket
dflet 0:50cedd586816 45 //
dflet 0:50cedd586816 46 if(443 == uiPortNum)
dflet 0:50cedd586816 47 {
dflet 0:50cedd586816 48 iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
dflet 0:50cedd586816 49 }
dflet 0:50cedd586816 50 else //non secure
dflet 0:50cedd586816 51 {
dflet 0:50cedd586816 52 iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_IPPROTO_TCP);
dflet 0:50cedd586816 53 }
dflet 0:50cedd586816 54
dflet 0:50cedd586816 55 if( iSockDesc < 0 )
dflet 0:50cedd586816 56 {
dflet 0:50cedd586816 57 return -1;
dflet 0:50cedd586816 58 }
dflet 0:50cedd586816 59 //non blocking socket - Enable nonblocking mode
dflet 0:50cedd586816 60 iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption));
dflet 0:50cedd586816 61 if(iRetVal < 0)
dflet 0:50cedd586816 62 {
dflet 0:50cedd586816 63 CloseTCPServerSocket(iSockDesc);
dflet 0:50cedd586816 64 return -1;
dflet 0:50cedd586816 65 }
dflet 0:50cedd586816 66
dflet 0:50cedd586816 67 if(443 == uiPortNum)
dflet 0:50cedd586816 68 {
dflet 0:50cedd586816 69 iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc, SL_SOL_SOCKET, SL_SO_SECURE_FILES_PRIVATE_KEY_FILE_NAME,SL_SSL_SRV_KEY, strlen(SL_SSL_SRV_KEY));
dflet 0:50cedd586816 70 if( iRetVal < 0 )
dflet 0:50cedd586816 71 {
dflet 0:50cedd586816 72 CloseTCPServerSocket(iSockDesc);
dflet 0:50cedd586816 73 return -1;
dflet 0:50cedd586816 74 }
dflet 0:50cedd586816 75 iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc, SL_SOL_SOCKET, SL_SO_SECURE_FILES_CERTIFICATE_FILE_NAME,SL_SSL_SRV_CERT, strlen(SL_SSL_SRV_CERT));
dflet 0:50cedd586816 76 if( iRetVal < 0 )
dflet 0:50cedd586816 77 {
dflet 0:50cedd586816 78 CloseTCPServerSocket(iSockDesc);
dflet 0:50cedd586816 79 return -1;
dflet 0:50cedd586816 80 }
dflet 0:50cedd586816 81 }
dflet 0:50cedd586816 82
dflet 0:50cedd586816 83 //
dflet 0:50cedd586816 84 // Bind - Assign a port to the socket
dflet 0:50cedd586816 85 //
dflet 0:50cedd586816 86 sServerAddress.sin_family = AF_INET;
dflet 0:50cedd586816 87 sServerAddress.sin_addr.s_addr = _cc3100_Module._socket.htonl(INADDR_ANY);
dflet 0:50cedd586816 88 sServerAddress.sin_port = _cc3100_Module._socket.htons(uiPortNum);
dflet 0:50cedd586816 89 if ( _cc3100_Module._socket.bind(iSockDesc, (sockaddr*)&sServerAddress, sizeof(sServerAddress)) != 0 )
dflet 0:50cedd586816 90 {
dflet 0:50cedd586816 91 CloseTCPServerSocket(iSockDesc);
dflet 0:50cedd586816 92 return -1;
dflet 0:50cedd586816 93 }
dflet 0:50cedd586816 94
dflet 0:50cedd586816 95 return iSockDesc;
dflet 0:50cedd586816 96 }
dflet 0:50cedd586816 97
dflet 0:50cedd586816 98 int CreateTCPServerSocket(unsigned int uiPortNum)
dflet 0:50cedd586816 99 {
dflet 0:50cedd586816 100 int iSockDesc = -1;
dflet 0:50cedd586816 101 unsigned char connectRetries = 0;
dflet 0:50cedd586816 102
dflet 0:50cedd586816 103 while (connectRetries++ < SERVER_MAX_SETUP_RETRY_COUNT)
dflet 0:50cedd586816 104 {
dflet 0:50cedd586816 105 iSockDesc = OpenTCPServerSocket(uiPortNum);
dflet 0:50cedd586816 106
dflet 0:50cedd586816 107 if (iSockDesc < 0)
dflet 0:50cedd586816 108 {
dflet 0:50cedd586816 109 continue;
dflet 0:50cedd586816 110 }
dflet 0:50cedd586816 111
dflet 0:50cedd586816 112 if(_cc3100_Module._socket.listen(iSockDesc, HTTP_CORE_MAX_CONNECTIONS) != 0)
dflet 0:50cedd586816 113 {
dflet 0:50cedd586816 114 CloseTCPServerSocket(iSockDesc);
dflet 0:50cedd586816 115 iSockDesc = -1;
dflet 0:50cedd586816 116 continue;
dflet 0:50cedd586816 117 }
dflet 0:50cedd586816 118 else
dflet 0:50cedd586816 119 {
dflet 0:50cedd586816 120 connectRetries = 0;
dflet 0:50cedd586816 121 break;
dflet 0:50cedd586816 122 }
dflet 0:50cedd586816 123 }
dflet 0:50cedd586816 124
dflet 0:50cedd586816 125 return iSockDesc;
dflet 0:50cedd586816 126 }
dflet 0:50cedd586816 127
dflet 0:50cedd586816 128 int CloseTCPServerSocket(int iSockDesc)
dflet 0:50cedd586816 129 {
dflet 0:50cedd586816 130 int ittr = 0;
dflet 0:50cedd586816 131
dflet 0:50cedd586816 132 if(iSockDesc < 0)
dflet 0:50cedd586816 133 {
dflet 0:50cedd586816 134 return 0 ;
dflet 0:50cedd586816 135 }
dflet 0:50cedd586816 136
dflet 0:50cedd586816 137 do
dflet 0:50cedd586816 138 {
dflet 0:50cedd586816 139 if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0)
dflet 0:50cedd586816 140 {
dflet 0:50cedd586816 141 iSockDesc = -1;
dflet 0:50cedd586816 142 HttpDebug("Http server socket closed\n\r");
dflet 0:50cedd586816 143 return 0;
dflet 0:50cedd586816 144 }
dflet 0:50cedd586816 145 else
dflet 0:50cedd586816 146 {
dflet 0:50cedd586816 147 HttpDebug("\n Http client socket close error\n\r");
dflet 0:50cedd586816 148 OSI_DELAY(500);//wait 500ms
dflet 0:50cedd586816 149 }
dflet 0:50cedd586816 150 ittr++;
dflet 0:50cedd586816 151 }while(ittr < 3);
dflet 0:50cedd586816 152
dflet 0:50cedd586816 153 return -1;
dflet 0:50cedd586816 154 }
dflet 0:50cedd586816 155
dflet 0:50cedd586816 156 int CreateTCPClientSocket(int iSockDesc)
dflet 0:50cedd586816 157 {
dflet 0:50cedd586816 158 sockaddr sClientAddr;
dflet 0:50cedd586816 159 SlSocklen_t uiClientAddrLen = sizeof(sClientAddr);
dflet 0:50cedd586816 160 int sock = -1;
dflet 0:50cedd586816 161 SlTimeval_t timeVal;
dflet 0:50cedd586816 162 SlSockNonblocking_t enableOption;
dflet 0:50cedd586816 163
dflet 0:50cedd586816 164 sock = _cc3100_Module._socket.accept(iSockDesc, &sClientAddr, &uiClientAddrLen);
dflet 0:50cedd586816 165 if(sock >= 0)
dflet 0:50cedd586816 166 {
dflet 0:50cedd586816 167 enableOption.NonblockingEnabled = 0;
dflet 0:50cedd586816 168
dflet 0:50cedd586816 169 //Blocking socket - Enable blocking mode
dflet 0:50cedd586816 170 if(_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption)) < 0)
dflet 0:50cedd586816 171 {
dflet 0:50cedd586816 172 CloseTCPClientSocket(sock);
dflet 0:50cedd586816 173 return -1;
dflet 0:50cedd586816 174 }
dflet 0:50cedd586816 175
dflet 0:50cedd586816 176 timeVal.tv_sec = 1; // 1 Seconds
dflet 0:50cedd586816 177 timeVal.tv_usec = 0; // Microseconds. 10000 microseconds resoultion
dflet 0:50cedd586816 178 if((_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_RCVTIMEO, &timeVal, sizeof(timeVal))) < 0)
dflet 0:50cedd586816 179 {
dflet 0:50cedd586816 180 CloseTCPClientSocket(sock);
dflet 0:50cedd586816 181 return -1;
dflet 0:50cedd586816 182 }// Enable receive timeout
dflet 0:50cedd586816 183 }
dflet 0:50cedd586816 184 return sock;
dflet 0:50cedd586816 185 }
dflet 0:50cedd586816 186
dflet 0:50cedd586816 187 int CloseTCPClientSocket(int iSockDesc)
dflet 0:50cedd586816 188 {
dflet 0:50cedd586816 189 int ittr = 0;
dflet 0:50cedd586816 190
dflet 0:50cedd586816 191 if(iSockDesc < 0)
dflet 0:50cedd586816 192 {
dflet 0:50cedd586816 193 return 0;
dflet 0:50cedd586816 194 }
dflet 0:50cedd586816 195
dflet 0:50cedd586816 196 do
dflet 0:50cedd586816 197 {
dflet 0:50cedd586816 198 if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0)
dflet 0:50cedd586816 199 {
dflet 0:50cedd586816 200 iSockDesc = -1;
dflet 0:50cedd586816 201 // HttpDebug("\n Http client socket closed\n\r");
dflet 0:50cedd586816 202
dflet 0:50cedd586816 203 return 0;
dflet 0:50cedd586816 204 }
dflet 0:50cedd586816 205 else
dflet 0:50cedd586816 206 {
dflet 0:50cedd586816 207 HttpDebug("\n client socket close error\n\r");
dflet 0:50cedd586816 208 OSI_DELAY(500);//wait 500ms
dflet 0:50cedd586816 209 }
dflet 0:50cedd586816 210 ittr++;
dflet 0:50cedd586816 211 }while(ittr < 3);
dflet 0:50cedd586816 212
dflet 0:50cedd586816 213 return -1;
dflet 0:50cedd586816 214 }
dflet 0:50cedd586816 215
dflet 0:50cedd586816 216 int ClientSocketSend(long socket, char * buffer, unsigned int len)
dflet 0:50cedd586816 217 {
dflet 7:a069c1750fbc 218 // HttpDebug("\r\n ClientSocketSend\n\r");
dflet 0:50cedd586816 219 int send_len = 0, Ittr = 0;
dflet 0:50cedd586816 220
dflet 0:50cedd586816 221 do
dflet 0:50cedd586816 222 {
dflet 0:50cedd586816 223 send_len = (int)_cc3100_Module._socket.send((int)socket, buffer, (int)len, 0);
dflet 0:50cedd586816 224
dflet 0:50cedd586816 225 if(send_len > 0)
dflet 0:50cedd586816 226 {
dflet 0:50cedd586816 227 if(len != send_len)
dflet 0:50cedd586816 228 {
dflet 0:50cedd586816 229 HttpDebug("client Send length is not matching %d \n\r", send_len);
dflet 0:50cedd586816 230 send_len = -1;
dflet 0:50cedd586816 231 }
dflet 0:50cedd586816 232 return send_len;
dflet 0:50cedd586816 233 }
dflet 0:50cedd586816 234 else if(send_len != SL_EAGAIN)
dflet 0:50cedd586816 235 {
dflet 0:50cedd586816 236 HttpDebug("\n client socket send error %d\n\r", send_len);
dflet 0:50cedd586816 237 return -1;
dflet 0:50cedd586816 238 }
dflet 0:50cedd586816 239
dflet 0:50cedd586816 240 Ittr++;
dflet 0:50cedd586816 241
dflet 0:50cedd586816 242 } while((SL_EAGAIN == send_len));
dflet 0:50cedd586816 243
dflet 0:50cedd586816 244 HttpDebug("\n client send time out %d\n\r", send_len);
dflet 0:50cedd586816 245
dflet 0:50cedd586816 246 return -1;
dflet 0:50cedd586816 247 }
dflet 0:50cedd586816 248
dflet 0:50cedd586816 249
dflet 0:50cedd586816 250 /// @}
dflet 0:50cedd586816 251