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; } } }
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; }