Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Wed Jul 13 2022 10:46:02 by
1.7.2