client version of coap
Dependencies: nRF24L01P cantcoap3
Diff: coapClient.cpp
- Revision:
- 2:e8823d9fa162
- Parent:
- 1:1d936c763440
- Child:
- 4:792cf53a73c4
--- a/coapClient.cpp Sun Jan 20 13:48:02 2019 +0000 +++ b/coapClient.cpp Thu Jan 24 16:33:30 2019 +0000 @@ -2,9 +2,8 @@ // Created by Kamil Mykitiuk on 2019-01-17. // -#include <cstring> #include "coapClient.h" - +#include "dbg.h" bool match_uri(CoapPDU& coapPDU, char* uri) { char respone_uri[32]; @@ -23,31 +22,22 @@ if (response.validate()) { if (isExpectedResponse(response, message_id, uri)) { return true; - } else { - sendReset(response.getMessageID()); // if this is not what we wanted, inform server about error } } return false; } +bool CoapClient::hasGetResponse(CoapPDU& response) { + return std::memcmp(response.getTokenPointer(), this->token, static_cast<size_t>(response.getTokenLength())) == 0 && + response.getCode() == CoapPDU::COAP_CONTENT; +} -/* send reset to server - * - * @return 0 if successful - * -4 if radio is not working properly - * */ -int CoapClient::sendReset(uint16_t message_id) { - CoapPDU reset = CoapPDU(); - reset.setMessageID(message_id); - reset.setType(CoapPDU::COAP_RESET); - int ret = this->radioWrapper.write(reset.getPDUPointer(), reset.getPDULength()); - if (ret < 0) { - return RADIO_NOT_WORKING; - } else { - return 0; - } +bool CoapClient::hasPostResponse(CoapPDU& response) { + return response.getCode() == CoapPDU::COAP_CREATED && + std::memcmp(response.getTokenPointer(), this->token, static_cast<size_t>(response.getTokenLength())) == 0; } + /* send get request to given uri of connected server * * @return number of saved bytes in provided buffer or @@ -74,26 +64,27 @@ int readLen = radioWrapper.read(returnBuffer, radioWrapper.packetSize(), timeout); // add timeout param if (readLen > 0) { // if something is recieved process it CoapPDU response(returnBuffer, len, readLen); - if (isAck(response, messageId, uri)) { - if (std::memcmp(response.getTokenPointer(), this->token, - static_cast<size_t>(response.getTokenLength())) == 0) { - if (response.getPayloadLength() >= len) { - std::memcpy(buffer, response.getPayloadPointer(), - static_cast<size_t>(response.getPayloadLength())); - return response.getPayloadLength(); - } else { - return SMALL_BUFFER; - } + if (isAck(response, messageId, uri) && hasGetResponse(response)) { + DBG("RESPONSE: %d", readLen); + response.printHuman(); + if (response.getPayloadLength() <= len) { + std::memcpy(buffer, response.getPayloadPointer(), + static_cast<size_t>(response.getPayloadLength())); + return response.getPayloadLength(); } else { - return SERVER_RESPONSE_AMBIGOUS; + return SMALL_BUFFER; } + } else { + return SERVER_RESPONSE_AMBIGOUS; } } else if (readLen < 0) { return RADIO_NOT_WORKING; } timeout *= 2; } - return SERVER_TIMED_OUT; + + return + SERVER_TIMED_OUT; } /* send post request to given uri of connected server @@ -121,13 +112,10 @@ int readLen = radioWrapper.read(returnBuffer, radioWrapper.packetSize(), timeout); // add timeout param if (readLen > 0) { // if something is recieved process it CoapPDU response(returnBuffer, len, readLen); - if (isAck(response, messageId, uri)) { - if (response.getCode() == CoapPDU::COAP_CREATED && - std::memcmp(response.getTokenPointer(), this->token, - static_cast<size_t>(response.getTokenLength())) == 0) { - return 0; - } else // if server hasn't responded properly - return SERVER_RESPONSE_AMBIGOUS; + if (isAck(response, messageId, uri) && hasPostResponse(response)) { + return 0; + } else { // if server hasn't responded properly + return SERVER_RESPONSE_AMBIGOUS; } } else if (readLen < 0) { return RADIO_NOT_WORKING; @@ -141,12 +129,15 @@ coapPDU.setVersion(1); coapPDU.setType(CoapPDU::COAP_CONFIRMABLE); coapPDU.setMessageID(this->message_counter); - coapPDU.setToken(this->token, 4); + coapPDU.setToken(this->token, 1); return this->message_counter++; } -CoapClient::CoapClient(uint8_t* token, int retransmissionLimit, int timeout, int channel, unsigned long long rx_address, unsigned long long tx_address) : -listeningTimeout(timeout), retransmissionLimit(retransmissionLimit), radioWrapper(channel, rx_address, tx_address) { - std::memcpy(this->token, token, 4); - this->message_counter = 16; +CoapClient::CoapClient(uint8_t* token, int retransmissionLimit, int timeout, int channel, unsigned long long rx_address, + unsigned long long tx_address) : + listeningTimeout(timeout), retransmissionLimit(retransmissionLimit), + radioWrapper(channel, rx_address, tx_address) { + std::memcpy(this->token, token, 1); + this->message_counter = 16; // set to random } +