zephyr/samples/net/sockets/coap_download
..
src
CMakeLists.txt
Kconfig
README.rst
prj.conf
sample.yaml

README.rst

.. zephyr:code-sample:: coap-download
   :name: CoAP download
   :relevant-api: coap

   Use the CoAP client API to download data via a GET request

Overview
********

This sample demonstrates the use of the CoAP client API to make GET requests to
a CoAP server. If the data to be fetched is larger than a single CoAP packet,
a blockwise transfer will be used to receive the data.

Once the transfer is complete, the sample prints the amount of data received
and the time taken.

Requirements
************
- :ref:`networking_with_host`, :ref:`networking_with_native_sim`
- or, a board with hardware networking (tested on nucleo_h753zi)
- Network connection between the board and host running a CoAP server

Build and Running
*****************
Build the CoAP download sample application like this:

.. zephyr-app-commands::
   :zephyr-app: samples/net/sockets/coap_download
   :board: <board to use>
   :conf: <config file to use>
   :goals: build
   :compact:

The easiest way to run this sample application is to build and run it as a
native_sim application. Some setup is required as described in
:ref:`networking_with_native_sim`.

Download a CoAP server application, for example `aiocoap`_ (Python), or
`Eclipse Californium`_ (Java) has a demo `Simple File Server`_ application.

Using ``aiocoap``:

.. code-block:: bash

    python -m pip install "aiocoap[all]"
    mkdir file_root
    echo "some test data" > file_root/test.txt
    aiocoap-fileserver file_root

You can also change the name of the CoAP resource to request via Kconfig:

.. code-block:: cfg

    CONFIG_NET_SAMPLE_COAP_RESOURCE_PATH="resource_name_to_request"

Launch :command:`net-setup.sh` in net-tools:

.. code-block:: bash

   ./net-setup.sh

Build and run the coap_download sample application for native_sim like this:

.. zephyr-app-commands::
   :zephyr-app: samples/net/sockets/coap_download
   :host-os: unix
   :board: native_sim
   :goals: run
   :compact:

Sample output
=============

.. code-block:: console

    [00:00:00.000,000] <inf> net_config: Initializing network
    [00:00:00.000,000] <inf> net_config: IPv4 address: 192.0.2.1
    [00:00:00.110,000] <inf> net_config: IPv6 address: 2001:db8::1
    [00:00:00.110,000] <inf> net_config: IPv6 address: 2001:db8::1
    [00:00:00.110,000] <inf> coap_download: Network L4 is connected
    [00:00:00.110,000] <inf> coap_download: Starting CoAP download using IPv4
    [00:00:00.180,000] <inf> coap_download: CoAP response, result_code=69, offset=0, len=100
    [00:00:00.180,000] <inf> coap_download: CoAP download done, got 100 bytes in 70 ms
    [00:00:00.180,000] <inf> coap_download: Starting CoAP download using IPv6
    [00:00:00.300,000] <inf> coap_download: CoAP response, result_code=69, offset=0, len=100
    [00:00:00.300,000] <inf> coap_download: CoAP download done, got 100 bytes in 120 ms

.. _aiocoap: https://github.com/chrysn/aiocoap
.. _Eclipse Californium: https://github.com/eclipse-californium/californium
.. _Simple File Server: https://github.com/eclipse-californium/californium/tree/main/demo-apps/cf-simplefile-server