Yes We Can / yeswecancoap

Dependencies:   DebugLib EthernetInterface cantcoap mbed-rtos

Dependents:   COAP coap

Fork of yeswecancoap by Sille Van Landschoot

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers server.cpp Source File

server.cpp

00001 #include "server.h"
00002 
00003 
00004 Server::Server()
00005 {
00006     debug_init();
00007     debug_set_newline("\r\n");
00008     
00009     eth.init(); //Use DHCP
00010     eth.connect();
00011     printf("\r\nServer IP Address is %s\r\n", eth.getIPAddress());
00012     
00013     server.bind(5683);
00014     server.set_blocking(false, 100);
00015 }
00016 
00017 char* Server::getIpAddress(){
00018     return eth.getIPAddress();
00019 }
00020 
00021 void Server::enableBroadcast(int broadcast)
00022 {
00023     server.set_broadcasting(broadcast);
00024 }
00025 
00026 void Server::add(char* uri, void (*fnc)(Request*, Response*), CoapCode method)
00027 {
00028     Resource res = {uri, fnc, method};
00029     resources.push_back(res);
00030 }
00031 
00032 void Server::waitForRequest()
00033 {
00034 
00035     char buffer[UDP_BUFFER_SIZE];
00036     //printf("\r\nWaiting for UDP packet...\r\n");
00037     int size = server.receiveFrom(client, buffer, sizeof(buffer));
00038     buffer[size] = '\0';
00039 
00040     CoapPDU *req = new CoapPDU((uint8_t*)buffer,256, size);
00041     if(req->validate()) {
00042         
00043         char uriBuffer[URI_BUFFER_SIZE];
00044         int uriLength;
00045         uint8_t token[TOKEN_BUFFER_SIZE];
00046         uint8_t tokenLength;
00047     
00048         //req->printHuman();
00049 
00050         req->getURI(uriBuffer,URI_BUFFER_SIZE,&uriLength); 
00051         tokenLength = req->getTokenLength();
00052         memcpy(token, req->getTokenPointer(), tokenLength);
00053     
00054         int resourceIndex = findResource(uriBuffer, req->getCode());
00055     
00056         
00057         CoapPDU *res = new CoapPDU();
00058         res->setMessageID(req->getMessageID());
00059         res->setToken(token,4);
00060         
00061         switch(req->getType()){
00062             case CoapPDU::COAP_NON_CONFIRMABLE: 
00063                 res->setType(CoapPDU::COAP_NON_CONFIRMABLE);
00064                 break;
00065             case CoapPDU::COAP_CONFIRMABLE:
00066                 res->setType(CoapPDU::COAP_ACKNOWLEDGEMENT);
00067         }
00068         
00069         res->setCode(CoapPDU::COAP_NOT_FOUND);
00070         
00071         if(resourceIndex != -1){
00072             res->setCode(CoapPDU::COAP_NOT_IMPLEMENTED);
00073             resources[resourceIndex].function((Request*)req, (Response*)res);
00074         }
00075         
00076         server.sendTo(client, (char*) res->getPDUPointer(),res->getPDULength());
00077         
00078         delete res;
00079         delete req;
00080     }
00081 }
00082 
00083 int Server::findResource(char* uri, CoapPDU::Code method)
00084 {
00085     for(int i = 0; i < resources.size(); i++){
00086         if(strcmp(uri, resources[i].uri) == 0 && method == resources[i].method) return i;
00087     }
00088     return -1;
00089 }