Library for handling subset of coap functionality by radio transmitter.

Dependencies:   nRF24L01P cantcoap

Dependents:   server2

Revision:
0:6a6f97ca5572
Child:
1:1d936c763440
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/coapServer.cpp	Fri Jan 18 14:12:24 2019 +0000
@@ -0,0 +1,71 @@
+//
+// Created by Kamil Mykitiuk on 2019-01-18.
+//
+
+#include "coapServer.h"
+
+int CoapServer::listen(uint8_t* buffer, int len, METHOD* requestMethod, int* uriNumber) {
+    uint8_t requestBuffer[radioWrapper.packetSize()];
+    int ret = radioWrapper.read(requestBuffer, radioWrapper.packetSize(), this->listeningTimeout);
+    if (ret < 0) {
+        return RADIO_NOT_WORKING;
+    } else {
+        CoapPDU request(requestBuffer, radioWrapper.packetSize(), ret);
+        if (request.validate()) {
+
+            this->lastMessageId = request.getMessageID();
+            std::memcpy(this->lastMessageToken, request.getTokenPointer(), 4);
+            if (request.getPayloadLength() <= len) {
+                std::memcpy(buffer, request.getPayloadPointer(), static_cast<size_t>(request.getPayloadLength()));
+                if (request.getCode() == CoapPDU::COAP_GET) {
+                    *requestMethod = GET;
+                } else if (request.getCode() == CoapPDU::COAP_POST) {
+                    *requestMethod = POST;
+                }
+                char requestUri[32];
+                int requestUriLen = 0;
+                request.getURI(requestUri, 32, &requestUriLen);
+                bool foundMatchingUri = false;
+                for (int i = 0; i < urisNumber(); ++i) {
+                    if(std::strcmp(requestUri, (*(this->uris))[i].data()) == 0) {
+                        *uriNumber = i;
+                        foundMatchingUri = true;
+                    }
+                }
+                if(!foundMatchingUri) {
+                    return UNKNOWN_URI;
+                }
+                return request.getPayloadLength();
+            } else {
+                return SMALL_BUFFER;
+            }
+        }
+    }
+    return 0;
+}
+
+
+
+int CoapServer::urisNumber() {
+    return sizeof(*uris)/ sizeof(std::string);
+}
+
+int CoapServer::respond(int uri, uint8_t* buffer, int len, CoapPDU::Code responseCode) {
+    CoapPDU response = CoapPDU();
+    prepareAckPDU(response);
+    response.setCode(responseCode);
+    response.setPayload(buffer, len);
+    response.setURI((char*) uris[uri]->data(), (int)uris[uri]->size());
+    int ret = radioWrapper.write(response.getPDUPointer(), response.getPDULength());
+    if(ret < 0) {
+        return RADIO_NOT_WORKING;
+    }
+    return 0;
+}
+
+void CoapServer::prepareAckPDU(CoapPDU& coapPDU) {
+    coapPDU.setVersion(1);
+    coapPDU.setType(CoapPDU::COAP_ACKNOWLEDGEMENT);
+    coapPDU.setMessageID(this->lastMessageId);
+    coapPDU.setToken(this->lastMessageToken, 4);
+}