Jack Hansdampf / mbed-mqtt-GSOE1

Dependents:   ESP8266MQTT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MQTTCC3200.c Source File

MQTTCC3200.c

00001 /*******************************************************************************
00002  * Copyright (c) 2014 IBM Corp.
00003  *
00004  * All rights reserved. This program and the accompanying materials
00005  * are made available under the terms of the Eclipse Public License v1.0
00006  * and Eclipse Distribution License v1.0 which accompany this distribution.
00007  *
00008  * The Eclipse Public License is available at
00009  *    http://www.eclipse.org/legal/epl-v10.html
00010  * and the Eclipse Distribution License is available at
00011  *   http://www.eclipse.org/org/documents/edl-v10.php.
00012  *
00013  * Contributors:
00014  *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation
00015  *******************************************************************************/
00016 
00017 #include "MQTTCC3200.h"
00018 
00019 unsigned long MilliTimer;
00020 
00021 void SysTickIntHandler(void) {
00022     MilliTimer++;
00023 }
00024 
00025 char expired(Timer* timer) {
00026     long left = timer->end_time - MilliTimer;
00027     return (left < 0);
00028 }
00029 
00030 
00031 void countdown_ms(Timer* timer, unsigned int timeout) {
00032     timer->end_time = MilliTimer + timeout;
00033 }
00034 
00035 
00036 void countdown(Timer* timer, unsigned int timeout) {
00037     timer->end_time = MilliTimer + (timeout * 1000);
00038 }
00039 
00040 
00041 int left_ms(Timer* timer) {
00042     long left = timer->end_time - MilliTimer;
00043     return (left < 0) ? 0 : left;
00044 }
00045 
00046 
00047 void InitTimer(Timer* timer) {
00048     timer->end_time = 0;
00049 }
00050 
00051 
00052 int cc3200_read(Network* n, unsigned char* buffer, int len, int timeout_ms) {
00053     SlTimeval_t timeVal;
00054     SlFdSet_t fdset;
00055     int rc = 0;
00056     int recvLen = 0;
00057 
00058     SL_FD_ZERO(&fdset);
00059     SL_FD_SET(n->my_socket, &fdset);
00060 
00061     timeVal.tv_sec = 0;
00062     timeVal.tv_usec = timeout_ms * 1000;
00063     if (sl_Select(n->my_socket + 1, &fdset, NULL, NULL, &timeVal) == 1) {
00064         do {
00065             rc = sl_Recv(n->my_socket, buffer + recvLen, len - recvLen, 0);
00066             recvLen += rc;
00067         } while(recvLen < len);
00068     }
00069     return recvLen;
00070 }
00071 
00072 
00073 int cc3200_write(Network* n, unsigned char* buffer, int len, int timeout_ms) {
00074     SlTimeval_t timeVal;
00075     SlFdSet_t fdset;
00076     int rc = 0;
00077     int readySock;
00078 
00079     SL_FD_ZERO(&fdset);
00080     SL_FD_SET(n->my_socket, &fdset);
00081 
00082     timeVal.tv_sec = 0;
00083     timeVal.tv_usec = timeout_ms * 1000;
00084     do {
00085         readySock = sl_Select(n->my_socket + 1, NULL, &fdset, NULL, &timeVal);
00086     } while(readySock != 1);
00087     rc = sl_Send(n->my_socket, buffer, len, 0);
00088     return rc;
00089 }
00090 
00091 
00092 void cc3200_disconnect(Network* n) {
00093     sl_Close(n->my_socket);
00094 }
00095 
00096 
00097 void NewNetwork(Network* n) {
00098     n->my_socket = 0;
00099     n->mqttread = cc3200_read;
00100     n->mqttwrite = cc3200_write;
00101     n->disconnect = cc3200_disconnect;
00102 }
00103 
00104 int TLSConnectNetwork(Network *n, char* addr, int port, SlSockSecureFiles_t* certificates, unsigned char sec_method, unsigned int cipher, char server_verify) {
00105     SlSockAddrIn_t sAddr;
00106     int addrSize;
00107     int retVal;
00108     unsigned long ipAddress;
00109 
00110     retVal = sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);
00111     if (retVal < 0) {
00112         return -1;
00113     }
00114 
00115     sAddr.sin_family = AF_INET;
00116     sAddr.sin_port = sl_Htons((unsigned short)port);
00117     sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);
00118 
00119     addrSize = sizeof(SlSockAddrIn_t);
00120 
00121     n->my_socket = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
00122     if (n->my_socket < 0) {
00123         return -1;
00124     }
00125 
00126     SlSockSecureMethod method;
00127     method.secureMethod = sec_method;
00128     retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECMETHOD, &method, sizeof(method));
00129     if (retVal < 0) {
00130         return retVal;
00131     }
00132 
00133     SlSockSecureMask mask;
00134     mask.secureMask = cipher;
00135     retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_MASK, &mask, sizeof(mask));
00136     if (retVal < 0) {
00137         return retVal;
00138     }
00139 
00140     if (certificates != NULL) {
00141         retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_FILES, certificates->secureFiles, sizeof(SlSockSecureFiles_t));
00142         if(retVal < 0)
00143         {
00144             return retVal;
00145         }
00146     }
00147 
00148     retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);
00149     if( retVal < 0 ) {
00150         if (server_verify || retVal != -453) {
00151             sl_Close(n->my_socket);
00152             return retVal;
00153         }
00154     }
00155 
00156     SysTickIntRegister(SysTickIntHandler);
00157     SysTickPeriodSet(80000);
00158     SysTickEnable();
00159 
00160     return retVal;
00161 }
00162 
00163 int ConnectNetwork(Network* n, char* addr, int port)
00164 {
00165     SlSockAddrIn_t sAddr;
00166     int addrSize;
00167     int retVal;
00168     unsigned long ipAddress;
00169 
00170     sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);
00171 
00172     sAddr.sin_family = AF_INET;
00173     sAddr.sin_port = sl_Htons((unsigned short)port);
00174     sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);
00175 
00176     addrSize = sizeof(SlSockAddrIn_t);
00177 
00178     n->my_socket = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
00179     if( n->my_socket < 0 ) {
00180         // error
00181         return -1;
00182     }
00183 
00184     retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);
00185     if( retVal < 0 ) {
00186         // error
00187         sl_Close(n->my_socket);
00188         return retVal;
00189     }
00190 
00191     SysTickIntRegister(SysTickIntHandler);
00192     SysTickPeriodSet(80000);
00193     SysTickEnable();
00194 
00195     return retVal;
00196 }