OpenThread Example Improvement (#10299)

* feat(openthread): add extended example

Creates a new example that mixes different APIs

* feat(openthread): create cj.json file

Adds neessary CI file

* feat(openthread): improve the example

Update ExtendedRoterNode.ino with more use of API

* feat(openthread): improve the example

Adds OpenThread Native calls to the example

* feat(openthread): improve the example 

Update LeaderNode.ino example to add OpenThread Native calls.

* fix(openthread): bad formatting using space

Update keywords.txt to use TAB instead of SPACE in order to recognize correctly the keywords.

* fix(openthread): bad example file name - typo

Changed ExtendedRoterNode to ExtendedRouterNode - Typo error.

* feat(openthread): add extended example ci.json file

Added CI file to the example.

* fix(openthread): deleted bad file names in the example

Delete libraries/OpenThread/examples/SimpleThreadNetwork/ExtendedRoterNode directory

* fix(openthread): typo in commentaries

* fix(openthread): typo in commentaries

* ci(pre-commit): Apply automatic fixes

---------

Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
This commit is contained in:
Rodrigo Garcia 2024-09-09 10:19:14 -03:00 committed by GitHub
parent 532d5f2fad
commit cbe0f2ff0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 198 additions and 24 deletions

View file

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

View file

@ -0,0 +1,9 @@
{
"targets": {
"esp32": false,
"esp32c2": false,
"esp32c3": false,
"esp32s2": false,
"esp32s3": false
}
}

View file

@ -1,15 +1,15 @@
/* /*
* OpenThread.begin(false) will not automatically start a node in a Thread Network 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 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" 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, In order to allow other node to join the network,
* all of them shall use the same network master key 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 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 Using the same channel will make the process faster
*
*/ */
#include "OThreadCLI.h" #include "OThreadCLI.h"
#include "OThreadCLI_Util.h" #include "OThreadCLI_Util.h"
@ -17,10 +17,14 @@
#define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff" #define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff"
#define CLI_NETWORK_CHANEL "dataset channel 24" #define CLI_NETWORK_CHANEL "dataset channel 24"
otInstance *aInstance = NULL;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
OThreadCLI.begin(false); // No AutoStart - fresh start OThreadCLI.begin(false); // No AutoStart - fresh start
Serial.println();
Serial.println("Setting up OpenThread Node as Leader"); Serial.println("Setting up OpenThread Node as Leader");
aInstance = esp_openthread_get_instance();
OThreadCLI.println("dataset init new"); OThreadCLI.println("dataset init new");
OThreadCLI.println(CLI_NETWORK_KEY); OThreadCLI.println(CLI_NETWORK_KEY);
@ -31,7 +35,53 @@ void setup() {
} }
void loop() { void loop() {
Serial.println("=============================================");
Serial.print("Thread Node State: "); Serial.print("Thread Node State: ");
Serial.println(otGetStringDeviceRole()); 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); delay(5000);
} }

View file

@ -1,14 +1,14 @@
/* /*
* OpenThread.begin(false) will not automatically start a node in a Thread Network 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 A Router/Child node is the device that will join an existing Thread Network
*
* In order to allow this node to join the 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 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 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 Using the same channel will make the process faster
*
*/ */
#include "OThreadCLI.h" #include "OThreadCLI.h"
#include "OThreadCLI_Util.h" #include "OThreadCLI_Util.h"
@ -16,11 +16,15 @@
#define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff" #define CLI_NETWORK_KEY "dataset networkkey 00112233445566778899aabbccddeeff"
#define CLI_NETWORK_CHANEL "dataset channel 24" #define CLI_NETWORK_CHANEL "dataset channel 24"
otInstance *aInstance = NULL;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
OThreadCLI.begin(false); // No AutoStart - fresh start OThreadCLI.begin(false); // No AutoStart - fresh start
Serial.println();
Serial.println("Setting up OpenThread Node as Router/Child"); Serial.println("Setting up OpenThread Node as Router/Child");
Serial.println("Make sure the Leader Node is already running"); Serial.println("Make sure the Leader Node is already running");
aInstance = esp_openthread_get_instance();
OThreadCLI.println("dataset clear"); OThreadCLI.println("dataset clear");
OThreadCLI.println(CLI_NETWORK_KEY); OThreadCLI.println(CLI_NETWORK_KEY);
@ -31,7 +35,53 @@ void setup() {
} }
void loop() { void loop() {
Serial.println("=============================================");
Serial.print("Thread Node State: "); Serial.print("Thread Node State: ");
Serial.println(otGetStringDeviceRole()); 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); delay(5000);
} }

View file

@ -31,10 +31,10 @@ peek KEYWORD2
flush KEYWORD2 flush KEYWORD2
otGetDeviceRole KEYWORD2 otGetDeviceRole KEYWORD2
otGetStringDeviceRole KEYWORD2 otGetStringDeviceRole KEYWORD2
otGetRespCmd KEYWORD2 otGetRespCmd KEYWORD2
otExecCommand KEYWORD2 otExecCommand KEYWORD2
otPrintRespCLI KEYWORD2 otPrintRespCLI KEYWORD2
otPrintNetworkInformation KEYWORD2 otPrintNetworkInformation KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)