Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
COAP_ASYNC(3)			 libcoap Manual 		   COAP_ASYNC(3)

NAME
     coap_async,  coap_register_async, coap_async_trigger, coap_async_set_delay,
     coap_find_async,	      coap_free_async,		coap_async_set_app_data,
     coap_async_get_app_data - Work with CoAP async support

SYNOPSIS
     #include <coap3/coap.h>

     coap_async_t *coap_register_async(coap_session_t *session, const coap_pdu_t
     *request, coap_tick_t delay);

     void coap_async_trigger(coap_async_t *async);

     void coap_async_set_delay(coap_async_t *async, coap_tick_t delay);

     void coap_free_async(coap_session_t *session, coap_async_t *async);

     coap_async_t *coap_find_async(coap_session_t *session, coap_bin_const_t to-
     ken);

     void coap_async_set_app_data(coap_async_t *async, void *app_data);

     void *coap_async_get_app_data(const coap_async_t *async);

     For   specific   (D)TLS   library	 support,   link   with  -lcoap-3-notls,
     -lcoap-3-gnutls, -lcoap-3-openssl,  -lcoap-3-mbedtls,  -lcoap-3-wolfssl  or
     -lcoap-3-tinydtls.  Otherwise, link with -lcoap-3 to get the default (D)TLS
     library support.

DESCRIPTION
     CoAP server responses can be piggybacked ("RFC7252 5.2.1. Piggybacked")  or
     separate ("RFC7252 5.2.2. Separate").

     For piggybacked responses, the response packet contains both the status and
     any data.

     For separate responses, there is an initial empty ACK response (Confirmable
     only  - to stop the client re-transmitting the request) followed at a later
     time by a packet containing the status and any data.

     Usually responses are piggybacked, but this man page focuses on a mechanism
     for providing separate (async) support.

     NOTE: If a server is providing Proxy support, then the server  code  should
     return  from  the	request  handler with no response code set (i.e. respond
     with empty ACK) and then send back the response as provided by the upstream
     server when received, so no need to use the async support.

FUNCTIONS
     Function: coap_register_async()

     The coap_register_async() function is used to set up  an  asynchronous  de-
     layed request for the request PDU associated with the session. The applica-
     tion  request  handler  will  get called with a copy of request after delay
     ticks which will then cause a response to be sent. If delay is 0, then  the
     application  request handler will not get called until coap_async_trigger()
     or coap_async_set_delay() is called.

     Function: coap_async_trigger()

     The coap_async_trigger() function is used to expire the delay for the async
     definition, so  the  application  request	handler  is  almost  immediately
     called.

     Function: coap_async_set_delay()

     The  coap_async_set_delay()  function is used to update the remaining delay
     before the application request handler is called for the async  definition.
     If  delay	is  set  to 0, then the application request handler will not get
     called.

     An example of usage here is coap_register_async() sets delay to 0, and then
     when the response is  ready  at  an  indeterminate  point	in  the  future,
     coap_async_set_delay()   is  called  setting  delay  to  1.  Alternatively,
     coap_async_trigger() can be called.

     Function: coap_free_async()

     The coap_free_async() function is used to delete an async definition.

     Function: coap_find_async()

     The coap_find_async() function is used to determine if there  is  an  async
     definition based on the session and token token.

     Function: coap_async_set_app_data()

     The  coap_async_set_app_data()  function  is  used  to  add in user defined
     app_data to the async definition. It is the responsibility of the	applica-
     tion  to  release this data if appropriate. This would usually be done when
     the application request handler is called under async control.

     Function: coap_async_get_app_data()

     The coap_async_get_app_data() function is used to retrieve any defined  ap-
     plication data from the async definition.

RETURN VALUES
     coap_register_async()  and  coap_find_async()  return a pointer to an async
     definition or NULL if there is an error.

     coap_async_get_app_data() returns a pointer to the user defined data.

EXAMPLES
     CoAP Server Non-Encrypted Setup

	 #include <coap3/coap.h>

	 /*
	  * This example is used to demonstrate how to set up and use a "separate"
	  * response (empty ACK followed by data response at a later stage).
	  */
	 static void
	 hnd_get_with_delay(coap_session_t *session,
			    coap_resource_t *resource,
			    coap_pdu_t *request,
			    coap_string_t *query,
			    coap_pdu_t *response) {
	   unsigned long delay = 5;
	   size_t size;
	   coap_async_t *async;
	   coap_bin_const_t token = coap_pdu_get_token(request);

	   /*
	    * See if this is the initial, or delayed request
	    */

	   async = coap_find_async(session, token);
	   if (!async) {
	     /* Set up an async request to trigger delay in the future */
	     if (query) {
	       const uint8_t *p = query->s;

	       delay = 0;
	       for (size = query->length; size; --size, ++p)
		 delay = delay * 10 + (*p - '0');
	       if (delay == 0) {
		 coap_log_info("async: delay of 0 not supported\n");
		 coap_pdu_set_code(response, COAP_RESPONSE_CODE_BAD_REQUEST);
		 return;
	       }
	     }
	     async = coap_register_async(session,
					 request,
					 COAP_TICKS_PER_SECOND * delay);
	     if (async == NULL) {
	       coap_pdu_set_code(response, COAP_RESPONSE_CODE_SERVICE_UNAVAILABLE);
	       return;
	     }
	     /*
	      * Not setting response code will cause empty ACK to be sent
	      * if Confirmable
	      */
	     return;
	   }
	   /* async is set up, so this is the delayed request */

	   /* remove any stored app data associated with 'async' here */

	   /* Send back the appropriate data */
	   coap_add_data_large_response(resource, session, request, response,
					query, COAP_MEDIATYPE_TEXT_PLAIN, -1, 0, 4,
					(const uint8_t *)"done", NULL, NULL);
	   coap_pdu_set_code(response, COAP_RESPONSE_CODE_CONTENT);

	   /* async is automatically removed by libcoap on return from this handler */
	 }

SEE ALSO
     coap_handler(3) and coap_supported(3)

FURTHER INFORMATION
     See

     "RFC7252: The Constrained Application Protocol (CoAP)"

     for further information.

BUGS
     Please raise an issue on GitHub  at  https://github.com/obgm/libcoap/issues
     to report any bugs.

     Please  raise  a  Pull Request at https://github.com/obgm/libcoap/pulls for
     any fixes.

AUTHORS
     The libcoap project <libcoap-developers@lists.sourceforge.net>

coap_async 4.3.5		   08/02/2026			   COAP_ASYNC(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=coap_async&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help