Coap Client and Server

Dependencies:   DebugLib EthernetInterface cantcoap mbed-rtos

Dependents:   COAP coap

Fork of yeswecancoap by Sille Van Landschoot

YesWeCanCoap

Is a small coap client and server library for mbed based on the cantcoap library.

Import librarycantcoap

This is CoAP library with a focus on simplicity. It offers minimal CoAP PDU construction and decoding to and from byte buffers.

yeswecancoap server enables easy implementation of coap resources, each with a dedicated function. When the function is registered by the server, it will do the rest.

Coap server example

Repository: YesWeCanCoap-example

Coap client example

under construction

Revision:
7:1bed29e1b0a4
Parent:
6:0c477f5b79ff
Child:
11:642eaabf1c2b
--- a/server.cpp	Wed Oct 21 08:51:38 2015 +0000
+++ b/server.cpp	Wed Oct 21 10:23:21 2015 +0000
@@ -26,38 +26,54 @@
     printf("\r\nWaiting for UDP packet...\r\n");
     int size = server.receiveFrom(client, buffer, sizeof(buffer));
     buffer[size] = '\0';
-    
-    char uriBuffer[URI_BUFFER_SIZE];
-    int uriLength;
-    uint8_t token[TOKEN_BUFFER_SIZE];
-    uint8_t tokenLength;
 
     CoapPDU *req = new CoapPDU((uint8_t*)buffer,256, size);
     if(req->validate()) {
+        
+        char uriBuffer[URI_BUFFER_SIZE];
+        int uriLength;
+        uint8_t token[TOKEN_BUFFER_SIZE];
+        uint8_t tokenLength;
+    
         req->printHuman();
 
         req->getURI(uriBuffer,URI_BUFFER_SIZE,&uriLength); 
         tokenLength = req->getTokenLength();
         memcpy(token, req->getTokenPointer(), tokenLength);
-    }
+    
+        int resourceIndex = findResource(uriBuffer, req->getCode());
     
-    
+        
+        CoapPDU *res = new CoapPDU();
+        res->setMessageID(req->getMessageID());
+        res->setToken(token,4);
+        
+        switch(req->getType()){
+            case Response::COAP_NON_CONFIRMABLE: 
+                res->setType(Response::COAP_NON_CONFIRMABLE);
+                break;
+            case Response::COAP_CONFIRMABLE:
+                res->setType(Response::COAP_ACKNOWLEDGEMENT);
+        }
+        
+        res->setCode(Response::COAP_NOT_FOUND);
+        
+        if(resourceIndex != -1){
+            res->setCode(Response::COAP_NOT_IMPLEMENTED);
+            resources[resourceIndex].function((Request*)req, (Response*)res);
+        }
+        
+        server.sendTo(client, (char*) res->getPDUPointer(),res->getPDULength());
+        
+        delete res;
+        delete req;
+    }
+}
+
+int Server::findResource(char* uri, CoapPDU::Code code)
+{
     for(int i = 0; i < resources.size(); i++){
-        if(strcmp(uriBuffer, resources[i].uri) == 0){
-               
-            CoapPDU *res = new CoapPDU();
-            res->setType(Response::COAP_ACKNOWLEDGEMENT);
-            res->setCode(Response::COAP_CONTENT);
-            res->setMessageID(req->getMessageID());
-            res->setToken(token,4);
-            
-            resources[i].function((Request*)req, (Response*)res);
-                    
-            server.sendTo(client, (char*) res->getPDUPointer(),res->getPDULength());
-            delete res;
-            
-        }
+        if(strcmp(uri, resources[i].uri) == 0) return i;
     }
-    
-    delete req;
+    return -1;
 }
\ No newline at end of file