|
1 |
| -# Network Configurator |
| 1 | +# Network Configurator |
| 2 | + |
| 3 | +[](https://github.com/arduino-libraries/Arduino_NetworkConfigurator/actions/workflows/check-arduino.yml) |
| 4 | +[](https://github.com/arduino-libraries/Arduino_NetworkConfigurator/actions?workflow=Compile+Examples) |
| 5 | +[](https://github.com/arduino-libraries/Arduino_NetworkConfigurator/actions?workflow=Spell+Check) |
| 6 | +[](https://github.com/arduino-libraries/Arduino_NetworkConfigurator/actions?workflow=Unit+Tests) |
| 7 | + |
| 8 | +This library enables the *remote* configuration of an [`Arduino_ConnectionHandler`](https://github.com/arduino-libraries/Arduino_ConnectionHandler) instance through the board's physical interfaces like "Bluetooth Low Energy (BLE)", Serial, etc.. |
| 9 | +The provided network configuration is stored on persistent storage and loaded at the start up. |
| 10 | + |
| 11 | +The library offers mechanisms for wiping out the saved network configuration on the persistent storage. |
| 12 | + |
| 13 | +## Supported boards and configurable connectivity types matrix |
| 14 | +|Boards | WiFi | Ethernet | GSM | NB-IoT | CAT-M1 | Cellular | LoRa | |
| 15 | +|-------|:----:|:--------:|:---:|:------:|:------:|:--------:|:----:| |
| 16 | +|[`UNO R4 WiFi`](https://store.arduino.cc/products/uno-r4-wifi) | X | | | | | | | |
| 17 | +|[`OPTA WiFi`](https://store.arduino.cc/products/opta-wifi) | X | X | | | | | | |
| 18 | +|[`Portenta H7`](https://store.arduino.cc/portenta-h7) | X | X | | | X | X | | |
| 19 | +|[`GIGA R1 WiFi`](https://store.arduino.cc/products/giga-r1-wifi)| X | | | | | | | |
| 20 | +|[`Nicla Vision`](https://store.arduino.cc/products/nicla-vision)| X | | | | | | | |
| 21 | +|[`Portenta C33`](https://store.arduino.cc/products/portenta-c33)| X | X | | | | | | |
| 22 | +|[`Nano RP2040 Connect`](https://store.arduino.cc/products/arduino-nano-rp2040-connect)| X | | | | | | | |
| 23 | +|[`Nano 33 IoT`](https://store.arduino.cc/arduino-nano-33-iot) | X | | | | | | | |
| 24 | +|[`MKR WiFi 1010`](https://store.arduino.cc/arduino-mkr-wifi-1010)| X | | | | | | | |
| 25 | + |
| 26 | +## How to clean up the stored configuration |
| 27 | + |
| 28 | +The `NetworkConfigurator` library provides a way for wiping out the stored network settings and forcing |
| 29 | +the restart of the BLE interface if turned off. |
| 30 | + |
| 31 | +The procedure: |
| 32 | + |
| 33 | +* `Arduino Opta`: press and hold the user button (`BTN_USER`) until the led (`LED_USER`) turns off |
| 34 | +* `Arduino MKR WiFi 1010`: short the pin 7 to GND until the led turns off |
| 35 | +* `Arduino GIGA R1 WiFi`: short the pin 7 to GND until the led turns off |
| 36 | +* `Arduino Nano RP2040 Connect`: short the pin 2 to 3.3V until the led turns off |
| 37 | +* Other boards: short the pin 2 to GND until the led turns off |
| 38 | + |
| 39 | +## Configurator Agents |
| 40 | +The library provides a set of *Configurator Agents* that added as plug-in to the sketch handle the communication between the Arduino Network Configurator and an external client ([*Arduino IoT App*](https://cloud.arduino.cc/iot-remote-app/) and Arduino IoT Cloud) for configuring the board. |
| 41 | + |
| 42 | +Out-of-the box there are 2 Configurator Agents |
| 43 | +* `BLEAgent`: manage the BLE interface |
| 44 | +* `SerialAgent`: manage the Serial interface |
| 45 | + |
| 46 | +### Configurator Agents and supported board matrix |
| 47 | +|Boards | BLEAgent | SerialAgent | |
| 48 | +|-------|:----:|:--------:| |
| 49 | +|[`UNO R4 WiFi`](https://store.arduino.cc/products/uno-r4-wifi) | X | X | |
| 50 | +|[`OPTA WiFi`](https://store.arduino.cc/products/opta-wifi) | X | X | |
| 51 | +|[`Portenta H7`](https://store.arduino.cc/portenta-h7) | X | X | |
| 52 | +|[`GIGA R1 WiFi`](https://store.arduino.cc/products/giga-r1-wifi)| X | X | |
| 53 | +|[`Nicla Vision`](https://store.arduino.cc/products/nicla-vision)| X | X | |
| 54 | +|[`Portenta C33`](https://store.arduino.cc/products/portenta-c33)| X | X | |
| 55 | +|[`Nano RP2040 Connect`](https://store.arduino.cc/products/arduino-nano-rp2040-connect)| X | X | |
| 56 | +|[`Nano 33 IoT`](https://store.arduino.cc/arduino-nano-33-iot) | X | X | |
| 57 | +|[`MKR WiFi 1010`](https://store.arduino.cc/arduino-mkr-wifi-1010)| X | X | |
| 58 | + |
| 59 | +### How to enable a Configurator Agent |
| 60 | +1. Include the *Configurator Agent* header file in the sketch ex.: `#include <configuratorAgents/agents/BLEAgent.h>` |
| 61 | +2. Declare a global variable of the *agent* in the sketch ex.: `BLEAgentClass BLEAgent;` |
| 62 | +3. Register the *agent* to the `NetworkConfigurator` ex.:`NetworkConfigurator.addAgent(BLEAgent);` |
| 63 | + |
| 64 | +## Storage |
| 65 | + |
| 66 | +The `NetworkConfigurator` needs a *persistent storage* for saving the provided network configuration. |
| 67 | + |
| 68 | +The user must specify a *storage library* in the sketch and pass it to the `NetworkConfigurator` as parameter. |
| 69 | + |
| 70 | +The user can use the [`Arduino_KVStore`](https://github.com/arduino-libraries/Arduino_KVStore) library as storage, otherwise he can implement his own custom storage library. |
| 71 | + |
| 72 | +The custom storage library must be based on a Key-Value storage system and must implement the interface `KVStoreInterface` of the [`Arduino_KVStore`](https://github.com/arduino-libraries/Arduino_KVStore) library |
| 73 | + |
| 74 | +### How to set the storage library |
| 75 | +1. Include the header file of the *storage library* ex.: `#include <Arduino_KVStore.h>` |
| 76 | +2. Declare the instance of the *storage manager* ex.: `KVStore kvstore;` |
| 77 | +3. Register the storage manager instance to the `NetworkConfigurator` ex.: `NetworkConfigurator.setStorage(kvstore);` |
| 78 | + |
| 79 | +## How-to-use |
| 80 | +1. Choose and include a *storage library* like [`Arduino_KVStore`](https://github.com/arduino-libraries/Arduino_KVStore) |
| 81 | +2. Choose and include the *Configurator Agents* |
| 82 | +3. Register the *storage library* and the *Configurator Agents* to the `NetworkConfigurator` |
| 83 | + |
| 84 | +``` |
| 85 | +#include <GenericConnectionHandler.h> |
| 86 | +#include <Arduino_KVStore.h> |
| 87 | +#include <Arduino_NetworkConfigurator.h> |
| 88 | +#include <configuratorAgents/agents/BLEAgent.h> |
| 89 | +#include <configuratorAgents/agents/SerialAgent.h> |
| 90 | +
|
| 91 | +KVStore kvstore; |
| 92 | +BLEAgentClass BLEAgent; |
| 93 | +SerialAgentClass SerialAgent; |
| 94 | +GenericConnectionHandler conMan; |
| 95 | +NetworkConfiguratorClass NetworkConfigurator(conMan); |
| 96 | +
|
| 97 | +void setup() { |
| 98 | + /* Initialize serial debug port and wait up to 5 seconds for port to open */ |
| 99 | + Serial.begin(9600); |
| 100 | + for(unsigned long const serialBeginTime = millis(); !Serial && (millis() - serialBeginTime <= 5000); ) { } |
| 101 | +
|
| 102 | + /* Add callbacks to the ConnectionHandler object to get notified of network |
| 103 | + * connection events. */ |
| 104 | + conMan.addCallback(NetworkConnectionEvent::CONNECTED, onNetworkConnect); |
| 105 | + conMan.addCallback(NetworkConnectionEvent::DISCONNECTED, onNetworkDisconnect); |
| 106 | + conMan.addCallback(NetworkConnectionEvent::ERROR, onNetworkError); |
| 107 | +
|
| 108 | + /* Set the KVStore */ |
| 109 | + NetworkConfigurator.setStorage(kvstore); |
| 110 | + /* Add the interfaces that are enabled for configuring the network*/ |
| 111 | + NetworkConfigurator.addAgent(BLEAgent); |
| 112 | + NetworkConfigurator.addAgent(SerialAgent); |
| 113 | +
|
| 114 | + /* Start the network configurator */ |
| 115 | + NetworkConfigurator.begin(); |
| 116 | +
|
| 117 | +} |
| 118 | +
|
| 119 | +void loop() { |
| 120 | + /* |
| 121 | + * Poll the networkConfigurator and check if connectionHandler is configured. |
| 122 | + * If the ConnectionHandler has been configured, the following code keeps on |
| 123 | + * running connection workflows on our allowing reconnection in case of failure |
| 124 | + * and notification of connect/disconnect event if enabled. |
| 125 | + * |
| 126 | + * NOTE: any use of delay() within the loop or methods called from it will delay |
| 127 | + * the execution of .update() and .check() methods of the NetworkConfigurator and |
| 128 | + * ConnectionHandler objects which might not guarantee the correct functioning |
| 129 | + * of the code. |
| 130 | + */ |
| 131 | + if(NetworkConfigurator.update() == NetworkConfiguratorStates::CONFIGURED) { |
| 132 | + conMan.check(); |
| 133 | + } |
| 134 | +} |
| 135 | +
|
| 136 | +void onNetworkConnect() { |
| 137 | + Serial.println(">>>> CONNECTED to network"); |
| 138 | +} |
| 139 | +
|
| 140 | +void onNetworkDisconnect() { |
| 141 | + Serial.println(">>>> DISCONNECTED from network"); |
| 142 | +} |
| 143 | +
|
| 144 | +void onNetworkError() { |
| 145 | + Serial.println(">>>> ERROR"); |
| 146 | +} |
| 147 | +``` |
| 148 | + |
| 149 | +View the full example in the `example` folder. |
0 commit comments