Library for MQTT

Revision:
0:ba7e439238ab
diff -r 000000000000 -r ba7e439238ab mbed-mqtt-master/src/MQTTNetworkUtil.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-mqtt-master/src/MQTTNetworkUtil.h	Mon Jun 20 16:24:43 2022 +0000
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2020, ARM Limited, All Rights Reserved
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _MQTTNETWORK_UTIL_H_
+#define _MQTTNETWORK_UTIL_H_
+
+/* MQTT doesn't expect nsapi error values so we translate them */
+static int convert_nsapi_error_to_mqtt_error(int nsapi_error)
+{
+    if (nsapi_error == NSAPI_ERROR_WOULD_BLOCK) {
+        /* MQTT expects 0 on timeout */
+        return 0;
+    } else if (nsapi_error == 0) {
+        /* MQTT expect -1 on closed sockets */
+        return -1;
+    }
+    return nsapi_error;
+}
+
+/** Reads data and returns number of bytes read or a translated error that MQTT expects. This will call
+ * read on the socket multiple times until all data is retrieved.
+ *
+ * @tparam SocketType Socket type like TCPSocket.
+ * @param socket Socket to read data from.
+ * @param buffer Buffer to store data.
+ * @param len Length of expected data.
+ * @param timeout Timeout for the operation.
+ * @return Always returns the full length if successful or an error.
+ */
+template<typename SocketType>
+static int accumulate_mqtt_read(SocketType socket, unsigned char *buffer, int len, int timeout)
+{
+    /* TODO: Timout should be applied to whole operation not partial recv */
+    socket->set_timeout(timeout);
+
+    /* MQTT Client expects the full packet so we accumulate until we get all bytes */
+    int remaining = len;
+    while (remaining) {
+        int ret = socket->recv(buffer, remaining);
+        if (ret > 0) {
+            remaining -= ret;
+            buffer += ret;
+        } else {
+            return convert_nsapi_error_to_mqtt_error(ret);
+        }
+    }
+    return len;
+}
+
+/** Sends data and returns number of bytes sent or a translated error that MQTT expects.
+ *
+ * @tparam SocketType Socket type like TCPSocket.
+ * @param socket Socket to send data on.
+ * @param buffer Data to send.
+ * @param len Length of data.
+ * @param timeout Timeout for the operation.
+ * @return Always returns the full length if successful or an error.
+ */
+template<typename SocketType>
+static int mqtt_write(SocketType socket, unsigned char *buffer, int len, int timeout)
+{
+    socket->set_timeout(timeout);
+    int ret = socket->send(buffer, len);
+    if (ret > 0) {
+        return ret;
+    } else {
+        return convert_nsapi_error_to_mqtt_error(ret);
+    }
+}
+
+#endif // _MQTTNETWORK_UTIL_H_