I have a simple Thread joiner program. I am trying to join to a thread network created by my OTBR. Attached is my program. This program resets on call to otJoinerStart().
Following is my prj.conf content:
CONFIG_DK_LIBRARY=y
CONFIG_GPIO=y
CONFIG_PRINTK=y
CONFIG_HEAP_MEM_POOL_SIZE=24000
CONFIG_ASSERT=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_OPENTHREAD_RADIO_WORKQUEUE_STACK_SIZE=2048
CONFIG_OPENTHREAD_THREAD_STACK_SIZE=8192
#CONFIG_SIEMENS_KNXIOT=y
# Enable C++
CONFIG_CPP=y
CONFIG_STD_CPP11=y
CONFIG_REQUIRES_FULL_LIBCPP=y
#CONFIG_CPP_EXCEPTIONS=n
# Enable printing of floating-points
#CONFIG_HAS_NEWLIB_LIBC_NANO=y
#CONFIG_NEWLIB_LIBC_NANO=y
CONFIG_NEWLIB_LIBC=y
CONFIG_PICOLIBC_USE_MODULE=n
CONFIG_FPU=n
# Enable OpenThread CoAP support API
CONFIG_OPENTHREAD_COAP=y
CONFIG_LOG=y
# Network shell
CONFIG_SHELL=n
# CONFIG_OPENTHREAD_SHELL=y
# CONFIG_SHELL_ARGC_MAX=26
# CONFIG_SHELL_CMD_BUFF_SIZE=416
# Network sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POLL_MAX=4
# Same network Master Key for client and server
CONFIG_OPENTHREAD_NETWORKKEY="00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
CONFIG_OPENTHREAD_JOINER=y
CONFIG_OPENTHREAD_JOINER_AUTOSTART=y
CONFIG_OPENTHREAD_JOINER_PSKD="CDCDCD"
CONFIG_OPENTHREAD_FTD=y
CONFIG_OPENTHREAD_DEBUG=y
CONFIG_OPENTHREAD_LOG_LEVEL_DEBG=y
# L2 OpenThread enabling
CONFIG_NET_L2_OPENTHREAD=y
# Generic networking options
CONFIG_NETWORKING=y
CONFIG_OPENTHREAD_DHCP6_CLIENT=y
CONFIG_CHIP=n
CONFIG_ENTROPY_GENERATOR=y
#CONFIG_TINYCBOR=n
# CONFIG_MBEDTLS=y
# CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y
# CONFIG_MBEDTLS_USER_CONFIG_FILE="D:/repo/knxiot/cmake/openthread_depricated/mbedtls-user-config.h"
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_DEBUG=y
# CONFIG_MBEDTLS_CFG_FILE="config-tls-generic.h"
CONFIG_MBEDTLS_CFG_FILE="nrf-config.h"
CONFIG_MBEDTLS_PSA_CRYPTO_CONFIG_FILE="nrf-psa-crypto-want-config.h"
#CONFIG_MBEDTLS_PSA_CRYPTO_CFG_FILE="nrf-psa-crypto-want-config.h"
CONFIG_MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE="nrf-psa-crypto-config.h"
CONFIG_MBEDTLS_DHM_C=y
CONFIG_MBEDTLS_MD_C=y
CONFIG_MBEDTLS_LEGACY_CRYPTO_C=y
CONFIG_MBEDTLS_CIPHER_C=y
CONFIG_MBEDTLS_DEBUG_C=y
#CONFIG_MBEDTLS_MEMORY_DEBUG=y
CONFIG_MBEDTLS_CIPHER_MODE_CBC=y
CONFIG_MBEDTLS_CIPHER_PADDING_PKCS7=y
CONFIG_MBEDTLS_PK_C=y
CONFIG_MBEDTLS_X509_CREATE_C=y
CONFIG_MBEDTLS_X509_CSR_WRITE_C=y
CONFIG_MBEDTLS_SHA256_C=y
CONFIG_MBEDTLS_ECP_C=y
CONFIG_MBEDTLS_ECDSA_C=y
CONFIG_MBEDTLS_ECDH_C=y
CONFIG_MBEDTLS_CTR_DRBG_C=y
CONFIG_MBEDTLS_ENTROPY_C=y
CONFIG_MBEDTLS_PKCS5_C=y
CONFIG_MBEDTLS_SHA1_C=y
CONFIG_MBEDTLS_PK_WRITE_C=y
CONFIG_CBPRINTF_LIBC_SUBSTS=y
#CONFIG_MBEDTLS_ERROR_C=y
CONFIG_MBEDTLS_HKDF_C=y
#include <zephyr/drivers/gpio.h> #include <zephyr/kernel.h> #include <dk_buttons_and_leds.h> #include <openthread/thread.h> #include <zephyr/logging/log.h> #include <zephyr/net/openthread.h> LOG_MODULE_REGISTER(ot_sample); // Define the channel you want to use #define THREAD_CHANNEL 15 // Replace with your desired channel (11 to 26) // Thread state change callback static void state_changed_callback(uint32_t flags, void *context) { if (flags & OT_CHANGED_THREAD_ROLE) { otDeviceRole role = otThreadGetDeviceRole((otInstance *)context); if (role == OT_DEVICE_ROLE_CHILD || role == OT_DEVICE_ROLE_ROUTER || role == OT_DEVICE_ROLE_LEADER) { dk_set_led_on( DK_LED1); // Turn on LED1 when connected to Thread network } else { dk_set_led_off(DK_LED1); // Turn off LED1 when not connected } } } void joinerCb(otError aError, void *aContext) {} int main(void) { int ret; // Initialize LEDs ret = dk_leds_init(); if (ret) { printk("Failed to initialize LEDs, error %d\n", ret); return 1; } // Initialize OpenThread struct otInstance *ot_instance = openthread_get_default_instance(); if (ot_instance == NULL) { printk("Failed to get OpenThread instance\n"); return 1; } // Set OpenThread channel otError error = otLinkSetChannel(ot_instance, THREAD_CHANNEL); if (error != OT_ERROR_NONE) { printk("Failed to set Thread channel, error: %d\n", error); return 1; } // Register the state change callback otSetStateChangedCallback(ot_instance, state_changed_callback, ot_instance); error = otIp6SetEnabled(ot_instance, true); if (error != OT_ERROR_NONE) { printk("Failed to start Thread iface, error: %d\n", error); return 1; } // Start the Thread network error = otThreadSetEnabled(ot_instance, true); if (error != OT_ERROR_NONE) { printk("Failed to start Thread network, error: %d\n", error); return 1; } // Start the Joiner process const char *joiner_psk = "CDCDCD"; // Replace with your joiner PSK error = otJoinerStart(ot_instance, joiner_psk, NULL, NULL, NULL, NULL, NULL, &joinerCb, ot_instance); if (error != OT_ERROR_NONE) { printk("Failed to start joiner, error: %d\n", error); return 1; } // Main loop while (1) { k_sleep(K_MSEC( 100)); // Let Zephyr handle the event loop and OpenThread processing } return 0; }