MQTTCC3200.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*******************************************************************************
  2. * Copyright (c) 2014 IBM Corp.
  3. *
  4. * All rights reserved. This program and the accompanying materials
  5. * are made available under the terms of the Eclipse Public License v1.0
  6. * and Eclipse Distribution License v1.0 which accompany this distribution.
  7. *
  8. * The Eclipse Public License is available at
  9. * http://www.eclipse.org/legal/epl-v10.html
  10. * and the Eclipse Distribution License is available at
  11. * http://www.eclipse.org/org/documents/edl-v10.php.
  12. *
  13. * Contributors:
  14. * Allan Stockdill-Mander - initial API and implementation and/or initial documentation
  15. *******************************************************************************/
  16. #include "MQTTCC3200.h"
  17. unsigned long MilliTimer;
  18. void SysTickIntHandler(void) {
  19. MilliTimer++;
  20. }
  21. char expired(Timer* timer) {
  22. long left = timer->end_time - MilliTimer;
  23. return (left < 0);
  24. }
  25. void countdown_ms(Timer* timer, unsigned int timeout) {
  26. timer->end_time = MilliTimer + timeout;
  27. }
  28. void countdown(Timer* timer, unsigned int timeout) {
  29. timer->end_time = MilliTimer + (timeout * 1000);
  30. }
  31. int left_ms(Timer* timer) {
  32. long left = timer->end_time - MilliTimer;
  33. return (left < 0) ? 0 : left;
  34. }
  35. void InitTimer(Timer* timer) {
  36. timer->end_time = 0;
  37. }
  38. int cc3200_read(Network* n, unsigned char* buffer, int len, int timeout_ms) {
  39. SlTimeval_t timeVal;
  40. SlFdSet_t fdset;
  41. int rc = 0;
  42. int recvLen = 0;
  43. SL_FD_ZERO(&fdset);
  44. SL_FD_SET(n->my_socket, &fdset);
  45. timeVal.tv_sec = 0;
  46. timeVal.tv_usec = timeout_ms * 1000;
  47. if (sl_Select(n->my_socket + 1, &fdset, NULL, NULL, &timeVal) == 1) {
  48. do {
  49. rc = sl_Recv(n->my_socket, buffer + recvLen, len - recvLen, 0);
  50. recvLen += rc;
  51. } while(recvLen < len);
  52. }
  53. return recvLen;
  54. }
  55. int cc3200_write(Network* n, unsigned char* buffer, int len, int timeout_ms) {
  56. SlTimeval_t timeVal;
  57. SlFdSet_t fdset;
  58. int rc = 0;
  59. int readySock;
  60. SL_FD_ZERO(&fdset);
  61. SL_FD_SET(n->my_socket, &fdset);
  62. timeVal.tv_sec = 0;
  63. timeVal.tv_usec = timeout_ms * 1000;
  64. do {
  65. readySock = sl_Select(n->my_socket + 1, NULL, &fdset, NULL, &timeVal);
  66. } while(readySock != 1);
  67. rc = sl_Send(n->my_socket, buffer, len, 0);
  68. return rc;
  69. }
  70. void cc3200_disconnect(Network* n) {
  71. sl_Close(n->my_socket);
  72. }
  73. void NewNetwork(Network* n) {
  74. n->my_socket = 0;
  75. n->mqttread = cc3200_read;
  76. n->mqttwrite = cc3200_write;
  77. n->disconnect = cc3200_disconnect;
  78. }
  79. int TLSConnectNetwork(Network *n, char* addr, int port, SlSockSecureFiles_t* certificates, unsigned char sec_method, unsigned int cipher, char server_verify) {
  80. SlSockAddrIn_t sAddr;
  81. int addrSize;
  82. int retVal;
  83. unsigned long ipAddress;
  84. retVal = sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);
  85. if (retVal < 0) {
  86. return -1;
  87. }
  88. sAddr.sin_family = AF_INET;
  89. sAddr.sin_port = sl_Htons((unsigned short)port);
  90. sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);
  91. addrSize = sizeof(SlSockAddrIn_t);
  92. n->my_socket = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, SL_SEC_SOCKET);
  93. if (n->my_socket < 0) {
  94. return -1;
  95. }
  96. SlSockSecureMethod method;
  97. method.secureMethod = sec_method;
  98. retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECMETHOD, &method, sizeof(method));
  99. if (retVal < 0) {
  100. return retVal;
  101. }
  102. SlSockSecureMask mask;
  103. mask.secureMask = cipher;
  104. retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_MASK, &mask, sizeof(mask));
  105. if (retVal < 0) {
  106. return retVal;
  107. }
  108. if (certificates != NULL) {
  109. retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_FILES, certificates->secureFiles, sizeof(SlSockSecureFiles_t));
  110. if(retVal < 0)
  111. {
  112. return retVal;
  113. }
  114. }
  115. retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);
  116. if( retVal < 0 ) {
  117. if (server_verify || retVal != -453) {
  118. sl_Close(n->my_socket);
  119. return retVal;
  120. }
  121. }
  122. SysTickIntRegister(SysTickIntHandler);
  123. SysTickPeriodSet(80000);
  124. SysTickEnable();
  125. return retVal;
  126. }
  127. int ConnectNetwork(Network* n, char* addr, int port)
  128. {
  129. SlSockAddrIn_t sAddr;
  130. int addrSize;
  131. int retVal;
  132. unsigned long ipAddress;
  133. sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);
  134. sAddr.sin_family = AF_INET;
  135. sAddr.sin_port = sl_Htons((unsigned short)port);
  136. sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);
  137. addrSize = sizeof(SlSockAddrIn_t);
  138. n->my_socket = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
  139. if( n->my_socket < 0 ) {
  140. // error
  141. return -1;
  142. }
  143. retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);
  144. if( retVal < 0 ) {
  145. // error
  146. sl_Close(n->my_socket);
  147. return retVal;
  148. }
  149. SysTickIntRegister(SysTickIntHandler);
  150. SysTickPeriodSet(80000);
  151. SysTickEnable();
  152. return retVal;
  153. }