coap_client

Example of the component espressif/coap v4.3.4~2
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 |
| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- |


# CoAP client example

(See the README.md file in the upper level esp-idf 'examples' directory for more information
about examples.)

This CoAP client example is very simplified adaptation of one of the
[libcoap](https://github.com/obgm/libcoap) examples.

CoAP client example will connect your ESP32 device to a CoAP server, send off a GET request and
fetch the response data from CoAP server.  The client can be extended to PUT / POST / DELETE requests,
as well as supporting the Observer extensions [RFC7641](https://tools.ietf.org/html/rfc7641).

If the URI is prefixed with coaps:// instead of coap://, then the CoAP client will attempt to use
the DTLS protocol using the defined Pre-Shared Keys(PSK) or Public Key Infrastructure (PKI) which the
CoAP server needs to know about. If both PSK and PKI are defined, then it is the responsibility
of the client code to decide (PSK or PKI) which to use.

If the URI is prefixed with coap+tcp://, then the CoAP will try to use TCP for the communication.

If the URI is prefixed with coaps+tcp://, then the CoAP will try to use TLS for the communication.
If both PSK and PKI are defined, then it is the responsibility of the client code to decide (PSK
or PKI) which to use.

If the URI is prefixed with coap+ws://, then the CoAP will try to use WebSockets (over TCP) for
the communication, which assumes that CoAP WebSockets is enabled in the build.

If the URI is prefixed with coaps+ws://, then the CoAP will try to use WebSockets (over TLS) for
the communication, which assumes that CoAP WebSockets is enabled in the build.
If both PSK and PKI are defined, then it is the responsibility of the client code to decide (PSK
or PKI) which to use.

The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with
constrained nodes and constrained networks in the Internet of Things.
The protocol is designed for machine-to-machine (M2M) applications such as smart energy and
building automation.

Please refer to [RFC7252](https://www.rfc-editor.org/rfc/pdfrfc/rfc7252.txt.pdf) for more details.

## How to use example

### Configure the project

```
idf.py menuconfig
```

Example Connection Configuration  --->
 * Set WiFi SSID
 * Set WiFi Password
Component config  --->
  CoAP Configuration  --->
    * Set encryption method definition, PSK (default) and/or PKI
    * Enable CoAP debugging if required
    * Disable CoAP using TCP if this is not required (TCP needed for TLS or WebSockets)
    * Disable CoAP server functionality to reduce code size
    * Enable OSCORE (RFC8613) support if required
    * Enable WebSockets (RFC8323) support if required
Example CoAP Client Configuration  --->
 * Set CoAP Target Uri
 * If PSK, Set CoAP Preshared Key to use in connection to the server
 * If PSK, Set CoAP PSK Client identity (username)

Note:
 * For enabled PKI, the certificates are stored in main/certs.
 * For enabled OSCORE, the OSCORE configuration is stored in main/oscore and will be used on
   every request.

### Build and Flash

Build the project and flash it to the board, then run monitor tool to view serial output:

```
idf.py build
idf.py -p PORT flash monitor
```

(To exit the serial monitor, type ``Ctrl-]``.)

See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.

## Example Output
Prerequisite: we startup a CoAP server on coap server example,
or use the default of coap://californium.eclipseprojects.io.

and you could receive data from CoAP server if succeed,
such as the following log:

```
...
I (332) wifi: mode : sta (30:ae:a4:04:1b:7c)
I (1672) wifi: n:11 0, o:1 0, ap:255 255, sta:11 0, prof:1
I (1672) wifi: state: init -> auth (b0)
I (1682) wifi: state: auth -> assoc (0)
I (1692) wifi: state: assoc -> run (10)
I (1692) wifi: connected with huawei_cw, channel 11
I (1692) wifi: pm start, type: 1

I (2582) event: sta ip: 192.168.3.89, mask: 255.255.255.0, gw: 192.168.3.1
I (2582) CoAP_client: Connected to AP
I (2582) CoAP_client: DNS lookup succeeded. IP=35.185.40.182
Received:
****************************************************************
CoAP RFC 7252                                  Cf 3.0.0-SNAPSHOT
****************************************************************
This server is using the Eclipse Californium (Cf) CoAP framework
published under EPL+EDL: http://www.eclipse.org/californium/

(c) 2014-2020 Institute for Pervasive Computing, ETH Zurich and others
****************************************************************
...
```

## libcoap Documentation
This can be found at [libcoap Documentation](https://libcoap.net/documentation.html).
The current API is 4.3.4.

## libcoap Specific Issues
These can be raised at [libcoap Issues](https://github.com/obgm/libcoap/issues).

## Troubleshooting
* Please make sure Target Url includes valid `host`, optional `port`,
optional `path`, and begins with `coap://`, `coaps://`, `coap+tcp://`, `coaps+tcp://`,
`coap+ws://` or `coaps+ws://`.
  * Not all hosts support TCP/TLS including coap+tcp://californium.eclipseprojects.io
  * Not all hosts support WebSockets, which needs to be enabled as an option

* CoAP logging can be enabled by running
'idf.py menuconfig -> Component config -> CoAP Configuration -> Enable CoAP debugging'
and setting appropriate log level.  If Mbed TLS logging is required, this needs to be
configured separately under mbedTLS Component Configuration.

To create a project from this example, run:

idf.py create-project-from-example "espressif/coap=4.3.4~2:coap_client"

or download archive (~12.45 KB)