Andrew Reed
/
CITY1082-i2c_master_wifi_mqtt
CITY3032-wifi-mqtt
src/MQTTClientMbedOs.cpp@3:62825c5f3cd7, 2021-11-13 (annotated)
- Committer:
- reedas
- Date:
- Sat Nov 13 09:06:17 2021 +0000
- Revision:
- 3:62825c5f3cd7
working mqtt elements
Who changed what in which revision?
User | Revision | Line number | New 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 | } |