TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HttpSocket.cpp Source File

HttpSocket.cpp

00001 //*****************************************************************************
00002 // Copyright (C) 2014 Texas Instruments Incorporated
00003 //
00004 // All rights reserved. Property of Texas Instruments Incorporated.
00005 // Restricted rights to use, duplicate or disclose this code are
00006 // granted through contract.
00007 // The program may not be used without the written permission of
00008 // Texas Instruments Incorporated or against the terms and conditions
00009 // stipulated in the agreement under which this program has been supplied,
00010 // and under no circumstances can it be used with non-TI connectivity device.
00011 //
00012 //*****************************************************************************
00013 
00014 
00015 /**
00016  * @defgroup HttpSocket
00017  * This module performs all HTTP socket operations
00018  *
00019  * @{
00020  */
00021 
00022 #include <string.h>
00023 #include "HttpDebug.h"
00024 #include "HttpSocket.h"
00025 #include "cc3100_simplelink.h"
00026 #include "cc3100_socket.h"
00027 
00028 #include "osi.h"
00029 
00030 using namespace mbed_cc3100;
00031 
00032 cc3100 _cc3100_Module(NC, NC, p9, p10, p8, SPI(p5, p6, p7));//LPC1768  irq, nHib, cs, mosi, miso, sck
00033 
00034 #define OSI_DELAY(x)    osi_Sleep(x); //os idle
00035 
00036 int OpenTCPServerSocket(unsigned int uiPortNum)
00037 {
00038   int iSockDesc, iRetVal;
00039   sockaddr_in sServerAddress;
00040   SlSockNonblocking_t enableOption;
00041   enableOption.NonblockingEnabled = 1;
00042 
00043   //
00044   // opens a secure socket
00045   //
00046   if(443 == uiPortNum)
00047   {
00048     iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
00049     }
00050     else //non secure
00051     {
00052         iSockDesc = _cc3100_Module._socket.sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_IPPROTO_TCP);
00053     }
00054 
00055   if( iSockDesc < 0 )
00056   {
00057      return -1;
00058   }
00059   //non blocking socket - Enable nonblocking mode
00060   iRetVal = _cc3100_Module._socket.sl_SetSockOpt(iSockDesc,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption));
00061   if(iRetVal < 0)
00062   {
00063     CloseTCPServerSocket(iSockDesc);
00064     return -1;
00065   }
00066 
00067   if(443 == uiPortNum)
00068   {
00069         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));
00070         if( iRetVal < 0 )
00071         {
00072                 CloseTCPServerSocket(iSockDesc);
00073                 return -1;
00074         }
00075         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));
00076         if( iRetVal < 0 )
00077         {
00078                 CloseTCPServerSocket(iSockDesc);
00079                 return -1;
00080         }
00081     }
00082 
00083   //
00084   // Bind - Assign a port to the socket
00085   //
00086   sServerAddress.sin_family = AF_INET;
00087   sServerAddress.sin_addr.s_addr = _cc3100_Module._socket.htonl(INADDR_ANY);
00088   sServerAddress.sin_port = _cc3100_Module._socket.htons(uiPortNum);
00089   if ( _cc3100_Module._socket.bind(iSockDesc, (sockaddr*)&sServerAddress, sizeof(sServerAddress)) != 0 )
00090   {
00091     CloseTCPServerSocket(iSockDesc);
00092     return -1;
00093   }
00094 
00095   return iSockDesc;
00096 }
00097 
00098 int CreateTCPServerSocket(unsigned int uiPortNum)
00099 {
00100   int iSockDesc = -1;
00101   unsigned char connectRetries = 0;
00102 
00103   while (connectRetries++ < SERVER_MAX_SETUP_RETRY_COUNT)
00104   {
00105     iSockDesc = OpenTCPServerSocket(uiPortNum);
00106 
00107     if (iSockDesc < 0)
00108     {
00109       continue;
00110     }
00111 
00112     if(_cc3100_Module._socket.listen(iSockDesc, HTTP_CORE_MAX_CONNECTIONS) != 0)
00113     {
00114       CloseTCPServerSocket(iSockDesc);
00115       iSockDesc = -1;
00116       continue;
00117     }
00118     else
00119     {
00120       connectRetries = 0;
00121       break;
00122     }
00123   }
00124 
00125   return iSockDesc;
00126 }
00127 
00128 int CloseTCPServerSocket(int iSockDesc)
00129 {
00130   int ittr = 0;
00131 
00132   if(iSockDesc < 0)
00133   {
00134     return 0 ;
00135   }
00136 
00137   do
00138   {
00139     if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0)
00140     {
00141       iSockDesc = -1;
00142       HttpDebug("Http server socket closed\n\r");
00143       return 0;
00144     }
00145     else
00146     {
00147         HttpDebug("\n Http client socket close error\n\r");
00148       OSI_DELAY(500);//wait 500ms
00149     }
00150     ittr++;
00151   }while(ittr < 3);
00152 
00153   return -1;
00154 }
00155 
00156 int CreateTCPClientSocket(int iSockDesc)
00157 {
00158   sockaddr sClientAddr;
00159   SlSocklen_t uiClientAddrLen = sizeof(sClientAddr);
00160   int sock = -1;
00161   SlTimeval_t timeVal;
00162   SlSockNonblocking_t enableOption;
00163 
00164   sock = _cc3100_Module._socket.accept(iSockDesc, &sClientAddr, &uiClientAddrLen);
00165   if(sock >= 0)
00166   {
00167     enableOption.NonblockingEnabled = 0;
00168 
00169     //Blocking socket - Enable blocking mode
00170     if(_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_NONBLOCKING, &enableOption,sizeof(enableOption)) < 0)
00171     {
00172       CloseTCPClientSocket(sock);
00173       return -1;
00174     }
00175 
00176     timeVal.tv_sec =  1;             // 1 Seconds
00177     timeVal.tv_usec = 0;             // Microseconds. 10000 microseconds resoultion
00178     if((_cc3100_Module._socket.sl_SetSockOpt(sock,SOL_SOCKET,SL_SO_RCVTIMEO, &timeVal, sizeof(timeVal))) < 0)
00179     {
00180       CloseTCPClientSocket(sock);
00181       return -1;
00182     }// Enable receive timeout
00183   }
00184   return sock;
00185 }
00186 
00187 int CloseTCPClientSocket(int iSockDesc)
00188 {
00189   int ittr = 0;
00190 
00191   if(iSockDesc < 0)
00192   {
00193     return 0;
00194   }
00195 
00196   do
00197   {
00198     if(_cc3100_Module._socket.sl_Close(iSockDesc) >= 0)
00199     {
00200       iSockDesc = -1;
00201 //      HttpDebug("\n Http client socket closed\n\r");
00202 
00203         return 0;
00204     }
00205     else
00206     {
00207         HttpDebug("\n client socket close error\n\r");
00208       OSI_DELAY(500);//wait 500ms
00209     }
00210     ittr++;
00211   }while(ittr < 3);
00212 
00213   return -1;
00214 }
00215 
00216 int ClientSocketSend(long socket, char * buffer, unsigned int len)
00217 {
00218 //  HttpDebug("\r\n ClientSocketSend\n\r");
00219   int send_len = 0, Ittr = 0;
00220 
00221   do
00222   {
00223     send_len = (int)_cc3100_Module._socket.send((int)socket, buffer, (int)len, 0);
00224 
00225     if(send_len > 0)
00226     {
00227       if(len != send_len)
00228       {
00229           HttpDebug("client Send length is not matching %d \n\r", send_len);
00230         send_len = -1;
00231       }
00232       return send_len;
00233     }
00234     else if(send_len != SL_EAGAIN)
00235     {
00236         HttpDebug("\n client socket send error %d\n\r", send_len);
00237         return -1;
00238     }
00239 
00240     Ittr++;
00241 
00242   }  while((SL_EAGAIN == send_len));
00243 
00244   HttpDebug("\n client send time out %d\n\r", send_len);
00245 
00246   return -1;
00247 }
00248 
00249 
00250 /// @}
00251 
00252 
00253