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;
}