CITY3032-wifi-mqtt

Committer:
reedas
Date:
Sat Nov 13 09:06:17 2021 +0000
Revision:
3:62825c5f3cd7
working mqtt elements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
reedas 3:62825c5f3cd7 1 /*
reedas 3:62825c5f3cd7 2 * Copyright (c) 2019, ARM Limited, All Rights Reserved
reedas 3:62825c5f3cd7 3 * SPDX-License-Identifier: Apache-2.0
reedas 3:62825c5f3cd7 4 *
reedas 3:62825c5f3cd7 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
reedas 3:62825c5f3cd7 6 * not use this file except in compliance with the License.
reedas 3:62825c5f3cd7 7 * You may obtain a copy of the License at
reedas 3:62825c5f3cd7 8 *
reedas 3:62825c5f3cd7 9 * http://www.apache.org/licenses/LICENSE-2.0
reedas 3:62825c5f3cd7 10 *
reedas 3:62825c5f3cd7 11 * Unless required by applicable law or agreed to in writing, software
reedas 3:62825c5f3cd7 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
reedas 3:62825c5f3cd7 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
reedas 3:62825c5f3cd7 14 * See the License for the specific language governing permissions and
reedas 3:62825c5f3cd7 15 * limitations under the License.
reedas 3:62825c5f3cd7 16 */
reedas 3:62825c5f3cd7 17
reedas 3:62825c5f3cd7 18 #include "MQTTClientMbedOs.h"
reedas 3:62825c5f3cd7 19
reedas 3:62825c5f3cd7 20 int MQTTNetworkMbedOs::read(unsigned char *buffer, int len, int timeout)
reedas 3:62825c5f3cd7 21 {
reedas 3:62825c5f3cd7 22 nsapi_size_or_error_t rc = 0;
reedas 3:62825c5f3cd7 23 socket->set_timeout(timeout);
reedas 3:62825c5f3cd7 24 rc = socket->recv(buffer, len);
reedas 3:62825c5f3cd7 25 if (rc == NSAPI_ERROR_WOULD_BLOCK) {
reedas 3:62825c5f3cd7 26 // time out and no data
reedas 3:62825c5f3cd7 27 // MQTTClient.readPacket() requires 0 on time out and no data.
reedas 3:62825c5f3cd7 28 return 0;
reedas 3:62825c5f3cd7 29 }
reedas 3:62825c5f3cd7 30 if (rc == 0) {
reedas 3:62825c5f3cd7 31 // A receive size of 0 indicates that the socket
reedas 3:62825c5f3cd7 32 // was successfully closed so indicate this to MQTTClient
reedas 3:62825c5f3cd7 33 return -1;
reedas 3:62825c5f3cd7 34 }
reedas 3:62825c5f3cd7 35 return rc;
reedas 3:62825c5f3cd7 36 }
reedas 3:62825c5f3cd7 37
reedas 3:62825c5f3cd7 38 int MQTTNetworkMbedOs::write(unsigned char *buffer, int len, int timeout)
reedas 3:62825c5f3cd7 39 {
reedas 3:62825c5f3cd7 40 nsapi_size_or_error_t rc = 0;
reedas 3:62825c5f3cd7 41 socket->set_timeout(timeout);
reedas 3:62825c5f3cd7 42 rc = socket->send(buffer, len);
reedas 3:62825c5f3cd7 43 if (rc == NSAPI_ERROR_WOULD_BLOCK) {
reedas 3:62825c5f3cd7 44 // time out and no data
reedas 3:62825c5f3cd7 45 // MQTTClient.writePacket() requires 0 on time out and no data.
reedas 3:62825c5f3cd7 46 return 0;
reedas 3:62825c5f3cd7 47 }
reedas 3:62825c5f3cd7 48 if (rc == 0) {
reedas 3:62825c5f3cd7 49 // The socket is closed so indicate this to MQTTClient
reedas 3:62825c5f3cd7 50 return -1;
reedas 3:62825c5f3cd7 51 }
reedas 3:62825c5f3cd7 52 return rc;
reedas 3:62825c5f3cd7 53 }
reedas 3:62825c5f3cd7 54
reedas 3:62825c5f3cd7 55 int MQTTNetworkMbedOs::connect(const char *hostname, int port)
reedas 3:62825c5f3cd7 56 {
reedas 3:62825c5f3cd7 57 SocketAddress sockAddr(hostname, port);
reedas 3:62825c5f3cd7 58 return socket->connect(sockAddr);
reedas 3:62825c5f3cd7 59 }
reedas 3:62825c5f3cd7 60
reedas 3:62825c5f3cd7 61 int MQTTNetworkMbedOs::disconnect()
reedas 3:62825c5f3cd7 62 {
reedas 3:62825c5f3cd7 63 return socket->close();
reedas 3:62825c5f3cd7 64 }
reedas 3:62825c5f3cd7 65
reedas 3:62825c5f3cd7 66 MQTTClient::MQTTClient(TCPSocket *_socket)
reedas 3:62825c5f3cd7 67 {
reedas 3:62825c5f3cd7 68 init(_socket);
reedas 3:62825c5f3cd7 69 mqttNet = new MQTTNetworkMbedOs(socket);
reedas 3:62825c5f3cd7 70 client = new MQTT::Client<MQTTNetworkMbedOs, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE, MBED_CONF_MBED_MQTT_MAX_CONNECTIONS>(*mqttNet);
reedas 3:62825c5f3cd7 71 };
reedas 3:62825c5f3cd7 72
reedas 3:62825c5f3cd7 73 #if defined(MBEDTLS_SSL_CLI_C) || defined(DOXYGEN_ONLY)
reedas 3:62825c5f3cd7 74 MQTTClient::MQTTClient(TLSSocket *_socket)
reedas 3:62825c5f3cd7 75 {
reedas 3:62825c5f3cd7 76 init(_socket);
reedas 3:62825c5f3cd7 77 mqttNet = new MQTTNetworkMbedOs(socket);
reedas 3:62825c5f3cd7 78 client = new MQTT::Client<MQTTNetworkMbedOs, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE, MBED_CONF_MBED_MQTT_MAX_CONNECTIONS>(*mqttNet);
reedas 3:62825c5f3cd7 79 };
reedas 3:62825c5f3cd7 80 #endif
reedas 3:62825c5f3cd7 81
reedas 3:62825c5f3cd7 82 MQTTClient::MQTTClient(UDPSocket *_socket)
reedas 3:62825c5f3cd7 83 {
reedas 3:62825c5f3cd7 84 init(_socket);
reedas 3:62825c5f3cd7 85 mqttNet = new MQTTNetworkMbedOs(socket);
reedas 3:62825c5f3cd7 86 clientSN = new MQTTSN::Client<MQTTNetworkMbedOs, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE, MBED_CONF_MBED_MQTT_MAX_CONNECTIONS>(*mqttNet);
reedas 3:62825c5f3cd7 87 };
reedas 3:62825c5f3cd7 88
reedas 3:62825c5f3cd7 89 #if defined(MBEDTLS_SSL_CLI_C) || defined(DOXYGEN_ONLY)
reedas 3:62825c5f3cd7 90 MQTTClient::MQTTClient(DTLSSocket *_socket)
reedas 3:62825c5f3cd7 91 {
reedas 3:62825c5f3cd7 92 init(_socket);
reedas 3:62825c5f3cd7 93 mqttNet = new MQTTNetworkMbedOs(socket);
reedas 3:62825c5f3cd7 94 clientSN = new MQTTSN::Client<MQTTNetworkMbedOs, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE, MBED_CONF_MBED_MQTT_MAX_CONNECTIONS>(*mqttNet);
reedas 3:62825c5f3cd7 95 };
reedas 3:62825c5f3cd7 96 #endif
reedas 3:62825c5f3cd7 97
reedas 3:62825c5f3cd7 98 nsapi_error_t MQTTClient::connect(MQTTPacket_connectData &options)
reedas 3:62825c5f3cd7 99 {
reedas 3:62825c5f3cd7 100 if (client == NULL) {
reedas 3:62825c5f3cd7 101 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 102 }
reedas 3:62825c5f3cd7 103 nsapi_error_t ret = client->connect(options);
reedas 3:62825c5f3cd7 104 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 105 }
reedas 3:62825c5f3cd7 106
reedas 3:62825c5f3cd7 107 nsapi_error_t MQTTClient::connect(MQTTSNPacket_connectData &options)
reedas 3:62825c5f3cd7 108 {
reedas 3:62825c5f3cd7 109 if (clientSN == NULL) {
reedas 3:62825c5f3cd7 110 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 111 }
reedas 3:62825c5f3cd7 112 nsapi_error_t ret = clientSN->connect(options);
reedas 3:62825c5f3cd7 113 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 114 }
reedas 3:62825c5f3cd7 115
reedas 3:62825c5f3cd7 116 nsapi_error_t MQTTClient::publish(const char *topicName, MQTT::Message &message)
reedas 3:62825c5f3cd7 117 {
reedas 3:62825c5f3cd7 118 if (client == NULL) {
reedas 3:62825c5f3cd7 119 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 120 }
reedas 3:62825c5f3cd7 121 nsapi_error_t ret = client->publish(topicName, message);
reedas 3:62825c5f3cd7 122 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 123 }
reedas 3:62825c5f3cd7 124
reedas 3:62825c5f3cd7 125 nsapi_error_t MQTTClient::publish(MQTTSN_topicid &topicName, MQTTSN::Message &message)
reedas 3:62825c5f3cd7 126 {
reedas 3:62825c5f3cd7 127 if (clientSN == NULL) {
reedas 3:62825c5f3cd7 128 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 129 }
reedas 3:62825c5f3cd7 130 nsapi_error_t ret = clientSN->publish(topicName, message);
reedas 3:62825c5f3cd7 131 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 132 }
reedas 3:62825c5f3cd7 133
reedas 3:62825c5f3cd7 134 nsapi_error_t MQTTClient::subscribe(const char *topicFilter, enum MQTT::QoS qos, messageHandler mh)
reedas 3:62825c5f3cd7 135 {
reedas 3:62825c5f3cd7 136 if (client == NULL) {
reedas 3:62825c5f3cd7 137 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 138 }
reedas 3:62825c5f3cd7 139 nsapi_error_t ret = client->subscribe(topicFilter, qos, mh);
reedas 3:62825c5f3cd7 140 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 141 }
reedas 3:62825c5f3cd7 142
reedas 3:62825c5f3cd7 143 nsapi_error_t MQTTClient::subscribe(MQTTSN_topicid &topicFilter, enum MQTTSN::QoS qos, messageHandlerSN mh)
reedas 3:62825c5f3cd7 144 {
reedas 3:62825c5f3cd7 145 if (clientSN == NULL) {
reedas 3:62825c5f3cd7 146 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 147 }
reedas 3:62825c5f3cd7 148 nsapi_error_t ret = clientSN->subscribe(topicFilter, qos, mh);
reedas 3:62825c5f3cd7 149 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 150 }
reedas 3:62825c5f3cd7 151
reedas 3:62825c5f3cd7 152 nsapi_error_t MQTTClient::unsubscribe(const char *topicFilter)
reedas 3:62825c5f3cd7 153 {
reedas 3:62825c5f3cd7 154 if (client == NULL) {
reedas 3:62825c5f3cd7 155 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 156 }
reedas 3:62825c5f3cd7 157 nsapi_error_t ret = client->unsubscribe(topicFilter);
reedas 3:62825c5f3cd7 158 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 159 }
reedas 3:62825c5f3cd7 160
reedas 3:62825c5f3cd7 161 nsapi_error_t MQTTClient::unsubscribe(MQTTSN_topicid &topicFilter)
reedas 3:62825c5f3cd7 162 {
reedas 3:62825c5f3cd7 163 if (clientSN == NULL) {
reedas 3:62825c5f3cd7 164 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 165 }
reedas 3:62825c5f3cd7 166 nsapi_error_t ret = clientSN->unsubscribe(topicFilter);
reedas 3:62825c5f3cd7 167 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 168 }
reedas 3:62825c5f3cd7 169
reedas 3:62825c5f3cd7 170 nsapi_error_t MQTTClient::yield(unsigned long timeout_ms)
reedas 3:62825c5f3cd7 171 {
reedas 3:62825c5f3cd7 172 nsapi_error_t ret = NSAPI_ERROR_OK;
reedas 3:62825c5f3cd7 173 if (client != NULL) {
reedas 3:62825c5f3cd7 174 ret = client->yield(timeout_ms);
reedas 3:62825c5f3cd7 175 } else if (clientSN != NULL) {
reedas 3:62825c5f3cd7 176 ret = clientSN->yield(timeout_ms);
reedas 3:62825c5f3cd7 177 } else {
reedas 3:62825c5f3cd7 178 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 179 }
reedas 3:62825c5f3cd7 180 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 181 }
reedas 3:62825c5f3cd7 182
reedas 3:62825c5f3cd7 183 nsapi_error_t MQTTClient::disconnect()
reedas 3:62825c5f3cd7 184 {
reedas 3:62825c5f3cd7 185 nsapi_error_t ret = NSAPI_ERROR_OK;
reedas 3:62825c5f3cd7 186 if (client != NULL) {
reedas 3:62825c5f3cd7 187 ret = client->disconnect();
reedas 3:62825c5f3cd7 188 } else if (clientSN != NULL) {
reedas 3:62825c5f3cd7 189 ret = clientSN->disconnect(0);
reedas 3:62825c5f3cd7 190 } else {
reedas 3:62825c5f3cd7 191 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 192 }
reedas 3:62825c5f3cd7 193 return ret < 0 ? NSAPI_ERROR_NO_CONNECTION : ret;
reedas 3:62825c5f3cd7 194 }
reedas 3:62825c5f3cd7 195
reedas 3:62825c5f3cd7 196 bool MQTTClient::isConnected()
reedas 3:62825c5f3cd7 197 {
reedas 3:62825c5f3cd7 198 if (client != NULL) {
reedas 3:62825c5f3cd7 199 return false;
reedas 3:62825c5f3cd7 200 } else if (clientSN == NULL) {
reedas 3:62825c5f3cd7 201 return false;
reedas 3:62825c5f3cd7 202 } else {
reedas 3:62825c5f3cd7 203 return clientSN->isConnected();
reedas 3:62825c5f3cd7 204 }
reedas 3:62825c5f3cd7 205 }
reedas 3:62825c5f3cd7 206
reedas 3:62825c5f3cd7 207 void MQTTClient::setDefaultMessageHandler(messageHandler mh)
reedas 3:62825c5f3cd7 208 {
reedas 3:62825c5f3cd7 209 if (client != NULL) {
reedas 3:62825c5f3cd7 210 client->setDefaultMessageHandler(mh);
reedas 3:62825c5f3cd7 211 } else if (clientSN != NULL) {
reedas 3:62825c5f3cd7 212 client->setDefaultMessageHandler(mh);
reedas 3:62825c5f3cd7 213 }
reedas 3:62825c5f3cd7 214 }
reedas 3:62825c5f3cd7 215
reedas 3:62825c5f3cd7 216 nsapi_error_t MQTTClient::setMessageHandler(const char *topicFilter, messageHandler mh)
reedas 3:62825c5f3cd7 217 {
reedas 3:62825c5f3cd7 218 if (clientSN != NULL) {
reedas 3:62825c5f3cd7 219 return NSAPI_ERROR_UNSUPPORTED;
reedas 3:62825c5f3cd7 220 } else if (client == NULL) {
reedas 3:62825c5f3cd7 221 return NSAPI_ERROR_NO_CONNECTION;
reedas 3:62825c5f3cd7 222 } else {
reedas 3:62825c5f3cd7 223 return client->setMessageHandler(topicFilter, mh);
reedas 3:62825c5f3cd7 224 }
reedas 3:62825c5f3cd7 225 }
reedas 3:62825c5f3cd7 226
reedas 3:62825c5f3cd7 227 void MQTTClient::init(Socket *sock)
reedas 3:62825c5f3cd7 228 {
reedas 3:62825c5f3cd7 229 socket = sock;
reedas 3:62825c5f3cd7 230 client = NULL;
reedas 3:62825c5f3cd7 231 clientSN = NULL;
reedas 3:62825c5f3cd7 232 }