Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DebugLib EthernetInterface cantcoap mbed-rtos
Fork of yeswecancoap by
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 }
Generated on Wed Jul 13 2022 18:09:57 by
1.7.2
