Hi,
In nRF_Connect_SDK's OpenThread's Coap_Client sample, I want to implement the role of both client and server on a single node.
Also instead of sending messages to CoAP_Server, I want to send messages to my own CoAP server, whose address I have specified in the application. Following is the application code...
#define BORDER_ROUTER_IP "2001:db8:1:ffff::a00:1"
#define COMMON_RESOURCE "proxy/zenedge"
#define EUID "u=64088dce2d8f7568"
#define PACKET_VERSION "pv=1"
#define BOOTSTRAP "pt=b"
#define BOOTSTRAP_MESSAGE_FORMAT "o=2&i=1&t=1&2=10&o=2&i=2&t=2&2=11&o=2&i=5&t=4&2=11&o=2&i=6&t=5&2=7&o=3&i=4&t=7&2=5&o=3&i=7&t=8&2=12&o=2&i=8&t=3&2=11&o=2&i=11&t=22&2=5&o=2&i=12&t=31&2=11"
/**
* @brief Bootstrap callback
* @param aContext Not used
* @param aMessage coap message
* @param aMessageInfo Not used
* @param aError Error happened during receiving of coap message
*/
void bootStrapCallBack(
void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otError aError) {
uint32_t length = otMessageGetLength(aMessage) - otMessageGetOffset(aMessage);
uint8_t buff_callback[256];
if (aError != OT_ERROR_NONE) {
LOG_INF("(bootstrap call_back) Error receiving coap response message: Error %d: %s\r\n", aError,
otThreadErrorToString(aError));
} else {
if (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_CONTENT) {
LOG_INF("(bootstrap call_back) Response received successfully\n\r");
if (length < 256) {
otMessageRead(aMessage, otMessageGetOffset(aMessage), buff_callback, length);
LOG_INF("%s\n\r", buff_callback);
} else {
LOG_INF("Response length too lengthy\n");
}
} else {
LOG_INF("Response code is %d, %s\r\n", otCoapMessageGetCode(aMessage),
otThreadErrorToString(otCoapMessageGetCode(aMessage)));
}
}
OT_UNUSED_VARIABLE(aContext);
OT_UNUSED_VARIABLE(aMessageInfo);
}
/**
* @brief send coap packet for bootstraping
*/
void coap_send_bootstrap_message() {
char buff[512];
char *bootstrap_message_payload = NULL;
sprintf(buff, BOOTSTRAP_MESSAGE_FORMAT);
bootstrap_message_payload = (char *)malloc(512);
strcpy(bootstrap_message_payload, buff);
otMessageInfo message_info;
otMessage *p_message;
otError error = OT_ERROR_NONE;
do {
p_message = otCoapNewMessage(openthread_get_default_instance(), NULL);
otCoapMessageInit(p_message, OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_POST);
otCoapMessageGenerateToken(p_message, 2);
otCoapMessageAppendUriPathOptions(p_message, COMMON_RESOURCE);
otCoapMessageAppendUriQueryOption(p_message, EUID);
otCoapMessageAppendUriQueryOption(p_message, PACKET_VERSION);
otCoapMessageAppendUriQueryOption(p_message, BOOTSTRAP);
otCoapMessageSetPayloadMarker(p_message);
if (p_message == NULL) {
LOG_INF("Failed to allocate config message for CoAP Request\r\n");
break;
}
error = otMessageAppend(p_message, bootstrap_message_payload, strlen(bootstrap_message_payload));
if (error != OT_ERROR_NONE) {
break;
}
memset(&message_info, 0, sizeof(message_info));
message_info.mPeerPort = COAP_PORT;
otIp6AddressFromString(BORDER_ROUTER_IP, &message_info.mPeerAddr);
error = otCoapSendRequest(openthread_get_default_instance(), p_message, &message_info, bootStrapCallBack, NULL);
} while (false);
if (error != OT_ERROR_NONE && p_message != NULL) {
LOG_INF("Failed to send config CoAP Request: %d\r\n", error);
otMessageFree(p_message);
} else {
LOG_INF("Packet sent successfully");
}
return error;
}
As per logs, my packet is being sent, but I don't receive any packet on my CoAP Server interface.
can you suggest if I need to enable any specific configuration in prj.conf or anywhere in the code.