void CoapRequest::get() { CoapPDU pdu; pdu.setCode(CoapPDU::Code::Get); pdu.setType(CoapPDU::Type::Confirmable); pdu.addOption(CoapPDU::OptionType::UriPath, "/"); CoapExchange::send(pdu); }
void testMethodCodes() { CoapPDU *pdu = NULL; uint8_t *buffer[4]; for(int i=0; i<4; i++) { switch(i) { case 0: pdu = new CoapPDU((uint8_t*)buffer,4,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->setCode(CoapPDU::COAP_CHANGED); pdu->setVersion(1); pdu->setMessageID(rand()%0xFFFF); for(int codeIndex=0; codeIndex<COAP_NUM_MESSAGE_CODES; codeIndex++) { pdu->setCode(coapCodeVector[codeIndex]); CU_ASSERT_EQUAL_FATAL(pdu->getCode(),coapCodeVector[codeIndex]); } if(i%2) { DBG("%d DELETE",i); delete pdu; } } }
void testHeaderFirstByteConstruction(void) { CoapPDU *pdu = NULL; uint8_t *buffer[64]; for(int constructorType=0; constructorType<4; constructorType++) { DBG("New iteration: constructorType: %d",constructorType); switch(constructorType) { case 0: pdu = new CoapPDU((uint8_t*)buffer,64,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } for(int pduVersion=0; pduVersion<4; pduVersion++) { for(int pduTypeIndex=0; pduTypeIndex<4; pduTypeIndex++) { for(int tokenLength=0; tokenLength<9; tokenLength++) { pdu->setVersion(pduVersion); pdu->setType(coapTypeVector[pduTypeIndex]); pdu->setTokenLength(tokenLength); CU_ASSERT_EQUAL_FATAL(pdu->getVersion(),pduVersion); CU_ASSERT_EQUAL_FATAL(pdu->getType(),coapTypeVector[pduTypeIndex]); CU_ASSERT_EQUAL_FATAL(pdu->getTokenLength(),tokenLength); } } } if(constructorType%2) { DBG("%d DELETE",constructorType); delete pdu; } } }
CoapPDU* HttpMessage::toCoap() { CoapPDU* pdu = new CoapPDU(); // Set code switch (this->_httpCode) { case 200: pdu->setCode(CoapPDU::COAP_CONTENT); break; case 415: pdu->setCode(CoapPDU::COAP_UNSUPPORTED_CONTENT_FORMAT); break; default: pdu->httpStatusToCode(this->_httpCode); break; } // Set payload uint8_t* data = (uint8_t*) this->_body.c_str(); std::size_t length = this->_body.length(); pdu->setPayload(data, length); // Set content-type if (this->_contentType == "application/json") { pdu->setContentFormat(CoapPDU::COAP_CONTENT_FORMAT_APP_JSON); } else { pdu->setContentFormat(CoapPDU::COAP_CONTENT_FORMAT_APP_XML); } return pdu; }
int main() { DBG_INIT(); DBG_SET_SPEED(115200); DBG_SET_NEWLINE("\r\n"); // structure for getting address of incoming packets sockaddr_in fromAddr; socklen_t fromAddrLen = sizeof(struct sockaddr_in); memset(&fromAddr,0x00,fromAddrLen); // connect to cellular network HuaweiUSBCDMAModem modem(NC, true); modem.connect(APN,APN_USERNAME,APN_PASSWORD); // setup socket to remote server int sockfd = NULL; // if(!connectToSocketUDP("109.74.199.96", 5683, &sockfd)) { if(!connectToSocketUDP("123.57.235.186", 5683, &sockfd)) { DBG("Error connecting to socket"); fail(1); } DBG("\"Connected\" to UDP socket"); // construct CoAP packet CoapPDU *pdu = new CoapPDU(); pdu->setVersion(1); pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->setCode(CoapPDU::COAP_POST); pdu->setToken((uint8_t*)"\3\2\1\1",4); pdu->setURI((char*)"register",8); #define BUFLEN 128 short messageID = 0; char buffer[BUFLEN]; MbedJSONValue json; json["devType"] = "T1"; json["firmwareNo"] = "F1"; json["softVerNo"] = "S4"; json["userDevType"] = "UT1"; json["userSoftVerNo"] = "US2"; json["mobile"] = "15811112222"; json["userHardVerNo"] = "UH1"; json["hardVerNo"] = "H1"; json["devUniqId"] = "q1w2e3r4t5"; string jsonStr = json.serialize(); printf("serialized content = %s\r\n" , jsonStr.c_str()); char *payload = (char *)jsonStr.c_str(); pdu->setPayload((uint8_t*)payload,strlen(payload)); int num = 3; // send packets to server while(num--) { // set PDU parameters pdu->setMessageID(messageID++); // send packet int ret = send(sockfd,pdu->getPDUPointer(),pdu->getPDULength(),0); if(ret!=pdu->getPDULength()) { INFO("Error sending packet."); perror(NULL); fail(2); } INFO("Packet sent"); // receive response ret = recvfrom(sockfd,&buffer,BUFLEN,0,(struct sockaddr *)&fromAddr,&fromAddrLen); if(ret==-1) { INFO("Error receiving data"); fail(3); } INFO("Received %d bytes from %s:%d",ret,inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port)); if(ret>BUFLEN) { INFO("PDU too large to fit in pre-allocated buffer"); continue; } // reuse the below coap object CoapPDU *recvPDU = new CoapPDU((uint8_t*)buffer,BUFLEN,BUFLEN); // validate packet recvPDU->setPDULength(ret); if(recvPDU->validate()!=1) { INFO("Malformed CoAP packet"); fail(4); } INFO("Valid CoAP PDU received"); recvPDU->printHuman(); Thread::wait(5000); } modem.disconnect(); return true; }
void testOptionInsertion(void) { CoapPDU *pdu = NULL; uint8_t *buffer[64]; for(int constructorType=0; constructorType<4; constructorType++) { DBG("New iteration: constructorType: %d",constructorType); switch(constructorType) { case 0: pdu = new CoapPDU((uint8_t*)buffer,64,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } pdu->setVersion(1); pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->setCode(CoapPDU::COAP_CHANGED); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestA,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(11,3,(uint8_t*)"\x55\x55\x55"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestB,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(11,3,(uint8_t*)"\xff\xff\xff"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestC,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(7,3,(uint8_t*)"\xf7\xf7\xf7"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestD,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(200,3,(uint8_t*)"\x01\x02\x03"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestE,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(190,3,(uint8_t*)"\x03\x02\x01"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestF,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(300,3,(uint8_t*)"\x01\x02\x03"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestG,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(195,3,(uint8_t*)"\x03\x02\x01"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestH,pdu->getPDUPointer(),pdu->getPDULength()); pdu->addOption(1950,3,(uint8_t*)"\x03\x02\x01"); CU_ASSERT_NSTRING_EQUAL_FATAL(optionInsertionTestI,pdu->getPDUPointer(),pdu->getPDULength()); if(constructorType%2) { DBG("%d DELETE",constructorType); delete pdu; } } }
void testPayload() { // test for both buffer and dynamic CoapPDU *pdu = NULL; uint8_t *buffer[32]; for(int i=0; i<4; i++) { switch(i) { case 0: pdu = new CoapPDU((uint8_t*)buffer,32,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->printBin(); pdu->setCode(CoapPDU::COAP_GET); pdu->setVersion(1); pdu->printBin(); pdu->setMessageID(0x1234); pdu->setURI((char*)"test",4); pdu->printBin(); CU_ASSERT_FATAL(pdu->setPayload(NULL,4)==1); CU_ASSERT_FATAL(pdu->setPayload((uint8_t*)"test",0)==1); pdu->setPayload((uint8_t*)"\1\2\3",3); pdu->printBin(); CU_ASSERT_EQUAL_FATAL(pdu->getPayloadLength(),3); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPDUPointer(),payloadTestPDUA,pdu->getPDULength()); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPayloadPointer(),"\1\2\3",pdu->getPayloadLength()); DBG("Trying to increase payload size"); pdu->setPayload((uint8_t*)"\4\3\2\1",4); pdu->printBin(); CU_ASSERT_EQUAL_FATAL(pdu->getPayloadLength(),4); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPDUPointer(),payloadTestPDUB,pdu->getPDULength()); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPayloadPointer(),"\4\3\2\1",pdu->getPayloadLength()); DBG("Trying to reduce payload size"); pdu->setPayload((uint8_t*)"\1\2",2); pdu->printBin(); CU_ASSERT_EQUAL_FATAL(pdu->getPayloadLength(),2); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPDUPointer(),payloadTestPDUC,pdu->getPDULength()); CU_ASSERT_NSTRING_EQUAL_FATAL(pdu->getPayloadPointer(),"\1\2",pdu->getPayloadLength()); if(i%2) { DBG("%d DELETE",i); delete pdu; } } }
void testMessageID() { CoapPDU *pdu = NULL; uint8_t *buffer[4]; for(int i=0; i<4; i++) { switch(i) { case 0: pdu = new CoapPDU((uint8_t*)buffer,4,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } uint16_t messageID = 0, readID = 0; pdu->setMessageID(0x0000); CU_ASSERT_EQUAL_FATAL(pdu->getMessageID(),0x0000); pdu->setMessageID(0x0001); CU_ASSERT_EQUAL_FATAL(pdu->getMessageID(),0x0001); pdu->setMessageID(0xFFFF); CU_ASSERT_EQUAL_FATAL(pdu->getMessageID(),0xFFFF); for(int j=0; j<100; j++) { messageID = rand()%0xFFFF; pdu->setMessageID(messageID); readID = pdu->getMessageID(); CU_ASSERT_EQUAL_FATAL(messageID,readID); } if(i%2) { DBG("%d DELETE",i); delete pdu; } } }
void testURISetting(void) { // locals int bufLen = 64, inLen = 0, outLen = 0, expectedLen = 0; char outBuf[64]; CoapPDU *pdu = NULL; char *inBuf = NULL, *expectedBuf = NULL; uint8_t *buffer[64]; // iterate over URIs for(int i=0; i<numURISetStrings; i++) { inBuf = (char*)uriInStrings[i]; inLen = strlen(inBuf); expectedBuf = (char*)uriOutStrings[i]; expectedLen = strlen(expectedBuf); // construct PDU //pdu = new CoapPDU(); for(int constructorType=0; constructorType<4; constructorType++) { DBG("New iteration: constructorType: %d",constructorType); switch(constructorType) { case 0: pdu = new CoapPDU((uint8_t*)buffer,64,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->setCode(CoapPDU::COAP_CHANGED); pdu->setVersion(1); pdu->setMessageID(rand()%0xFFFF); // set URI-PATH options in one operation from URI pdu->setURI(inBuf,inLen); //pdu->printHuman(); // check that read URI is the same pdu->getURI(outBuf,bufLen,&outLen); DBG("Got \"%s\" with length %d, supposed to get: \"%s\" with length %d",outBuf,outLen,expectedBuf,expectedLen); CU_ASSERT_EQUAL_FATAL(expectedLen,outLen); CU_ASSERT_NSTRING_EQUAL_FATAL(expectedBuf,outBuf,expectedLen); //delete pdu; if(constructorType%2) { DBG("%d DELETE",constructorType); delete pdu; } } } // test failure cases pdu = new CoapPDU(); pdu->setMessageID(rand()%0xFFFF); CU_ASSERT_FATAL(pdu->setURI(NULL,3)==1); CU_ASSERT_FATAL(pdu->setURI((char*)"hello",5)==0); CU_ASSERT_FATAL(pdu->getURI(NULL,3,NULL)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,20,NULL)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,0,&outLen)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,2,&outLen)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,3,&outLen)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,7,&outLen)==1); CU_ASSERT_FATAL(pdu->getURI(outBuf,8,&outLen)==0); CU_ASSERT_NSTRING_EQUAL_FATAL(outBuf,"/hello",5); delete pdu; // case where there is no URI pdu = new CoapPDU(); CU_ASSERT_FATAL(pdu->getURI(outBuf,8,&outLen)==0); CU_ASSERT_EQUAL_FATAL(outLen,0); delete pdu; };
void testTokenInsertion(void) { CoapPDU *pdu = NULL; uint8_t *buffer[64]; for(int constructorType=0; constructorType<4; constructorType++) { DBG("New iteration: constructorType: %d",constructorType); switch(constructorType) { case 0: pdu = new CoapPDU((uint8_t*)buffer,64,0); break; case 1: pdu->reset(); break; case 2: pdu = new CoapPDU(); break; case 3: pdu->reset(); break; } pdu->setType(CoapPDU::COAP_CONFIRMABLE); pdu->setCode(CoapPDU::COAP_CHANGED); pdu->setVersion(2); pdu->setToken((uint8_t*)"\3\2\1\0",4); CU_ASSERT_NSTRING_EQUAL_FATAL(tokenInsertionA,pdu->getPDUPointer(),pdu->getPDULength()); pdu->setToken((uint8_t*)"\4\3\2\1\0",5); CU_ASSERT_NSTRING_EQUAL_FATAL(tokenInsertionB,pdu->getPDUPointer(),pdu->getPDULength()); pdu->setToken((uint8_t*)"\7\6\5\4\3\2\1",8); CU_ASSERT_NSTRING_EQUAL_FATAL(tokenInsertionC,pdu->getPDUPointer(),pdu->getPDULength()); pdu->setToken((uint8_t*)"\4\3\2\1\0",5); CU_ASSERT_NSTRING_EQUAL_FATAL(tokenInsertionB,pdu->getPDUPointer(),pdu->getPDULength()); pdu->setToken((uint8_t*)"\3\2\1\0",4); CU_ASSERT_NSTRING_EQUAL_FATAL(tokenInsertionA,pdu->getPDUPointer(),pdu->getPDULength()); CU_ASSERT_FATAL(pdu->setToken(NULL,4)==1); CU_ASSERT_FATAL(pdu->setToken((uint8_t*)"a",0)==1); if(constructorType%2) { DBG("%d DELETE",constructorType); delete pdu; } } }