If you are connected over SSH the following commands might affect your connection.
Welcome to part two of our AI Powered Christmas Tree Series! The goal of this series is to serve as a guide for you to build your own AI powered Machine Learning Christmas Tree, thanks to the Arduino Portenta X8 SoM and Edge Impulse AI Platform.
In this tutorial, we will be discussing how to configure the network for your embedded device. But before jumping into this entry, if you haven’t already, be sure to check out part one: Your First FoundriesFactory AI-Powered Christmas Tree.
Reasons to be Concerned About How Our Network is Configured
Throughout the development process, network configuration is but one of the many variables you may wish to exercise more exact control over, in order to better understand your evaluation board capabilities. By default, the Linux microPlatform™ (LmP) is configured to get an IP from the DHCP server automatically, but there are many reasons you may wish to customize this behavior:
- Communication with External Devices:
Many embedded systems interact with external devices or systems over a network. Proper network configuration ensures seamless communication between the embedded system and these external components. - Data Transfer and Protocol Handling:
Embedded systems often need to transfer data over a network. Configuring the network settings allows you to optimize data transfer rates, choose appropriate communication protocols, and handle data in a way that suits the requirements of your application. - Security:
Network security is a critical aspect of embedded systems development. Configuring the network allows you to implement security measures such as encryption, authentication, and access control to protect your embedded system from unauthorized access or data breaches.
The network configurations we will be detailing in this tutorial are relatively simple, but understanding these principles will allow you to make more robust configurations in your future projects.
Prerequisites for Machine Learning Christmas Tree
This is the second entry in our AI Powered Christmas Tree Series. You should follow along with Your First FoundriesFactory AI-Powered Christmas Tree before continuing, as Part 1 covers:
- Signing Up to create your Factory
- Flashing Your Device
- Registering Your Device
- Installing Fioctl™
- Deploying Container Application
NetworkManager Command Line Interface (nmcli)
The LmP uses the nmcli (NetworkManager Command Line Interface) utility to configure its network. NetworkManager is a widely used network management service on Linux systems that simplifies the management of network connections, including wired, wireless, mobile broadband, and VPN connections.
Connect to the Board
If you are following along in the series, your device should already be flashed with an LmP Target, and ready for you to login. With the Arduino Portenta X8, it is easiest to connect to the board via SSH. If you are using any of our other supported boards, there are instructions available in our docs to help you with connecting to a board.
Checking status
After successfully logging in, run the following command to get information about the interfaces recognized by NetworkManager:
device:~$ nmcli device status
DEVICE TYPE STATE CONNECTION
eth0 ethernet disconnected --
wlan0 wifi disconnected --
docker0 bridge unmanaged --
sit0 iptunnel unmanaged --
lo loopback unmanaged --
This command provides a summary of available network interfaces, their states, and associated connections. A device can have multiple connections, but only one connection can be attached to each interface.
To see all connections created, run the command:
device:~$ nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 ea98ae92-f210-3011-9f00-ff357473fd6f ethernet --
This will display information about each configured network connection, including its name and type, e.g. Ethernet in the above example.
nmcli has numerous commands, parameters, and options which you can explore. The nmcli man page can give you more details about its capabilities and the various ways you can manage your network.
Changing Network Configuration
Let’s see some practical examples of how to create a new connection and change it to a fixed IP.
First, create a new Ethernet connection:
device:~$ nmcli con add type ethernet con-name my-connection
If we list our connections again, you should see the new connection in the list:
device:~$ nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 40643d8d-18ac-387d-9c27-cbd4f15dd8da ethernet eth0
my-connection a2e187ce-8c6e-4b4e-a9fe-622b071757bf ethernet --
Start your connection with the command:
device:~$ nmcli con up my-connection
Note that now your connection is now active on eth0, while the previous connection is no longer active and does not have an associated device:
device:~$ nmcli connection show
NAME UUID TYPE DEVICE
my-connection a2e187ce-8c6e-4b4e-a9fe-622b071757bf ethernet eth0
Wired connection 1 40643d8d-18ac-387d-9c27-cbd4f15dd8da ethernet --
Configuring for Static Connection
From this point, we can now easily manipulate this connection. To change your connection to a static address, run the command:
device:~$ nmcli con mod my-connection ipv4.addresses "192.168.15.30"
After running this command, the my-connection
profile will be updated to include the specified IPv4 address. You can further configure this connection with additional parameters and settings as needed using the nmcli con mod
commands. Don't forget to check out the nmcli man page for examples of what settings you can configure.
At this time, the changes are associated to the connection profile; but they are not active on our running connection. To apply your changes, run:
device:~$ nmcli device reapply eth0
If we do not run this command here, our changes won’t take effect until we disconnect and reconnect the device from the network.
Configuring for Connection to Dynamic Host Configuration Protocol (DHCP)
The steps to enable automatic DHCP addressing are very similar to those above for static addressing. We are still using the nmcli con mod
command but with the following parameters:
device:~$ nmcli con mod my-connection ipv4.method auto ipv4.addresses ""
ipv4.method auto
: This part of the command sets the IPv4 addressing method to "auto." In this mode, the network connection will automatically obtain its IPv4 configurationipv4.addresses ""
: This clears any previously defined IPv4 addresses for the connection. The double quotes with an empty string effectively remove any statically assigned IPv4 address.
Again, these changes currently are only updates to the connection profile. To apply them to our active connection we need to run:
device:~$ nmcli device reapply eth0
Connection Details
There are many other parameters that can be configured using nmcli
. You can view a list of many of these parameters for any connection profile using the below command:
device:~$ nmcli -p con show my-connection
This command is useful for inspecting and verifying the settings and configuration of any connection profile. The output will look like this:
===============================================================================
Connection profile details (my-configuration)
===============================================================================
connection.id: my-configuration
connection.uuid: a2e187ce-8c6e-4b4e-a9fe-622b071757bf
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: --
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)
connection.auth-retries: -1
connection.timestamp: 1693951625
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: unknown
connection.lldp: default
connection.mdns: -1 (default)
connection.llmnr: -1 (default)
connection.dns-over-tls: -1 (default)
connection.wait-device-timeout: -1
-------------------------------------------------------------------------------
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: --
802-3-ethernet.cloned-mac-address: --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist: --
802-3-ethernet.mtu: auto
802-3-ethernet.s390-subchannels: --
802-3-ethernet.s390-nettype: --
802-3-ethernet.s390-options: --
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
802-3-ethernet.accept-all-mac-addresses:-1 (default)
-------------------------------------------------------------------------------
ipv4.method: auto
ipv4.dns: --
ipv4.dns-search: --
ipv4.dns-options: --
ipv4.dns-priority: 0
ipv4.addresses: --
ipv4.gateway: --
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
ipv4.routing-rules: --
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-iaid: --
ipv4.dhcp-timeout: 0 (default)
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.dhcp-hostname-flags: 0x0 (none)
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.required-timeout: -1 (default)
ipv4.dad-timeout: -1 (default)
ipv4.dhcp-vendor-class-identifier: --
ipv4.dhcp-reject-servers: --
-------------------------------------------------------------------------------
ipv6.method: auto
ipv6.dns: --
ipv6.dns-search: --
ipv6.dns-options: --
ipv6.dns-priority: 0
ipv6.addresses: --
ipv6.gateway: --
ipv6.routes: --
ipv6.route-metric: -1
ipv6.route-table: 0 (unspec)
ipv6.routing-rules: --
ipv6.ignore-auto-routes: no
ipv6.ignore-auto-dns: no
ipv6.never-default: no
ipv6.may-fail: yes
ipv6.required-timeout: -1 (default)
ipv6.ip6-privacy: -1 (unknown)
ipv6.addr-gen-mode: stable-privacy
ipv6.ra-timeout: 0 (default)
ipv6.dhcp-duid: --
ipv6.dhcp-iaid: --
ipv6.dhcp-timeout: 0 (default)
ipv6.dhcp-send-hostname: yes
ipv6.dhcp-hostname: --
ipv6.dhcp-hostname-flags: 0x0 (none)
ipv6.token: --
-------------------------------------------------------------------------------
proxy.method: none
proxy.browser-only: no
proxy.pac-url: --
proxy.pac-script: --
-------------------------------------------------------------------------------
...
...
With this we can see all pertinent profile details. You can use this to examine other profile setups and ensure parity with them, as well as ensure any new profiles you make are set up correctly to your specification.
Connecting via Wi-Fi
Certainly, the easiest way to get your device online is to just go ahead and plug an Ethernet cable in and from there you will be up and running in seconds. But that is not always the best or most practical solution - maybe your device is going to be stored someplace it is not easy to run a physical wire to, or maybe the Ethernet cable you have on hand is too short. If you are using an Arduino Portenta X8, you may have of course noticed by now that it does not have a traditional rj45 Ethernet port and needs a USB-C adapter: yet another reason to consider Wi-Fi.
For hobbyists and production devices live out in the field alike, it is not always practical to rely on a wired connection. For this reason, we are going to discuss configuring your device via Wi-Fi. This is a useful option to have available, even if you plan on predominantly using physical cables, purely as a backup option if nothing else.
Once again, connect to the device terminal, and once you are logged in, follow the commands below to configure Wi-Fi.
Checking Status
The first step is to ensure that the device’s Wi-Fi radio is actually turned on:
device:~$ nmcli radio wifi on
If it is not, this command will do just that! From here, we want to update our available network list:
device:~$ nmcli device wifi rescan
This command instructs NetworkManager to re-scan for nearby Wi-Fi networks. It will output a list of available networks and their signal strengths. You should see output similar to the below:
device:~$ nmcli dev wifi list
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
34:0A:33:1E:41:05 HOMEOFFICE_2 Infra 1 270 Mbit/s 100 **** WPA2
10:72:23:B5:51:67 HOMEOFFICE_1 Infra 6 130 Mbit/s 100 **** WPA2
34:0A:33:1E:41:03 HOMEOFFICE_2_5G Infra 161 270 Mbit/s 94 **** WPA2
Connecting to a Wi-Fi Network
Since we have now established that (a) the device’s Wi-Fi is on and (b) there is at least one network available to join, we are free to go ahead and connect to our desired network using the SSID and password:
device:~$ nmcli dev wifi connect <SSID> password <PASSWORLD>
Replace SSID
with the name of the Wi-Fi network you want to connect to, and PASSWORD
with the actual password or passphrase for that network. After running this command, NetworkManager will attempt to connect to the specified Wi-Fi network using the provided credentials.
We already checked that it’s in range, so assuming we have the correct PASSWORD
, it should connect with no issues.
And it’s as simple as that! Our device is now connected to the Wi-Fi network and ready to go online.
Turning Wi-Fi Off
If for any reason you want to disable Wi-Fi on your device, the command to do so is:
device:~$ nmcli radio wifi off
When you run this command, it will disable the Wi-Fi radio on your system. In this state, you won’t be able to scan for any available networks or connect to them until you enable it again.
You can do this with the same command from earlier:
device:~$ nmcli radio wifi on
Turning off Wi-Fi can be useful when you want to conserve battery power or need to switch to a wired network connection.
Recap and Conclusion
In this tutorial, we covered how to:
- Configure your network and switch between static and dynamic IP
- Enable Wi-Fi and join a network
Join us in the next tutorial as we discuss the basic principles of the Yocto Project and the Linux microPlatform.
Continue Building Ai-Powered Christmas Tree
If you are interested in our entire 14-part series on how to build an AI powdered Christmas tree, browse through each section below. Each part brings you closer to mastering your build:
- Part 1: Your First FoundriesFactory AI-Powered Christmas Tree
- Part 2: Configure Network and Wi-Fi
- Part 3: A Yocto & Linux Tutorial for Building An AI-Powered Christmas Tree
- Part 4: Linux MicroPlatform (lmP) Config Tutorial for AI-Powered Christmas Tree
- Part 5: Modify & Extend Linux MicroPlatform for AI-Powered Christmas Tree
- Part 6: Using a MQTT Switch Module on Arduino Portenta X8
- Part 7: Creating a Shell Script Application and Adding to Linux microPlatform™ (MQTT)
- Part 8: Connecting the Web Camera Interface with Docker Container
- Part 9: Using Edge Impulse AI to Recognize Human Presence With Arduino Portenta X8
- Part 10: Enhancing the Image Detection Capabilities of our AI Powered Christmas Tree
- Part 11: Writing a Python App to Turn Our Christmas Tree On/Off Using AI
- Part 12: Creating a Docker Compose App to Automatically Power Your AI Christmas Tree On/Off
- Part 13: Running Docker Compose Application on a Raspberry Pi 4 to Power Our AI Christmas Tree
- Part 14: Managing Multiple SoM Platforms in the Same Factory