diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino new file mode 100644 index 00000000000..249ba2a3fe0 --- /dev/null +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ExtendedRouterNode.ino @@ -0,0 +1,65 @@ +#include "OThreadCLI.h" +#include "OThreadCLI_Util.h" + +// Leader node shall use the same Network Key and channel +#define CLI_NETWORK_KEY "00112233445566778899aabbccddeeff" +#define CLI_NETWORK_CHANEL "24" +bool otStatus = true; + +void setup() { + Serial.begin(115200); + OThreadCLI.begin(false); // No AutoStart - fresh start + Serial.println("Setting up OpenThread Node as Router/Child"); + Serial.println("Make sure the Leader Node is already running"); + + otStatus &= otExecCommand("dataset", "clear"); + otStatus &= otExecCommand("dataset networkkey", CLI_NETWORK_KEY); + otStatus &= otExecCommand("dataset channel", CLI_NETWORK_CHANEL); + otStatus &= otExecCommand("dataset", "commit active"); + otStatus &= otExecCommand("ifconfig", "up"); + otStatus &= otExecCommand("thread", "start"); + + if (!otStatus) { + Serial.println("\r\n\t===> Failed starting Thread Network!"); + return; + } + // wait for the node to enter in the router state + uint32_t timeout = millis() + 90000; // waits 90 seconds to + while (otGetDeviceRole() != OT_ROLE_CHILD && otGetDeviceRole() != OT_ROLE_ROUTER) { + Serial.print("."); + if (millis() > timeout) { + Serial.println("\r\n\t===> Timeout! Failed."); + otStatus = false; + break; + } + delay(500); + } + + if (otStatus) { + // print the PanID using 2 methods + + // CLI + char resp[256]; + if (otGetRespCmd("panid", resp)) { + Serial.printf("\r\nPanID[using CLI]: %s\r\n", resp); + } else { + Serial.printf("\r\nPanID[using CLI]: FAILED!\r\n"); + } + + // OpenThread API + Serial.printf("PanID[using OT API]: 0x%x\r\n", (uint16_t)otLinkGetPanId(esp_openthread_get_instance())); + } + Serial.println("\r\n"); +} + +void loop() { + if (otStatus) { + Serial.println("Thread NetworkInformation: "); + Serial.println("---------------------------"); + otPrintNetworkInformation(Serial); + Serial.println("---------------------------"); + } else { + Serial.println("Some OpenThread operation has failed..."); + } + delay(10000); +} diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ci.json b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ci.json new file mode 100644 index 00000000000..10def841de0 --- /dev/null +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRouterNode/ci.json @@ -0,0 +1,9 @@ +{ + "targets": { + "esp32": false, + "esp32c2": false, + "esp32c3": false, + "esp32s2": false, + "esp32s3": false + } + } diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino index 6439c5ec4bd..e2342426a7a 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/LeaderNode/LeaderNode.ino @@ -1,15 +1,15 @@ /* - * OpenThread.begin(false) will not automatically start a node in a Thread Network - * A Leader node is the first device, that has a complete dataset, to start Thread - * A complete dataset is easily achieved by using the OpenThread CLI command "dataset init new" - * - * In order to allow other node to join the network, - * all of them shall use the same network master key - * The network master key is a 16-byte key that is used to secure the network - * - * Using the same channel will make the process faster - * - */ + OpenThread.begin(false) will not automatically start a node in a Thread Network + A Leader node is the first device, that has a complete dataset, to start Thread + A complete dataset is easily achieved by using the OpenThread CLI command "dataset init new" + + In order to allow other node to join the network, + all of them shall use the same network master key + The network master key is a 16-byte key that is used to secure the network + + Using the same channel will make the process faster + +*/ #include "OThreadCLI.h" #include "OThreadCLI_Util.h" @@ -17,10 +17,14 @@ #define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff" #define CLI_NETWORK_CHANEL "dataset channel 24" +otInstance *aInstance = NULL; + void setup() { Serial.begin(115200); OThreadCLI.begin(false); // No AutoStart - fresh start + Serial.println(); Serial.println("Setting up OpenThread Node as Leader"); + aInstance = esp_openthread_get_instance(); OThreadCLI.println("dataset init new"); OThreadCLI.println(CLI_NETWORK_KEY); @@ -31,7 +35,53 @@ void setup() { } void loop() { + Serial.println("============================================="); Serial.print("Thread Node State: "); Serial.println(otGetStringDeviceRole()); + + // Native OpenThread API calls: + // wait until the node become Child or Router + if (otGetDeviceRole() == OT_ROLE_LEADER) { + // Network Name + const char *networkName = otThreadGetNetworkName(aInstance); + Serial.printf("Network Name: %s\r\n", networkName); + // Channel + uint8_t channel = otLinkGetChannel(aInstance); + Serial.printf("Channel: %d\r\n", channel); + // PAN ID + uint16_t panId = otLinkGetPanId(aInstance); + Serial.printf("PanID: 0x%04x\r\n", panId); + // Extended PAN ID + const otExtendedPanId *extPanId = otThreadGetExtendedPanId(aInstance); + Serial.printf("Extended PAN ID: "); + for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) { + Serial.printf("%02x", extPanId->m8[i]); + } + Serial.println(); + // Network Key + otNetworkKey networkKey; + otThreadGetNetworkKey(aInstance, &networkKey); + Serial.printf("Network Key: "); + for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) { + Serial.printf("%02x", networkKey.m8[i]); + } + Serial.println(); + // IP Addresses + char buf[OT_IP6_ADDRESS_STRING_SIZE]; + const otNetifAddress *address = otIp6GetUnicastAddresses(aInstance); + while (address != NULL) { + otIp6AddressToString(&address->mAddress, buf, sizeof(buf)); + Serial.printf("IP Address: %s\r\n", buf); + address = address->mNext; + } + // Multicast IP Addresses + const otNetifMulticastAddress *mAddress = otIp6GetMulticastAddresses(aInstance); + while (mAddress != NULL) { + otIp6AddressToString(&mAddress->mAddress, buf, sizeof(buf)); + printf("Multicast IP Address: %s\n", buf); + mAddress = mAddress->mNext; + } + } + delay(5000); } diff --git a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino b/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino index 8b393893386..8ec01344d7a 100644 --- a/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino +++ b/libraries/OpenThread/examples/SimpleThreadNetwork/RouterNode/RouterNode.ino @@ -1,14 +1,14 @@ /* - * OpenThread.begin(false) will not automatically start a node in a Thread Network - * A Router/Child node is the device that will join an existing Thread Network - * - * In order to allow this node to join the network, - * it shall use the same network master key as used by the Leader Node - * The network master key is a 16-byte key that is used to secure the network - * - * Using the same channel will make the process faster - * - */ + OpenThread.begin(false) will not automatically start a node in a Thread Network + A Router/Child node is the device that will join an existing Thread Network + + In order to allow this node to join the network, + it shall use the same network master key as used by the Leader Node + The network master key is a 16-byte key that is used to secure the network + + Using the same channel will make the process faster + +*/ #include "OThreadCLI.h" #include "OThreadCLI_Util.h" @@ -16,11 +16,15 @@ #define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff" #define CLI_NETWORK_CHANEL "dataset channel 24" +otInstance *aInstance = NULL; + void setup() { Serial.begin(115200); OThreadCLI.begin(false); // No AutoStart - fresh start + Serial.println(); Serial.println("Setting up OpenThread Node as Router/Child"); Serial.println("Make sure the Leader Node is already running"); + aInstance = esp_openthread_get_instance(); OThreadCLI.println("dataset clear"); OThreadCLI.println(CLI_NETWORK_KEY); @@ -31,7 +35,53 @@ void setup() { } void loop() { + Serial.println("============================================="); Serial.print("Thread Node State: "); Serial.println(otGetStringDeviceRole()); + + // Native OpenThread API calls: + // wait until the node become Child or Router + if (otGetDeviceRole() == OT_ROLE_CHILD || otGetDeviceRole() == OT_ROLE_ROUTER) { + // Network Name + const char *networkName = otThreadGetNetworkName(aInstance); + Serial.printf("Network Name: %s\r\n", networkName); + // Channel + uint8_t channel = otLinkGetChannel(aInstance); + Serial.printf("Channel: %d\r\n", channel); + // PAN ID + uint16_t panId = otLinkGetPanId(aInstance); + Serial.printf("PanID: 0x%04x\r\n", panId); + // Extended PAN ID + const otExtendedPanId *extPanId = otThreadGetExtendedPanId(aInstance); + Serial.printf("Extended PAN ID: "); + for (int i = 0; i < OT_EXT_PAN_ID_SIZE; i++) { + Serial.printf("%02x", extPanId->m8[i]); + } + Serial.println(); + // Network Key + otNetworkKey networkKey; + otThreadGetNetworkKey(aInstance, &networkKey); + Serial.printf("Network Key: "); + for (int i = 0; i < OT_NETWORK_KEY_SIZE; i++) { + Serial.printf("%02x", networkKey.m8[i]); + } + Serial.println(); + // IP Addresses + char buf[OT_IP6_ADDRESS_STRING_SIZE]; + const otNetifAddress *address = otIp6GetUnicastAddresses(aInstance); + while (address != NULL) { + otIp6AddressToString(&address->mAddress, buf, sizeof(buf)); + Serial.printf("IP Address: %s\r\n", buf); + address = address->mNext; + } + // Multicast IP Addresses + const otNetifMulticastAddress *mAddress = otIp6GetMulticastAddresses(aInstance); + while (mAddress != NULL) { + otIp6AddressToString(&mAddress->mAddress, buf, sizeof(buf)); + printf("Multicast IP Address: %s\n", buf); + mAddress = mAddress->mNext; + } + } + delay(5000); } diff --git a/libraries/OpenThread/keywords.txt b/libraries/OpenThread/keywords.txt index b7135522d05..d7193de188d 100644 --- a/libraries/OpenThread/keywords.txt +++ b/libraries/OpenThread/keywords.txt @@ -31,10 +31,10 @@ peek KEYWORD2 flush KEYWORD2 otGetDeviceRole KEYWORD2 otGetStringDeviceRole KEYWORD2 -otGetRespCmd KEYWORD2 +otGetRespCmd KEYWORD2 otExecCommand KEYWORD2 -otPrintRespCLI KEYWORD2 -otPrintNetworkInformation KEYWORD2 +otPrintRespCLI KEYWORD2 +otPrintNetworkInformation KEYWORD2 ####################################### # Constants (LITERAL1)