MQTT client test with W5200 ethernet shield

Dependents:   IBMIoTClientEthernetExample_W5200

Fork of W5500Interface by W5500-Ethernet-Interface Makers

Committer:
Bongjun
Date:
Wed Aug 20 00:28:37 2014 +0000
Revision:
0:e11e8793c3ce
first release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 0:e11e8793c3ce 1 /* Copyright (C) 2012 mbed.org, MIT License
Bongjun 0:e11e8793c3ce 2 *
Bongjun 0:e11e8793c3ce 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Bongjun 0:e11e8793c3ce 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Bongjun 0:e11e8793c3ce 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Bongjun 0:e11e8793c3ce 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Bongjun 0:e11e8793c3ce 7 * furnished to do so, subject to the following conditions:
Bongjun 0:e11e8793c3ce 8 *
Bongjun 0:e11e8793c3ce 9 * The above copyright notice and this permission notice shall be included in all copies or
Bongjun 0:e11e8793c3ce 10 * substantial portions of the Software.
Bongjun 0:e11e8793c3ce 11 *
Bongjun 0:e11e8793c3ce 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Bongjun 0:e11e8793c3ce 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Bongjun 0:e11e8793c3ce 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Bongjun 0:e11e8793c3ce 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Bongjun 0:e11e8793c3ce 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Bongjun 0:e11e8793c3ce 17 */
Bongjun 0:e11e8793c3ce 18 #include "TCPSocketConnection.h"
Bongjun 0:e11e8793c3ce 19 #include <cstring>
Bongjun 0:e11e8793c3ce 20
Bongjun 0:e11e8793c3ce 21 using std::memset;
Bongjun 0:e11e8793c3ce 22 using std::memcpy;
Bongjun 0:e11e8793c3ce 23
Bongjun 0:e11e8793c3ce 24 // not a big code.
Bongjun 0:e11e8793c3ce 25 // refer from EthernetInterface by mbed official driver
Bongjun 0:e11e8793c3ce 26 TCPSocketConnection::TCPSocketConnection() :
Bongjun 0:e11e8793c3ce 27 _is_connected(false)
Bongjun 0:e11e8793c3ce 28 {
Bongjun 0:e11e8793c3ce 29 }
Bongjun 0:e11e8793c3ce 30
Bongjun 0:e11e8793c3ce 31 int TCPSocketConnection::connect(const char* host, const int port)
Bongjun 0:e11e8793c3ce 32 {
Bongjun 0:e11e8793c3ce 33 if (_sock_fd < 0) {
Bongjun 0:e11e8793c3ce 34 _sock_fd = eth->new_socket();
Bongjun 0:e11e8793c3ce 35 if (_sock_fd < 0) {
Bongjun 0:e11e8793c3ce 36 return -1;
Bongjun 0:e11e8793c3ce 37 }
Bongjun 0:e11e8793c3ce 38 }
Bongjun 0:e11e8793c3ce 39 if (set_address(host, port) != 0) {
Bongjun 0:e11e8793c3ce 40 return -1;
Bongjun 0:e11e8793c3ce 41 }
Bongjun 0:e11e8793c3ce 42 if (!eth->connect(_sock_fd, get_address(), port)) {
Bongjun 0:e11e8793c3ce 43 return -1;
Bongjun 0:e11e8793c3ce 44 }
Bongjun 0:e11e8793c3ce 45 set_blocking(false);
Bongjun 0:e11e8793c3ce 46 // add code refer from EthernetInterface.
Bongjun 0:e11e8793c3ce 47 _is_connected = true;
Bongjun 0:e11e8793c3ce 48
Bongjun 0:e11e8793c3ce 49 return 0;
Bongjun 0:e11e8793c3ce 50 }
Bongjun 0:e11e8793c3ce 51
Bongjun 0:e11e8793c3ce 52 bool TCPSocketConnection::is_connected(void)
Bongjun 0:e11e8793c3ce 53 {
Bongjun 0:e11e8793c3ce 54 // force update recent state.
Bongjun 0:e11e8793c3ce 55 _is_connected = eth->is_connected(_sock_fd);
Bongjun 0:e11e8793c3ce 56 return _is_connected;
Bongjun 0:e11e8793c3ce 57 }
Bongjun 0:e11e8793c3ce 58
Bongjun 0:e11e8793c3ce 59 int TCPSocketConnection::send(char* data, int length)
Bongjun 0:e11e8793c3ce 60 {
Bongjun 0:e11e8793c3ce 61 // add to cover exception.
Bongjun 0:e11e8793c3ce 62 if ((_sock_fd < 0) || !_is_connected)
Bongjun 0:e11e8793c3ce 63 return -1;
Bongjun 0:e11e8793c3ce 64
Bongjun 0:e11e8793c3ce 65 int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout);
Bongjun 0:e11e8793c3ce 66 if (size < 0) {
Bongjun 0:e11e8793c3ce 67 return -1;
Bongjun 0:e11e8793c3ce 68 }
Bongjun 0:e11e8793c3ce 69 if (size > length) {
Bongjun 0:e11e8793c3ce 70 size = length;
Bongjun 0:e11e8793c3ce 71 }
Bongjun 0:e11e8793c3ce 72 return eth->send(_sock_fd, data, size);
Bongjun 0:e11e8793c3ce 73 }
Bongjun 0:e11e8793c3ce 74
Bongjun 0:e11e8793c3ce 75 // -1 if unsuccessful, else number of bytes written
Bongjun 0:e11e8793c3ce 76 int TCPSocketConnection::send_all(char* data, int length)
Bongjun 0:e11e8793c3ce 77 {
Bongjun 0:e11e8793c3ce 78 int writtenLen = 0;
Bongjun 0:e11e8793c3ce 79 while (writtenLen < length) {
Bongjun 0:e11e8793c3ce 80 int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout);
Bongjun 0:e11e8793c3ce 81 if (size < 0) {
Bongjun 0:e11e8793c3ce 82 return -1;
Bongjun 0:e11e8793c3ce 83 }
Bongjun 0:e11e8793c3ce 84 if (size > (length-writtenLen)) {
Bongjun 0:e11e8793c3ce 85 size = (length-writtenLen);
Bongjun 0:e11e8793c3ce 86 }
Bongjun 0:e11e8793c3ce 87 int ret = eth->send(_sock_fd, data + writtenLen, size);
Bongjun 0:e11e8793c3ce 88 if (ret < 0) {
Bongjun 0:e11e8793c3ce 89 return -1;
Bongjun 0:e11e8793c3ce 90 }
Bongjun 0:e11e8793c3ce 91 writtenLen += ret;
Bongjun 0:e11e8793c3ce 92 }
Bongjun 0:e11e8793c3ce 93 return writtenLen;
Bongjun 0:e11e8793c3ce 94 }
Bongjun 0:e11e8793c3ce 95
Bongjun 0:e11e8793c3ce 96 // -1 if unsuccessful, else number of bytes received
Bongjun 0:e11e8793c3ce 97 int TCPSocketConnection::receive(char* data, int length)
Bongjun 0:e11e8793c3ce 98 {
Bongjun 0:e11e8793c3ce 99 // add to cover exception.
Bongjun 0:e11e8793c3ce 100 if ((_sock_fd < 0) || !_is_connected)
Bongjun 0:e11e8793c3ce 101 return -1;
Bongjun 0:e11e8793c3ce 102
Bongjun 0:e11e8793c3ce 103 int size = eth->wait_readable(_sock_fd, _blocking ? -1 : _timeout);
Bongjun 0:e11e8793c3ce 104 if (size < 0) {
Bongjun 0:e11e8793c3ce 105 return -1;
Bongjun 0:e11e8793c3ce 106 }
Bongjun 0:e11e8793c3ce 107 if (size > length) {
Bongjun 0:e11e8793c3ce 108 size = length;
Bongjun 0:e11e8793c3ce 109 }
Bongjun 0:e11e8793c3ce 110 return eth->recv(_sock_fd, data, size);
Bongjun 0:e11e8793c3ce 111 }
Bongjun 0:e11e8793c3ce 112
Bongjun 0:e11e8793c3ce 113 // -1 if unsuccessful, else number of bytes received
Bongjun 0:e11e8793c3ce 114 int TCPSocketConnection::receive_all(char* data, int length)
Bongjun 0:e11e8793c3ce 115 {
Bongjun 0:e11e8793c3ce 116 int readLen = 0;
Bongjun 0:e11e8793c3ce 117 while (readLen < length) {
Bongjun 0:e11e8793c3ce 118 int size = eth->wait_readable(_sock_fd, _blocking ? -1 :_timeout);
Bongjun 0:e11e8793c3ce 119 if (size <= 0) {
Bongjun 0:e11e8793c3ce 120 break;
Bongjun 0:e11e8793c3ce 121 }
Bongjun 0:e11e8793c3ce 122 if (size > (length - readLen)) {
Bongjun 0:e11e8793c3ce 123 size = length - readLen;
Bongjun 0:e11e8793c3ce 124 }
Bongjun 0:e11e8793c3ce 125 int ret = eth->recv(_sock_fd, data + readLen, size);
Bongjun 0:e11e8793c3ce 126 if (ret < 0) {
Bongjun 0:e11e8793c3ce 127 return -1;
Bongjun 0:e11e8793c3ce 128 }
Bongjun 0:e11e8793c3ce 129 readLen += ret;
Bongjun 0:e11e8793c3ce 130 }
Bongjun 0:e11e8793c3ce 131 return readLen;
Bongjun 0:e11e8793c3ce 132 }