<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/80841/how-to-add-dtls-to-nrf-coap-client</link><description>Hello, 
 i ran nRF Coap Client and it worked pretty well. 
 I am working with nRF9160 DK. 
 Now, I want to add DTLS to this example to secure the data. 
 Can someone please help me or is there any tutorials on how to do that? 
 
 Best regards, 
 Cedr</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 08 Nov 2021 14:19:31 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/80841/how-to-add-dtls-to-nrf-coap-client" /><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/337946?ContentTypeID=1</link><pubDate>Mon, 08 Nov 2021 14:19:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b1048c53-f4bc-4a6f-bfdc-c1692c0e3c05</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>[quote user="ced27"]Thanks for help once again[/quote]
&lt;p lang="en-GB"&gt;My pleasure :-)&lt;/p&gt;
[quote user="ced27"]i was able to perform DTLS Handshake.[/quote]
&lt;p lang="en-GB"&gt;Thanks for the update! I’m glad to hear that it works now :-)&lt;/p&gt;
&lt;p lang="en-GB"&gt;&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/337252?ContentTypeID=1</link><pubDate>Wed, 03 Nov 2021 11:52:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:248916d8-3b2b-4aa6-a439-ebe2d1f063c2</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Hello Markus,&lt;/p&gt;
&lt;p&gt;i was able to perform DTLS Handshake.&lt;/p&gt;
&lt;p&gt;Thanks for help once again&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/336625?ContentTypeID=1</link><pubDate>Fri, 29 Oct 2021 09:18:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:936d0d36-b98d-47c2-80e1-4c6f20bd4d0c</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>&lt;p lang="en-GB"&gt;Hello Cedric,&lt;/p&gt;
&lt;p lang="en-GB"&gt;I need to investigate this. I will be out of office next week, so I’m not able to look into this before earliest in 2 weeks. If you make any progress on your own during this time, I would be thankful if you could keep me posted.&lt;/p&gt;
&lt;p lang="en-GB"&gt;Also, my recommendation would be to get in touch with the server team. Maybe they can point out specifically what the problem is.&lt;/p&gt;
&lt;p lang="en-GB"&gt;Thanks and regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/336423?ContentTypeID=1</link><pubDate>Thu, 28 Oct 2021 11:03:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e3a60f06-1993-47a3-8267-1c124e2d028c</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Thank you very much for your reply.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I trace the iteraction once again. That&amp;#39;s what i got:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/trace_2D00_2021_2D00_10_2D00_28T10_2D00_52_2D00_42.203Z.zip"&gt;devzone.nordicsemi.com/.../trace_2D00_2021_2D00_10_2D00_28T10_2D00_52_2D00_42.203Z.zip&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Here is my code again:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

#include &amp;lt;zephyr.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;modem/lte_lc.h&amp;gt;
#include &amp;lt;net/socket.h&amp;gt;
#include &amp;lt;random/rand32.h&amp;gt;
#include &amp;lt;net/coap.h&amp;gt;

#include &amp;lt;modem/nrf_modem_lib.h&amp;gt;
#include &amp;lt;logging/log.h&amp;gt;
#include &amp;lt;sys/printk.h&amp;gt;
#include &amp;lt;modem/modem_key_mgmt.h&amp;gt;
#include &amp;lt;net/tls_credentials.h&amp;gt;
#include &amp;lt;nrfx.h&amp;gt;
#include &amp;lt;nrf_socket.h&amp;gt;

#include &amp;quot;ui.h&amp;quot;
#include &amp;quot;config.h&amp;quot;

#define PAYLOAD_BYTES 100

static int sock; // BSD socket API
static struct sockaddr_storage server; // structure f&amp;#252;r CoAP-Server- Addressinformation.
#define APP_COAP_VERSION 1  // CoAP Version

static uint16_t next_token; // request ID
static struct pollfd fds; /* File descriptor */

static uint8_t data[CONFIG_DATA_UPLOAD_SIZE_BYTES]; // Maximale Nachrichtgr&amp;#246;&amp;#223;e

// Benutzeroberfl&amp;#228;chenmodul.
static void ui_evt_handler(struct ui_evt *evt) // Event-Handler f&amp;#252;r LEDS
{
	if (!evt) {
		return;
	}
}


int coap_backend_ping(void)
{
	int err;
	struct coap_packet ping;

	next_token = 0;

	err = coap_packet_init(&amp;amp;ping, data, sizeof(data),
			       APP_COAP_VERSION, COAP_TYPE_CON,
			       0, NULL, 0, coap_next_id());
	if (err &amp;lt; 0) {
		printk(&amp;quot;Failed to create CoAP request, %d\n&amp;quot;, err);
		return err;
	}

	err = send(sock, ping.data, ping.offset, 0);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Failed to send CoAP PING, %d\n&amp;quot;, errno);
		return -errno;
	}

	printk(&amp;quot;CoAP PING sent: token 0x%04x\n&amp;quot;, next_token);

	return 0;
}

/*static int dtls_init(void){

int err;

#if defined(CONFIG_NRF_MODEM_LIB) &amp;amp;&amp;amp; defined(CONFIG_MODEM_KEY_MGMT)
	err = modem_key_mgmt_write(PSK_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_PSK,
				client_psk,
				strlen(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung des PSK fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}

       err = modem_key_mgmt_write(PSK_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_IDENTITY,
				psk_id,
				strlen(psk_id) - 1);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung der PSK-ID fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}
#endif


#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)

        // Provision Client PSK.
	err = tls_credential_add(PSK_TAG,
				TLS_CREDENTIAL_PSK,
				client_psk,
				sizeof(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK: %d&amp;quot;, err);
                return err;
	}

        // Provision Client Identity.
	err = tls_credential_add(PSK_TAG,
				TLS_CREDENTIAL_PSK_ID,
				psk_id,
				sizeof(psk_id) - 1);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK ID: %d&amp;quot;, err);
                return err;
	}

#endif
        return 0;
}*/

static int server_initialisieren(void)
{

	int err;
	struct addrinfo *result;
	struct addrinfo hints = {
		.ai_family = AF_INET,
		.ai_socktype = SOCK_DGRAM
	};
	
        char ipv4_addr[NET_IPV4_ADDR_LEN];

	err = getaddrinfo(CONFIG_SERVER_ADDRESS, NULL, &amp;amp;hints, &amp;amp;result);
	if (err != 0) {
		printk(&amp;quot;ERROR: getaddrinfo failed %d\n&amp;quot;, err);
		return -EIO;
	}

	if (result == NULL) {
		printk(&amp;quot;ERROR: Address not found\n&amp;quot;);
		return -ENOENT;
	}

	/* IPv4 Address. */
	struct sockaddr_in *server4 = ((struct sockaddr_in *)&amp;amp;server);  // Socket-Adressstruktur f&amp;#252;r IPv4

	server4-&amp;gt;sin_addr.s_addr =
		((struct sockaddr_in *)result-&amp;gt;ai_addr)-&amp;gt;sin_addr.s_addr;
	server4-&amp;gt;sin_family = AF_INET;  // AF_INET  = IP Protokoll Version 4 (IPv4)
	server4-&amp;gt;sin_port = htons(CONFIG_SERVER_PORT);  //Schreibe Port in Network-Byte-Order in das Feld sin_port

	inet_ntop(AF_INET, &amp;amp;server4-&amp;gt;sin_addr.s_addr, ipv4_addr,
		  sizeof(ipv4_addr));  // Schreibe IP-Adresse des Servers in die sockaddr_in-Struktur


	printk(&amp;quot;IPv4 Address found %s\n&amp;quot;, ipv4_addr);

	/* Free the address. */
        freeaddrinfo(result);

	return 0;

}

static int server_verbinden(void)
{
	int err;


#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS) &amp;amp;&amp;amp; defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)

	sec_tag_t tls_tag_list[] = {
		CONFIG_COAP_SEC_TAG,
	};

	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_DTLS_1_2);
	if (sock &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Erstellen des CoAP/DTLS-Sockets: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}

	err = setsockopt(sock, SOL_TLS, TLS_SEC_TAG_LIST,
			 tls_tag_list, sizeof(tls_tag_list));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Failed to set TLS_SEC_TAG_LIST option: %d&amp;quot;, errno);
                err = -errno;
		goto error;
	}

#else
	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sock &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Erstellen des CoAP-Sockets: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}
#endif

	err = connect(sock, (struct sockaddr *)&amp;amp;server,
		      sizeof(struct sockaddr_in)); // Verbindung zum Server herstellen

        // err=0 =&amp;gt; success, err&amp;lt;0 =&amp;gt; fehler
	if (err &amp;lt; 0) {
		printk(&amp;quot;Verbindung fehlgeschlagen: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}

        /* Initialize FDS, for poll. */
	fds.fd = sock;
	fds.events = POLLIN;

	/* Randomize token. */
	next_token = sys_rand32_get();

	return 0;

error:
	(void)close(sock); // beende die Verbindung zum Socket 

	return err;
}

/**@brief Handles responses from the remote CoAP server. */
static int client_handle_get_response(uint8_t *buf, int received)
{
	int err;
	struct coap_packet reply;
	const uint8_t *payload;
	uint16_t payload_len;
	uint8_t token[8];
	uint16_t token_len;
	uint8_t temp_buf[16];

	err = coap_packet_parse(&amp;amp;reply, buf, received, NULL, 0);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Malformed response received: %d\n&amp;quot;, err);
		return err;
	}

	payload = coap_packet_get_payload(&amp;amp;reply, &amp;amp;payload_len);
	token_len = coap_header_get_token(&amp;amp;reply, token);

	if ((token_len != sizeof(next_token)) &amp;amp;&amp;amp;
	    (memcmp(&amp;amp;next_token, token, sizeof(next_token)) != 0)) {
		printk(&amp;quot;Invalid token received: 0x%02x%02x\n&amp;quot;,
		       token[1], token[0]);
		return 0;
	}

	snprintf(temp_buf, MAX(payload_len, sizeof(temp_buf)), &amp;quot;%s&amp;quot;, payload);

	printk(&amp;quot;CoAP response: code: 0x%x, token 0x%02x%02x, payload: %s\n&amp;quot;,
	       coap_header_get_code(&amp;amp;reply), token[1], token[0], temp_buf);

	return 0;
}

static int uebertragung_zu_server_fn(void)
{
	int err;

        struct coap_packet request; // Anfragepaket
        
        const char payload[PAYLOAD_BYTES]=&amp;quot;AAAAAAAAAAAAAAAAAAAAAAAAAAAA&amp;quot;; // Payload, der &amp;#252;bertragen wird

        next_token++;

        //char uri_path[] = &amp;quot;obs&amp;quot;; //Coap Ressource: Californium test Ressouce (URI)

        // Initialisiere CoAP Anfrage
        err = coap_packet_init(&amp;amp;request, data, sizeof(data),
			       APP_COAP_VERSION, COAP_TYPE_NON_CON,
			       sizeof(next_token),(uint8_t *)&amp;amp;next_token,
                               COAP_METHOD_PUT, coap_next_id());

	if (err &amp;lt; 0) {
		printk(&amp;quot;CoAP-Anfrage konnte nicht erstellt werden, error %d\n&amp;quot;, err);
		return err;
	}
        // F&amp;#252;gt eine Option an das Paket an
	coap_packet_append_option(&amp;amp;request, COAP_OPTION_URI_PATH,
                                  (uint8_t *)CONFIG_COAP_RESOURCE, 
                                  strlen(CONFIG_COAP_RESOURCE));


        // Payload-Marker an CoAP-Paket anh&amp;#228;ngen
        coap_packet_append_payload_marker(&amp;amp;request);

        // Payload an CoAP-Paket anh&amp;#228;ngen
        err=coap_packet_append_payload(&amp;amp;request, (uint8_t *)payload, sizeof(payload) - 1);
        if (err &amp;lt; 0) {
		printk(&amp;quot;Payload konnte nicht angeh&amp;#228;ngt werden, %d\n&amp;quot;, err);
		return err;
	}

	err = send(sock, request.data, request.offset, 0); // Daten werden an den Port 5683 gesendet
	if (err &amp;lt; 0) {
		printk(&amp;quot;Paket konnte nicht &amp;#252;bertragen werden,error %d\n&amp;quot;, errno);
		return -errno;
	}

        printk(&amp;quot;CoAP Anfrage gesendet: token 0x%04x\n&amp;quot;, next_token);

        /*printk(&amp;quot;Payload von %d bytes wird an die &amp;quot;, sizeof(payload));
         // CONFIG_SERVER_ADDRESS = californium.eclipseprojects.io
         // CONFIG_SERVER_PORT = 5683
        printk(&amp;quot;IP Adresse %s, Port Nummer %d &amp;#252;bertragen\n&amp;quot;,
	       CONFIG_SERVER_ADDRESS,
	       CONFIG_SERVER_PORT);*/

        return 0;

}

// Ein Semaphore ist ein Kernel-Objekt, das ein traditionelles Z&amp;#228;hlsemaphor implementiert.
// Ein Semaphor wird verwendet, um den Zugriff auf eine Reihe von Ressourcen durch mehrere
// Threads zu steuern und um die Verarbeitung zwischen einem produzierenden und einem 
// verbrauchenden Thread oder Interrupt Service Routine (ISRs) zu synchronisieren.

static K_SEM_DEFINE(lte_verbunden, 0, 1); // Semaphore statisch definiert und initialisiert. 
                                          // lte_verbunden = Name des Semaphores. 0 = anf&amp;#228;ngliche Semaphorez&amp;#228;hlung 
                                          // 1 = maximal zul&amp;#228;ssige Semaphoranzahl.

static void lte_handler(const struct lte_lc_evt *const evt)
{
	switch (evt-&amp;gt;type) {
	case LTE_LC_EVT_NW_REG_STATUS: // emfangenes Ereignis mit Informationen zum Netwerkregistrierungsstatus
                                       // des Modems
		if ((evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &amp;amp;&amp;amp;
		     (evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
			break;
		}
                  
		printk(&amp;quot;Netwerkregistrierungsstatus: %s&amp;quot;,
			evt-&amp;gt;nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ?
			&amp;quot;verbunden mit Heimnetwerk\n&amp;quot; : &amp;quot;verbunden mit Roaming\n&amp;quot;);

		k_sem_give(&amp;amp;lte_verbunden); // Gib ein Semaphor an. Setzte die Z&amp;#228;hlung von lte_verbunden auf Null 
		break;                      // &amp;amp;lte_verbunden= Adresse des Semapores

	case LTE_LC_EVT_PSM_UPDATE: // empfangenes Ereignis mit Informationen zu PSM-Updates. Die Updates enthalten 
                                    //  PSM-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied psm_cfg vom Typ lte_lc_psm_cfg in dem Library lte.lc.h
                // tau = Periodisches Aktualisierungsintervall des Tracking-Bereichs.
                // active_time = Aktiv-Zeit (Zeit von RRC Leerlauf bis PSM)
		printk(&amp;quot;PSM-Parameter update: TAU: %d, Active time: %d\n&amp;quot;,
			evt-&amp;gt;psm_cfg.tau, evt-&amp;gt;psm_cfg.active_time);
		break;

	case LTE_LC_EVT_EDRX_UPDATE:{// empfangenes Ereignis mit Informationen zu eDRX-Updates. Die Updates enthalten 
                                    //  eDRX-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied edrx_cfg vom Typ lte_lc_edrx_cfg in dem Library lte.lc.h
                // edrx = eDRX-Intervallwert [s]
                // ptw = Paging-Zeitfenster [s]
		char log_buf[60];
		ssize_t len;

		len = snprintf(log_buf, sizeof(log_buf),
			       &amp;quot;eDRX parameter update: eDRX: %f, PTW: %f\n&amp;quot;,
			       evt-&amp;gt;edrx_cfg.edrx, evt-&amp;gt;edrx_cfg.ptw);
		if (len &amp;gt; 0) {
			printk(&amp;quot;%s\n&amp;quot;, log_buf);
		}
		break;
         }

	case LTE_LC_EVT_RRC_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber den 
                                    // Radio Ressource Control(RRC)-Status des Modems
                
                // Das zugeh&amp;#246;rige Payload ist das Mitglied rrc_mode vom Typ lte_lc_rrc_mode in dem Library lte.lc.h
                // RRC Modus ist entweder verbunden oder idle.
		printk(&amp;quot;RRC Modus: %s&amp;quot;,
			evt-&amp;gt;rrc_mode == LTE_LC_RRC_MODE_CONNECTED ?
			&amp;quot;verbunden\n&amp;quot; : &amp;quot;Idle\n&amp;quot;);
		break;

	case LTE_LC_EVT_CELL_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber die aktuell verbundene Zelle

                // Das zugeh&amp;#246;rige Payload ist das Mitglied Cell vom Typ lte_lc_cell in dem Library lte.lc.h
                // id = Mobilfunkzellenidentifikation
                // tac = Tracking area code
		printk(&amp;quot;LTE ver&amp;#228;nderte Zelle: Zelle ID: %d, Tracking area: %d\n&amp;quot;,
			evt-&amp;gt;cell.id, evt-&amp;gt;cell.tac);
		break;

	case LTE_LC_EVT_LTE_MODE_UPDATE: // Wenn ein Systemmodus konfiguiert ist,der entweder LTE-M oder NB-IoT
                                         // aktiviert, kann das Modem den aktuell aktiven LTE-Modus basierend auf
                                         // der Netwerkverf&amp;#252;gbarkeit &amp;#228;ndern. Dieses Ereignis zeigt dann an, welcher
                                         // LTE-Modus derzeit vom Modem verwendet wird.

		printk(&amp;quot;Active LTE Modus: %s&amp;quot;,
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NONE ? &amp;quot;None\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_LTEM ? &amp;quot;LTE-M\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NBIOT ? &amp;quot;NB-IoT\n&amp;quot; :
			&amp;quot;Unknown\n&amp;quot;);
		break;
	default:
		break;
	}
}

static void modem_konfigurieren(void)
{
#if defined(CONFIG_NRF_MODEM_LIB) // CONFIG_NRF_MODEM_LIB = verwende Nordic Modem Library
	if (IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT)) { 
                  // CONFIG_LTE_AUTO_INIT_AND_CONNECT = automatische Registrierung bei LTE-M oder NB-IoT
		  // passiert nichts, falls der Modem bereits konfiguriert und LTE verbunden ist.

	} else {

		int err; // integer f&amp;#252;r errors

#if defined(CONFIG_PSM_ENABLE) // CONFIG_PSM_ENABLE fordert PSM vom Modbilfunknetz an.

		/* Das Anfordern von PSM vor der Verbindung erm&amp;#246;glicht es dem Modem, das
		 * Netwerk bereits w&amp;#228;hrend des Verbindungsvorgangs &amp;#252;ber unseren Wunsch
		 * nach einer bestimmten PSM-Konfiguration zu informieren, anstatt in 
		 * einer separaten Anfrage nach der Verbindungsherstellung, die in einigen
		 * Netzwerken abgelehnt werden kann */
		
		err = lte_lc_psm_req(true); // Anfordern des Modems, das Power saving mode zu aktivieren
		if (err &amp;lt; 0) {
                         // Falls err= negativ =&amp;gt;  Fehler aufgetreten

			printk(&amp;quot;Power Saving Mode wurde nicht aktiviert, error: %d\n&amp;quot;,
				err);
		} else{
                      // falls err=0  =&amp;gt; das Anfordern war erfolgreich

                      printk(&amp;quot;PSM-Modus aktiviert\n\n&amp;quot;);
                }
#endif

#if defined(CONFIG_EDRX_ENABLE) // CONFIG_EDRX_ENABLE fordert eDRX vom Modbilfunknetz an.

	/** Extended Discontinuous Reception (eDRX) erm&amp;#246;glicht es das Sleep mode
            in RRC idle mode auf Minuten oder Stunden zu verl&amp;#228;ngern, was noch deutlichere
            Einsparungen beim Energieverbrauch bietet*/

	err = lte_lc_edrx_req(true); // eDRX wird aktiviert
	if (err&amp;lt;0) {
		printk(&amp;quot;eDRX wurde nicht aktiviert, error: %d\n&amp;quot;, err);
	}else {
		printk(&amp;quot;eDRX aktiviert\n&amp;quot;);
	}
#endif


                ui_led_set_pattern(UI_LTE_CONNECTING); // LED3 blinkt, um der Verbindungsherstellungsvorgang 
                                                      // zu signalisieren.
		printk(&amp;quot;Verbindung zum LTE-Netz wird hergestellt\n&amp;quot;);
		printk(&amp;quot;Das kann ein paar Minuten dauern..\n&amp;quot;);
		
                // lte_lc_init_and_connect_async initialisiert das LTE-Modul, 
                // konfiguriert das Modem und verbindet sich mit dem LTE-Netzwerk.
                // lte_lc_init_and_connect_async &amp;#252;berpr&amp;#252;ft zus&amp;#228;tzlich die LTE-Ereignisse
                // vom Typ LTE_LC_EVT_NW_REG_STATUS in lte_handler(), um festzustellen, wann
                // die LTE-Verbindung besteht.

		err = lte_lc_init_and_connect_async(lte_handler);
		if (err) {
                // err= negativ =&amp;gt; Fehler aufgetreten

			printk(&amp;quot;Modem konnte nicht konfiguriert werden, error: %d\n&amp;quot;,
				err);
			return;
		}
                // err=0 =&amp;gt; besteht LTE-Verbindung 

                printk(&amp;quot;Mit LTE-Netz verbunden\n&amp;quot;);
		ui_led_set_pattern(UI_LTE_CONNECTED); // LED3 leuchtet, um das Bestehen der Verbindung vorzugeben.
	}
#endif
}


/* Gibt 0 zur&amp;#252;ck, wenn Daten verf&amp;#252;gbar sind.
 * Gibt -EAGAIN zur&amp;#252;ck, wenn eine Zeit&amp;#252;berschreitung aufgetreten ist und keine Daten geschickt sind.
 * Gibt im Falle eines Poll-Fehlers einen anderen, negativen Fehlercode zur&amp;#252;ck.
 */
static int wait(int timeout)
{
	int ret = poll(&amp;amp;fds, 1, timeout);

	if (ret &amp;lt; 0) {
		printk(&amp;quot;poll error: %d\n&amp;quot;, errno);
		return -errno;
	}

	if (ret == 0) {
		/* Timeout. */
		return -EAGAIN;
	}

	if ((fds.revents &amp;amp; POLLERR) == POLLERR) {
		printk(&amp;quot;warte: POLLERR\n&amp;quot;);
		return -EIO;
	}

	if ((fds.revents &amp;amp; POLLNVAL) == POLLNVAL) {
		printk(&amp;quot;warte: POLLNVAL\n&amp;quot;);
		return -EBADF;
	}

	if ((fds.revents &amp;amp; POLLIN) != POLLIN) {
		return -EAGAIN;
	}

	return 0;
}

void main(void)
{

        int64_t next_msg_time = CONFIG_DATA_UPLOAD_FREQUENCY_MS;
	int err,received;

	printk(&amp;quot;Startet.....\n&amp;quot;);

        //err = dtls_init();
        //  if (err&amp;lt;0) {
        //  printk(&amp;quot;DTLS Init Error: %d\n&amp;quot;, err);
        //}

        // Initialisiere das Benutzeroberfl&amp;#228;chenmodul
        ui_init(ui_evt_handler);

        // Modem wird konfiguriert
#if defined(CONFIG_NRF_MODEM_LIB)

	modem_konfigurieren();

	k_sem_take(&amp;amp;lte_verbunden, K_FOREVER);
#endif

      next_msg_time = k_uptime_get();

        // Verbindungsaufbau des Clients zu dem Server
	err = server_initialisieren();
	if (err) {
		printk(&amp;quot;Serververbindung kann nicht initialisiert werden\n&amp;quot;);
		return;
	}
        
        // Verbindung zum Server herstellen
	err = server_verbinden();
	if (err) {
		printk(&amp;quot;Keine Verbindung zum Server m&amp;#246;glich\n&amp;quot;);
		return;
	}

while (1) {
		if (k_uptime_get() &amp;gt;= next_msg_time) {
			if (uebertragung_zu_server_fn() != 0) {
				printk(&amp;quot;Fehler beim Senden der Anfrage, exit...\n&amp;quot;);
				break;
			}

			next_msg_time += CONFIG_DATA_UPLOAD_FREQUENCY_MS;
		}

		int64_t remaining = next_msg_time - k_uptime_get();

		if (remaining &amp;lt; 0) {
			remaining = 0;
		}

		err = wait(remaining);
		if (err &amp;lt; 0) {
			if (err == -EAGAIN) {
				continue;
			}

			printk(&amp;quot;Poll error, exit...\n&amp;quot;);
			break;
		}

                
		received = recv(sock, data, sizeof(data), MSG_DONTWAIT);
		if (received &amp;lt; 0) {
			if (errno == EAGAIN || errno == EWOULDBLOCK) {
				printk(&amp;quot;socket EAGAIN\n&amp;quot;);
				continue;
			} else {
				printk(&amp;quot;Socket error, exit...\n&amp;quot;);
				break;
			}
		}

		if (received == 0) {
			printk(&amp;quot;Empty datagram\n&amp;quot;);
			continue;
		}

		err = client_handle_get_response(data, received);
		if (err &amp;lt; 0) {
			printk(&amp;quot;Invalid response, exit...\n&amp;quot;);
			break;
		}

	}

}
&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/336281?ContentTypeID=1</link><pubDate>Wed, 27 Oct 2021 16:06:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:35c17952-faaa-443b-95a9-f8993b5fce45</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>&lt;p lang="en-GB"&gt;Hello Cedric,&lt;/p&gt;
[quote user="ced27"]1. How did the&amp;nbsp;GET-request reach the californium Server? did you do any configurations on the server side, before you could get a response from server?[/quote]
&lt;p lang="en-GB"&gt;Californium is a publicly available server which the device is connecting to via an IP address. The modem is performing a DNS lookup against the domain&amp;#39;s authoritative name server, which ensures the connection to it. CoAP is a protocol above the internet and transport layer and as long as the server supports it, the basic configuration should be in place.&lt;/p&gt;
[quote user="ced27"]2. If i want to use another&amp;nbsp;CONFIG_COAP_RESOURCE other than &amp;quot;obs&amp;quot;, what are the other resources? Are these resources already given or should i defined one myself?&amp;nbsp;[/quote]
&lt;p lang="en-GB"&gt;That depends on the server. If you want to use Californium, I recommend you to check their &lt;a href="https://docs.google.com/presentation/d/1dDZ7VTdjBZxnqcIt6qoX742d6dHbzap-D_H8Frf3LRE/edit#slide=id.p"&gt;tutorial&lt;/a&gt; and/or get in touch with them.&lt;/p&gt;
[quote user="ced27"]3. If i can define it myself, what are the requirements to make sure i get a given response from the server?[/quote]
&lt;p lang="en-GB"&gt;The resource has to exist on the server side and if it doesn’t, the server should allow the device to create it via a POST/PUT request.&lt;/p&gt;
[quote user="ced27"]4. How can i make sure that for example&lt;span&gt;&amp;nbsp;a&amp;nbsp;message from my modem reaches the host i run Californium?&lt;/span&gt;[/quote]
&lt;p lang="en-GB"&gt;The server should be publicly available with an IP address/port forwarding. The IP address can either be static or registered as a hostname via a DNS server. Californium fulfills these criteria. Additionally, &lt;a href="https://datatracker.ietf.org/doc/html/rfc7252#section-2.1"&gt;Confirmable messages&lt;/a&gt; can be used which will be acknowledged by the server.&lt;/p&gt;
&lt;p lang="en-GB"&gt;I hope this answers your questions!&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335991?ContentTypeID=1</link><pubDate>Tue, 26 Oct 2021 13:20:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:63560ae0-0b8c-4781-9e41-c75d30010b59</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Thanks for your request.&lt;/p&gt;
&lt;p&gt;when running &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/nrf9160/coap_client/README.html"&gt;coap client&amp;nbsp;&lt;/a&gt;, everying works as required. Just for understanding i have some questions:&lt;/p&gt;
&lt;p&gt;1. How did the&amp;nbsp;GET-request reach the californium Server? did you do any configurations on the server side, before you could get a response from server?&lt;/p&gt;
&lt;p&gt;2. If i want to use another&amp;nbsp;CONFIG_COAP_RESOURCE other than &amp;quot;obs&amp;quot;, what are the other resources? Are these resources already given or should i defined one myself?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. If i can define it myself, what are the requirements to make sure i get a given response from the server?&lt;/p&gt;
&lt;p&gt;4. How can i make sure that for example&lt;span&gt;&amp;nbsp;a&amp;nbsp;message from my modem reaches the host i run Californium?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I know i ask too much questions. But the only way for me to learn is by asking questions since i am a newbee in this area and i also want to thank you for your patience, comprehension and advices.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Cedric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335944?ContentTypeID=1</link><pubDate>Tue, 26 Oct 2021 11:40:06 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3fa8787b-f5b3-4210-978c-6b85069c2260</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
[quote user="ced27"]i haven&amp;#39;t done it from the Californium server side yet. Is there may be any tutorials on how i may it? And eventually how i may run a host on the californium server?[/quote]
&lt;p lang="en-GB"&gt;Unfortunately, we do not provide any tutorials for the Californium server. I recommend you to have a look &lt;a href="https://github.com/eclipse/californium#interop-server"&gt;here&lt;/a&gt; and/or contact the server team for additional support.&lt;/p&gt;
&lt;p lang="en-GB"&gt;&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335863?ContentTypeID=1</link><pubDate>Tue, 26 Oct 2021 07:18:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:666f335e-3d40-42bc-b0a5-6313a23ae67d</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Hi Markus,&lt;/p&gt;
&lt;p&gt;i haven&amp;#39;t done it from the Californium server side yet. Is there may be any tutorials on how i may it? And eventually how i may run a host on the californium server?&lt;/p&gt;
&lt;p&gt;Any idea will help&lt;/p&gt;
&lt;p&gt;thanks&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335735?ContentTypeID=1</link><pubDate>Mon, 25 Oct 2021 12:15:49 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:11a4f8d4-7f67-4fae-a86b-943a735690f9</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>[quote user="ced27"]Any idea of what the problem may be?[/quote]
&lt;p lang="en-GB"&gt;Have you updated the modem and server with a &lt;a href="https://infocenter.nordicsemi.com/topic/ref_at_commands/REF/at_commands/security/cmng_set.html"&gt;Pre-shared Key (PSK)&lt;/a&gt;?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335650?ContentTypeID=1</link><pubDate>Mon, 25 Oct 2021 08:23:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:53804ec6-e8bc-4a81-a6a2-561badee21c0</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;here is what i got:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/2021_2D00_10_2D00_25T08_5F00_20_5F00_24.407Z_2D00_log.txt"&gt;devzone.nordicsemi.com/.../2021_2D00_10_2D00_25T08_5F00_20_5F00_24.407Z_2D00_log.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Any idea of what the problem may be?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335643?ContentTypeID=1</link><pubDate>Mon, 25 Oct 2021 07:43:38 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:74467bee-8157-4f33-a0ab-df0e32bca2f1</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>[quote user="ced27"]CONFIG_SERVER_ADRESS is &amp;quot;californium.eclipseprojects.io&amp;quot; and the IP address is&amp;nbsp;35.185.40.182[/quote]
&lt;p lang="en-GB"&gt;In your case, CONFIG_SERVER_ADDRESS has to be the IP address since you can’t use the actual address of the server as an input argument to &lt;a href="https://man7.org/linux/man-pages/man3/inet_pton.3.html"&gt;inet_pton&lt;/a&gt; (right now probably the function won’t return 1).&lt;/p&gt;
&lt;p lang="en-GB"&gt;But anyway, my recommendation would be to use &lt;a href="https://man7.org/linux/man-pages/man3/getaddrinfo.3.html"&gt;getaddrinfo&lt;/a&gt; for CONFIG_SERVER_ADDRESS, as demonstrated in the &lt;a href="https://github.com/nrfconnect/sdk-nrf/blob/v1.7.0/samples/nrf9160/coap_client/src/main.c#L51"&gt;CoAP Client&lt;/a&gt;&amp;nbsp;sample.&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335625?ContentTypeID=1</link><pubDate>Mon, 25 Oct 2021 06:54:41 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0915811c-a021-4446-a6e4-a543d4ee26d7</guid><dc:creator>ced27</dc:creator><description>[quote userid="100109" url="~/f/nordic-q-a/80841/how-to-add-dtls-to-nrf-coap-client/335539#335539"]The problem appears to be the destination, which is 0.0.0.0. Which server/IP address are you trying to connect to? What is CONFIG_SERVER_ADRESS defined as?[/quote]
&lt;p&gt;&lt;span&gt;CONFIG_SERVER_ADRESS is &amp;quot;californium.eclipseprojects.io&amp;quot; and the IP address is&amp;nbsp;35.185.40.182&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335539?ContentTypeID=1</link><pubDate>Fri, 22 Oct 2021 16:06:29 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d88efa30-e5d6-4087-8648-b9fd2f18e618</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>[quote user="ced27"]Actually i am having problems with DTLS connection[/quote]
&lt;p lang="en-GB"&gt;The device initiates the DTLS handshake with a &amp;quot;Client Hello&amp;quot;, which is correct.&lt;/p&gt;
&lt;p lang="en-GB"&gt;&lt;img src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/6204.pastedimage1634918694963v1.png" alt=" " /&gt;&lt;/p&gt;
&lt;p lang="en-GB"&gt;The problem appears to be the destination, which is 0.0.0.0. Which server/IP address are you trying to connect to? What is CONFIG_SERVER_ADRESS defined as?&lt;/p&gt;
&lt;p lang="en-GB"&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static int server_initialisieren(void)
{

	struct sockaddr_in *server4 = ((struct sockaddr_in *)&amp;amp;server); // Socket-Adressstruktur f&amp;#252;r IPv4

	server4-&amp;gt;sin_family = AF_INET; // AF_INET  = IP Protokoll Version 4 (IPv4)
	server4-&amp;gt;sin_port = htons(CONFIG_SERVER_PORT); //Schreibe Port in Network-Byte-Order in das Feld sin_port

	inet_pton(AF_INET, CONFIG_SERVER_ADDRESS,
		  &amp;amp;server4-&amp;gt;sin_addr); // Schreibe IP-Adresse des Servers in die sockaddr_in-Struktur
  

	return 0;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335399?ContentTypeID=1</link><pubDate>Fri, 22 Oct 2021 06:36:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:83ed788b-7e23-412b-8705-7d8d9ccde678</guid><dc:creator>ced27</dc:creator><description>[quote userid="100109" url="~/f/nordic-q-a/80841/how-to-add-dtls-to-nrf-coap-client/335352#335352"]Honestly, I’m not quite sure what issue you have. Can you elaborate?[/quote]
&lt;p&gt;Actually i am having problems with DTLS connection and my aim is to be able to encrypt all data with a Pre Shared Key (PSK) before sending it to the server.&lt;/p&gt;
&lt;p&gt;Here is a sample of my code:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

#include &amp;lt;zephyr.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;modem/lte_lc.h&amp;gt;
#include &amp;lt;net/socket.h&amp;gt;
#include &amp;lt;random/rand32.h&amp;gt;
#include &amp;lt;net/coap.h&amp;gt;

#include &amp;lt;modem/nrf_modem_lib.h&amp;gt;
#include &amp;lt;logging/log.h&amp;gt;
#include &amp;lt;sys/printk.h&amp;gt;
#include &amp;lt;modem/modem_key_mgmt.h&amp;gt;
#include &amp;lt;net/tls_credentials.h&amp;gt;
#include &amp;lt;nrfx.h&amp;gt;
#include &amp;lt;nrf_socket.h&amp;gt;

#include &amp;quot;ui.h&amp;quot;
#include &amp;quot;config.h&amp;quot;

#define PAYLOAD_BYTES 100
#define PSK_TAG 2

static int sock; // BSD socket API
static struct sockaddr_storage server; // structure f&amp;#252;r CoAP-Server- Addressinformation.

static uint16_t token; // request ID
static struct pollfd fds;

// Benutzeroberfl&amp;#228;chenmodul.
static void ui_evt_handler(struct ui_evt *evt) // Event-Handler f&amp;#252;r LEDS
{
	if (!evt) {
		return;
	}
}

static int dtls_init(void){

int err;

#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS) &amp;amp;&amp;amp; defined(CONFIG_MODEM_KEY_MGMT)
	err = modem_key_mgmt_write(PSK_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_PSK,
				client_psk,
				strlen(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung des PSK fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}

       err = modem_key_mgmt_write(PSK_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_IDENTITY,
				psk_id,
				strlen(psk_id) - 1);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung der PSK-ID fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}
#endif


#if defined(CONFIG_MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)

        // Provision Client PSK.
	err = tls_credential_add(PSK_TAG,
				TLS_CREDENTIAL_PSK,
				client_psk,
				sizeof(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK: %d&amp;quot;, err);
                return err;
	}

        // Provision Client Identity.
	err = tls_credential_add(PSK_TAG,
				TLS_CREDENTIAL_PSK_ID,
				psk_id,
				sizeof(psk_id) - 1);
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK ID: %d&amp;quot;, err);
                return err;
	}

#endif
        return 0;
}

static int server_initialisieren(void)
{

	struct sockaddr_in *server4 = ((struct sockaddr_in *)&amp;amp;server); // Socket-Adressstruktur f&amp;#252;r IPv4

	server4-&amp;gt;sin_family = AF_INET; // AF_INET  = IP Protokoll Version 4 (IPv4)
	server4-&amp;gt;sin_port = htons(CONFIG_SERVER_PORT); //Schreibe Port in Network-Byte-Order in das Feld sin_port

	inet_pton(AF_INET, CONFIG_SERVER_ADDRESS,
		  &amp;amp;server4-&amp;gt;sin_addr); // Schreibe IP-Adresse des Servers in die sockaddr_in-Struktur
  

	return 0;
}

static int server_verbinden(void)
{
	int err;

	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_DTLS_1_2); // Erzeuge Socket. SOCK_DGRAM = Datagram socket type
                                                              // IPPROTO_DTLS_1_2 = DTLS 1.2 protocol

        sec_tag_t sec_tag_opt[] = {TLS_CREDENTIAL_PSK};

        err = nrf_setsockopt(sock, NRF_SOL_SECURE, TLS_SEC_TAG_LIST,
                 sec_tag_opt, sizeof(sec_tag_opt) * ARRAY_SIZE(sec_tag_opt));

        // sock=0 =&amp;gt; success, sock&amp;lt;0 =&amp;gt; fehler
	if (sock &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Erstellen des CoAP/UDP-Sockets: error %d\n&amp;quot;, errno);
		err = -errno;
		goto error;
	}

	err = connect(sock, (struct sockaddr *)&amp;amp;server,
		      sizeof(struct sockaddr_in)); // Verbindung zum Server herstellen

        // err=0 =&amp;gt; success, err&amp;lt;0 =&amp;gt; fehler
	if (err &amp;lt; 0) {
		printk(&amp;quot;Verbindung fehlgeschlagen: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}

        /* Initialize FDS, for poll. */
	fds.fd = sock;
	fds.events = POLLIN;

	/* Randomize token. */
	token = sys_rand32_get();

	return 0;

error:
	(void)close(sock); // beende die Verbindung zum Socket 

	return err;
}

static int uebertragung_zu_server_fn(void)
{
	int err;

        struct coap_packet request; // Anfragepaket
        uint8_t data[CONFIG_DATA_UPLOAD_SIZE_BYTES]; // Maximale Nachrichtgr&amp;#246;&amp;#223;e
        const char payload[PAYLOAD_BYTES]=&amp;quot;AAAAAAAAAAAAAAAAAAAAAAAAAAAA&amp;quot;; // Payload, der &amp;#252;bertragen wird

        char uri_path[] = &amp;quot;test&amp;quot;; //Coap Ressource: Californium test Ressouce (URI)

        // Initialisiere CoAP Anfrage
        err = coap_packet_init(&amp;amp;request, data, sizeof(data),
			       1, COAP_TYPE_NON_CON,
			       0, NULL,COAP_METHOD_PUT, coap_next_id());

	if (err &amp;lt; 0) {
		printk(&amp;quot;CoAP-Anfrage konnte nicht erstellt werden, error %d\n&amp;quot;, err);
		return err;
	}
        // F&amp;#252;gt eine Option an das Paket an
	coap_packet_append_option(&amp;amp;request, COAP_OPTION_URI_PATH,
					uri_path, strlen(uri_path));


        // Payload-Marker an CoAP-Paket anh&amp;#228;ngen
        coap_packet_append_payload_marker(&amp;amp;request);

        // Payload an CoAP-Paket anh&amp;#228;ngen
        err=coap_packet_append_payload(&amp;amp;request, (uint8_t *)payload, sizeof(payload) - 1);
        if (err &amp;lt; 0) {
		printk(&amp;quot;Payload konnte nicht angeh&amp;#228;ngt werden, %d\n&amp;quot;, err);
		return err;
	}

	err = send(sock, request.data, request.offset, 0); // Daten werden an den Port 5683 gesendet
	if (err &amp;lt; 0) {
		printk(&amp;quot;Paket konnte nicht &amp;#252;bertragen werden,error %d\n&amp;quot;, errno);
		return -errno;
	}

        printk(&amp;quot;CoAP Anfrage gesendet: token 0x%04x\n&amp;quot;, token);
	printk(&amp;quot;Payload von %d bytes wird an die &amp;quot;, sizeof(payload));
         // CONFIG_SERVER_ADDRESS = californium.eclipseproject.io
         // CONFIG_SERVER_PORT = 5683
        printk(&amp;quot;IP Adresse %s, Port Nummer %d &amp;#252;bertragen\n&amp;quot;,
	       CONFIG_SERVER_ADDRESS,
	       CONFIG_SERVER_PORT);

        return 0;

}


// Ein Semaphore ist ein Kernel-Objekt, das ein traditionelles Z&amp;#228;hlsemaphor implementiert.
// Ein Semaphor wird verwendet, um den Zugriff auf eine Reihe von Ressourcen durch mehrere
// Threads zu steuern und um die Verarbeitung zwischen einem produzierenden und einem 
// verbrauchenden Thread oder Interrupt Service Routine (ISRs) zu synchronisieren.

static K_SEM_DEFINE(lte_verbunden, 0, 1); // Semaphore statisch definiert und initialisiert. 
                                          // lte_verbunden = Name des Semaphores. 0 = anf&amp;#228;ngliche Semaphorez&amp;#228;hlung 
                                          // 1 = maximal zul&amp;#228;ssige Semaphoranzahl.

static void lte_handler(const struct lte_lc_evt *const evt)
{
	switch (evt-&amp;gt;type) {
	case LTE_LC_EVT_NW_REG_STATUS: // emfangenes Ereignis mit Informationen zum Netwerkregistrierungsstatus
                                       // des Modems
		if ((evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &amp;amp;&amp;amp;
		     (evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
			break;
		}
                  
		printk(&amp;quot;Netwerkregistrierungsstatus: %s&amp;quot;,
			evt-&amp;gt;nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ?
			&amp;quot;verbunden mit Heimnetwerk\n&amp;quot; : &amp;quot;verbunden mit Roaming\n&amp;quot;);

		k_sem_give(&amp;amp;lte_verbunden); // Gib ein Semaphor an. Setzte die Z&amp;#228;hlung von lte_verbunden auf Null 
		break;                      // &amp;amp;lte_verbunden= Adresse des Semapores

	case LTE_LC_EVT_PSM_UPDATE: // empfangenes Ereignis mit Informationen zu PSM-Updates. Die Updates enthalten 
                                    //  PSM-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied psm_cfg vom Typ lte_lc_psm_cfg in dem Library lte.lc.h
                // tau = Periodisches Aktualisierungsintervall des Tracking-Bereichs.
                // active_time = Aktiv-Zeit (Zeit von RRC Leerlauf bis PSM)
		printk(&amp;quot;PSM-Parameter update: TAU: %d, Active time: %d\n&amp;quot;,
			evt-&amp;gt;psm_cfg.tau, evt-&amp;gt;psm_cfg.active_time);
		break;

	case LTE_LC_EVT_EDRX_UPDATE:{// empfangenes Ereignis mit Informationen zu eDRX-Updates. Die Updates enthalten 
                                    //  eDRX-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied edrx_cfg vom Typ lte_lc_edrx_cfg in dem Library lte.lc.h
                // edrx = eDRX-Intervallwert [s]
                // ptw = Paging-Zeitfenster [s]
		char log_buf[60];
		ssize_t len;

		len = snprintf(log_buf, sizeof(log_buf),
			       &amp;quot;eDRX parameter update: eDRX: %f, PTW: %f\n&amp;quot;,
			       evt-&amp;gt;edrx_cfg.edrx, evt-&amp;gt;edrx_cfg.ptw);
		if (len &amp;gt; 0) {
			printk(&amp;quot;%s\n&amp;quot;, log_buf);
		}
		break;
         }

	case LTE_LC_EVT_RRC_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber den 
                                    // Radio Ressource Control(RRC)-Status des Modems
                
                // Das zugeh&amp;#246;rige Payload ist das Mitglied rrc_mode vom Typ lte_lc_rrc_mode in dem Library lte.lc.h
                // RRC Modus ist entweder verbunden oder idle.
		printk(&amp;quot;RRC Modus: %s&amp;quot;,
			evt-&amp;gt;rrc_mode == LTE_LC_RRC_MODE_CONNECTED ?
			&amp;quot;verbunden\n&amp;quot; : &amp;quot;Idle\n&amp;quot;);
		break;

	case LTE_LC_EVT_CELL_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber die aktuell verbundene Zelle

                // Das zugeh&amp;#246;rige Payload ist das Mitglied Cell vom Typ lte_lc_cell in dem Library lte.lc.h
                // id = Mobilfunkzellenidentifikation
                // tac = Tracking area code
		printk(&amp;quot;LTE ver&amp;#228;nderte Zelle: Zelle ID: %d, Tracking area: %d\n&amp;quot;,
			evt-&amp;gt;cell.id, evt-&amp;gt;cell.tac);
		break;

	case LTE_LC_EVT_LTE_MODE_UPDATE: // Wenn ein Systemmodus konfiguiert ist,der entweder LTE-M oder NB-IoT
                                         // aktiviert, kann das Modem den aktuell aktiven LTE-Modus basierend auf
                                         // der Netwerkverf&amp;#252;gbarkeit &amp;#228;ndern. Dieses Ereignis zeigt dann an, welcher
                                         // LTE-Modus derzeit vom Modem verwendet wird.

		printk(&amp;quot;Active LTE Modus: %s&amp;quot;,
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NONE ? &amp;quot;None\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_LTEM ? &amp;quot;LTE-M\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NBIOT ? &amp;quot;NB-IoT\n&amp;quot; :
			&amp;quot;Unknown\n&amp;quot;);
		break;
	default:
		break;
	}
}

static void modem_konfigurieren(void)
{
#if defined(CONFIG_NRF_MODEM_LIB) // CONFIG_NRF_MODEM_LIB = verwende Nordic Modem Library
	if (IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT)) { 
                  // CONFIG_LTE_AUTO_INIT_AND_CONNECT = automatische Registrierung bei LTE-M oder NB-IoT
		  // passiert nichts, falls der Modem bereits konfiguriert und LTE verbunden ist.

	} else {

		int err; // integer f&amp;#252;r errors

#if defined(CONFIG_PSM_ENABLE) // CONFIG_PSM_ENABLE fordert PSM vom Modbilfunknetz an.

		/* Das Anfordern von PSM vor der Verbindung erm&amp;#246;glicht es dem Modem, das
		 * Netwerk bereits w&amp;#228;hrend des Verbindungsvorgangs &amp;#252;ber unseren Wunsch
		 * nach einer bestimmten PSM-Konfiguration zu informieren, anstatt in 
		 * einer separaten Anfrage nach der Verbindungsherstellung, die in einigen
		 * Netzwerken abgelehnt werden kann */
		
		err = lte_lc_psm_req(true); // Anfordern des Modems, das Power saving mode zu aktivieren
		if (err &amp;lt; 0) {
                         // Falls err= negativ =&amp;gt;  Fehler aufgetreten

			printk(&amp;quot;Power Saving Mode wurde nicht aktiviert, error: %d\n&amp;quot;,
				err);
		} else{
                      // falls err=0  =&amp;gt; das Anfordern war erfolgreich

                      printk(&amp;quot;PSM-Modus aktiviert\n\n&amp;quot;);
                }
#endif

#if defined(CONFIG_EDRX_ENABLE) // CONFIG_EDRX_ENABLE fordert eDRX vom Modbilfunknetz an.

	/** Extended Discontinuous Reception (eDRX) erm&amp;#246;glicht es das Sleep mode
            in RRC idle mode auf Minuten oder Stunden zu verl&amp;#228;ngern, was noch deutlichere
            Einsparungen beim Energieverbrauch bietet*/

	err = lte_lc_edrx_req(true); // eDRX wird aktiviert
	if (err&amp;lt;0) {
		printk(&amp;quot;eDRX wurde nicht aktiviert, error: %d\n&amp;quot;, err);
	}else {
		printk(&amp;quot;eDRX aktiviert\n&amp;quot;);
	}
#endif


                ui_led_set_pattern(UI_LTE_CONNECTING); // LED3 blinkt, um der Verbindungsherstellungsvorgang 
                                                      // zu signalisieren.
		printk(&amp;quot;Verbindung zum LTE-Netz wird hergestellt\n&amp;quot;);
		printk(&amp;quot;Das kann ein paar Minuten dauern..\n&amp;quot;);
		
                // lte_lc_init_and_connect_async initialisiert das LTE-Modul, 
                // konfiguriert das Modem und verbindet sich mit dem LTE-Netzwerk.
                // lte_lc_init_and_connect_async &amp;#252;berpr&amp;#252;ft zus&amp;#228;tzlich die LTE-Ereignisse
                // vom Typ LTE_LC_EVT_NW_REG_STATUS in lte_handler(), um festzustellen, wann
                // die LTE-Verbindung besteht.

		err = lte_lc_init_and_connect_async(lte_handler);
		if (err) {
                // err= negativ =&amp;gt; Fehler aufgetreten

			printk(&amp;quot;Modem konnte nicht konfiguriert werden, error: %d\n&amp;quot;,
				err);
			return;
		}
                // err=0 =&amp;gt; besteht LTE-Verbindung 

                printk(&amp;quot;Mit LTE-Netz verbunden\n&amp;quot;);
		ui_led_set_pattern(UI_LTE_CONNECTED); // LED3 leuchtet, um das Bestehen der Verbindung vorzugeben.
	}
#endif
}


/* Gibt 0 zur&amp;#252;ck, wenn Daten verf&amp;#252;gbar sind.
 * Gibt -EAGAIN zur&amp;#252;ck, wenn eine Zeit&amp;#252;berschreitung aufgetreten ist und keine Daten geschickt sind.
 * Gibt im Falle eines Poll-Fehlers einen anderen, negativen Fehlercode zur&amp;#252;ck.
 */
static int wait(int timeout)
{
	int ret = poll(&amp;amp;fds, 1, timeout);

	if (ret &amp;lt; 0) {
		printk(&amp;quot;poll error: %d\n&amp;quot;, errno);
		return -errno;
	}

	if (ret == 0) {
		/* Timeout. */
		return -EAGAIN;
	}

	if ((fds.revents &amp;amp; POLLERR) == POLLERR) {
		printk(&amp;quot;warte: POLLERR\n&amp;quot;);
		return -EIO;
	}

	if ((fds.revents &amp;amp; POLLNVAL) == POLLNVAL) {
		printk(&amp;quot;warte: POLLNVAL\n&amp;quot;);
		return -EBADF;
	}

	if ((fds.revents &amp;amp; POLLIN) != POLLIN) {
		return -EAGAIN;
	}

	return 0;
}

void main(void)
{

        int64_t next_msg_time = CONFIG_DATA_UPLOAD_FREQUENCY_MS;
	int err;

	printk(&amp;quot;Startet.....\n&amp;quot;);

        err = dtls_init();
          if (err&amp;lt;0) {
          printk(&amp;quot;DTLS Init Error: %d\n&amp;quot;, err);
        }

        // Initialisiere das Benutzeroberfl&amp;#228;chenmodul
        ui_init(ui_evt_handler);

        // Modem wird konfiguriert
#if defined(CONFIG_NRF_MODEM_LIB)

	modem_konfigurieren();

	k_sem_take(&amp;amp;lte_verbunden, K_FOREVER);
#endif

      next_msg_time = k_uptime_get();

        // Verbindungsaufbau des Clients zu dem Server
	err = server_initialisieren();
	if (err) {
		printk(&amp;quot;Serververbindung kann nicht initialisiert werden\n&amp;quot;);
		return;
	}
        
        // Verbindung zum Server herstellen
	err = server_verbinden();
	if (err) {
		printk(&amp;quot;Keine Verbindung zum Server m&amp;#246;glich\n&amp;quot;);
		return;
	}

while (1) {
		if (k_uptime_get() &amp;gt;= next_msg_time) {
			if (uebertragung_zu_server_fn() != 0) {
				printk(&amp;quot;Fehler beim Senden der Anfrage, exit...\n&amp;quot;);
				break;
			}

			next_msg_time += CONFIG_DATA_UPLOAD_FREQUENCY_MS;
		}

		int64_t remaining = next_msg_time - k_uptime_get();

		if (remaining &amp;lt; 0) {
			remaining = 0;
		}

		err = wait(remaining);
		if (err &amp;lt; 0) {
			if (err == -EAGAIN) {
				continue;
			}

			printk(&amp;quot;Poll error, exit...\n&amp;quot;);
			break;
		}

	}

}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Cedric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335352?ContentTypeID=1</link><pubDate>Thu, 21 Oct 2021 15:43:21 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8f9969b1-cc89-42bc-b9e5-73fc275fdd0b</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>[quote user="ced27"]Here is the trace as attachment, you can open it with wireshark and have a look at it and please help me find a solution for the issue.[/quote]
&lt;p lang="en-GB"&gt;Honestly, I’m not quite sure what issue you have. Can you elaborate?&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335278?ContentTypeID=1</link><pubDate>Thu, 21 Oct 2021 11:30:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:12f6e109-0c61-4297-9d8f-841a0320f699</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Hi Markus,&lt;/p&gt;
&lt;p&gt;thanks very much for your reply.&lt;/p&gt;
&lt;p&gt;I used&amp;nbsp;nRF Connect Trace Collector to capture the trace files of the modem, so i could see if the encrytion has done, but i had some issues with it.&lt;/p&gt;
&lt;p&gt;Here is the trace as attachment, you can open it with wireshark and have a look at it and please help me find a solution for the issue.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/trace_2D00_LTE_2D00_M_2D00_mit-Verschl_FC00_sselung.pcapng"&gt;devzone.nordicsemi.com/.../trace_2D00_LTE_2D00_M_2D00_mit-Verschl_FC00_sselung.pcapng&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Cedric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to add DTLS to nRF coap client</title><link>https://devzone.nordicsemi.com/thread/335016?ContentTypeID=1</link><pubDate>Wed, 20 Oct 2021 08:52:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:27baf899-abcd-4087-8b92-95e61682142e</guid><dc:creator>Albrecht Markus Schellenberger</dc:creator><description>&lt;p lang="en-GB"&gt;Hello Cedric,&lt;/p&gt;
&lt;p lang="en-GB"&gt;please be aware that &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.0/kconfig/CONFIG_NET_SOCKETS_ENABLE_DTLS.html#config-net-sockets-enable-dtls"&gt;DTLS&lt;/a&gt; only is experimental and not officially supported in NCS. Except from enabling the mentioned configuration parameter, you have to reconfigure the &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.0/zephyr/reference/networking/sockets.html?highlight=zsock#c.zsock_socket"&gt;socket&lt;/a&gt; using a DTLS &lt;a href="https://github.com/zephyrproject-rtos/zephyr/blob/zephyr-v2.6.0/include/net/net_ip.h#L75"&gt;protocol type&lt;/a&gt;.&lt;/p&gt;
&lt;p lang="en-GB"&gt;I recommend you to have a look at the &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.0/zephyr/samples/net/sockets/echo_client/README.html#socket-echo-client"&gt;Echo Client&lt;/a&gt; sample, which demonstrates the usage of the corresponding API.&lt;/p&gt;
&lt;p lang="en-GB"&gt;Regards,&lt;/p&gt;
&lt;p lang="en-GB"&gt;Markus&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>