Feedback
Feedback

If you are having issues with the exercises, please create a ticket on DevZone: devzone.nordicsemi.com
Click or drag files to this area to upload. You can upload up to 2 files.

Exercise 1

Connecting to Wi-Fi using the Wi-Fi shell

In this exercise, we will flash the Wi-Fi: Shell sample to your board. This sample allows you to send commands to the Wi-Fi chipset on your board through a command-line interface (see Supported CLI commands).

We will use the CLI to do various common Wi-Fi operations, such as a Wi-Fi scan, connection and disconnection. Afterwards, we will learn how to securely store your Wi-Fi credentials on your device. In the last section, we will test out the commands for managing Target Wake Time (TWT) on your device. This requires you to have a Wi-Fi 6 Access Point with TWT enabled, and this portion of the exercise is, therefore, optional.

Exercise steps

Note

You need to be using nRF Connect SDK version v2.5.0 or higher.

1. Prepare the project and build and flash it to your board.

1.1 If you haven’t already done so, clone the GitHub repository for this course.

Copy the link to the repository and use VS Code’s Command Palette to clone the repository.

Clone the course’s GitHub repository in VS Code

1.2 In the nRF Connect extension in VS Code, select Open an existing application, and navigate to wifi-fund/lesson2, click on the folder called wififund_less2_exer1 and select Open.

This sample is a simplified version of the Wi-Fi: Shell sample found in nRF Connect SDK.

1.3 Add a build configuration and select the build target for whichever board you are using.

nRF7002 DK

Under Board, select nrf7002dk_nrf5340_cpuapp, then click Build Configuration.

nRF7002 EK

Under Board, select nrf5340dk_nrf5340_cpuapp. Then, under Extra CMake arguments, write the following line and click OK.

Then select Build Configuration.

Build configuration for nRF5340 DK + nRF7002 EK

Alternatively, you can add the following line to the CMakeLists.txt file of the application you are building

1.4 Build and flash the application to your device.

Note

Make sure jumpers P22 and P23 are installed on your board or you will get an error while building.

1.5. View the terminal output

In VS Code, under Connected Devices, connect to the COM port of your board by clicking the electric plug icon as shown in the image below, then choose the default COM port settings 115200 8n1 rtscts:off

Observe the following log output

2. Scan for access points in your vicinity.

Before we connect to a network, let’s do a passive scan to see all available access points.

Type the following command into the terminal

You should see something similar to the following output (this might take a few seconds). This is the scan result list.

The Wi-Fi chip outputs the acquired information about each available access point. As you can see in the output, this information includes the SSID, the length of the SSID, the channel where the AP was broadcasting its beacon, the band the AP operates on, the RSSI as perceived by your device, the security protocol implemented by the AP, the BSSID, and finally the presence or absence of MFP security.

3. Connect to an access point.

Now we can use the command wifi connect to connect to an access point.

wifi connect takes the following parameters

  • <SSID>: SSID of network
  • <channel> (optional): 0 means all
  • <PSK> (optional): Valid only for secured SSIDs
  • <security> (optional): 0-None, 1-PSK, 2-PSK-256, 3-SAE
  • <MFP> (optional): 0-Disable, 1-Optional, 2-Required

It suffices only to enter the SSID and password (PSK) of the access point you want to connect to. However, if you wish to enter the full arguments, note that you can use the scan results list to know the parameters used by the AP then use these parameters as the arguments in your wifi connect command.

For the <security> parameter, entering “0” only works with open APs. Entering “1” is used with APs implementing WPA1-PSK and WPA-2 PSK. Entering “2” is used with APs implementing “WPA2-PSK-SHA256” and entering “3” is used with APs implementing WPA3-PSK SAE.

However, for simplicity, you can issue the following command in the terminal to easily connect to the AP.

If the connection is successful, you should see a similar log output

Note

The multiple “OK” messages come from the Wi-Fi stack and will be omitted in later log output examples for clarity.

4. Get the status of the network interface.

The command wifi status lets us read out extra information about the access point we are connected to that we didn’t get during the scan procedure, such as the beacon interval, DTIM and whether TWT is supported or not.

Issue the following command in the terminal

Observe the following output

5. Get statistics about the Wi-Fi interface.

The command wifi statistics gives us additional information about the Wi-Fi connection, such as the bytes being sent and received, and the errors.

Issue the following command in the terminal

Observe the following output

6. Configure device wakeup mode

The command wifi ps_wakeup_mode is used to configure your Wi-Fi device wakeup mode when using power save mode. It takes the following parameters.

  • <dtim>: Wakeup mode for the DTIM interval
  • <listen_interval>: Wakeup mode for the Listen interval

Issue the following command in the terminal to set it to wakeup for the DTIM interval for example. Power save modes, DTIM intervals and the Listen interval will be explained in detail in Lesson 6 of this course.

7. Storing the Wi-Fi credentials.

Using the wifi connect command mentioned above, you will have to re-enter your SSID and password upon device reset to re-establish the connection. To mitigate this, we can use the Wi-Fi credentials shell subcommands, which interact with the Wi-Fi credentials library to add the network credentials to credentials storage.

7.1 Store the Wi-Fi credentials using wifi_cred add.

To store the credentials, we will be using the Wi-Fi credentials shell, which are identified as wifi_cred, as specifically the subcommand add.

wifi_cred add takes the following parameters

  • <SSID>: SSID of network
  • <Security type>: Security {OPEN, WPA2-PSK, WPA2-PSK-SHA256, WPA3-SAE}
  • <PSK> (optional): Valid only for secured SSIDs
  • <BSSID> (optional)
  • <Band> (optional): 2.4GHz or 5GHz
  • favorite (optional): Makes the network higher priority in automatic connection

Enter the following CLI command to store your Wi-Fi credentials.

You can replace the “WPA2-PSK” part above with the security protocol used by your AP. Supported arguments in this command are {OPEN, WPA2-PSK, WPA2-PSK-SHA256, WPA3-SAE}. You can check them out by using this command.

7.2 Connect to Wi-Fi using the auto_connect subcommand.

Now that we have stored the credentials on the device, we will use the auto-connect subcommand which automatically connects to any stored network

The auto_connect command is defined in <install_path>/subsys/net/lib/wifi_mgmt_ext/wifi-cred_shell_autoconnect.c, and uses the NET_REQUEST_WIFI_CONNECT_STORED command in the Network Management API. We will take a closer look at this command in Exercise 2 of this lesson.

7.3 The wifi_cred command also has the subcommands list and delete.

list will list all the networks in credential storage and delete "<SSID>" will remove that network from credentials storage.

(Optional) 8. Set up a Target Wake Time flow.

This step is optional as it only works if you are using a Wi-Fi 6 router that supports Target Wake Time. In some cases, you will need to enable TWT functionality in the router configurations. Consult your router’s user manual for more information.

The command wifi twt is used to manage TWT flows.

It has three different subcommands: setup, teardown,and teardown_all.

To setup a TWT flow, we will use the setup subcommand, which takes the following parameters

  • <negotiation_type>: 0 – Individual, 1 – Broadcast, 2 – Wake TBTT
  • <setup_cmd>: 0 – Request, 1 – Suggest, 2 – Demand
  • <dialog_token>: 1-255, used to match action requests with action responses
  • <flow_id>: 0-7, gives an ID to the flow being created
  • <responder>: 0- Requester, 1- Responder
  • <trigger>: 0- Trigger mode enabled, 1- Trigger mode disabled
  • <implicit>: 0- Explicit TWT operation, 1- Implicit
  • <announce>: 0- Announce mode enabled, 1- Announce mode disabled
  • <twt_wake_interval>: 1 – 262144 µs, TWT Wake Duration, for how long will the device be awake (in µs)
  • <twt_interval>: 1 µs – 2^31 µs, TWT Wake Interval, the interval between successive TWT wake periods

Negotiation type is used to determine the target STA of this TWT schedule. When set to “Individual”, it means that this TWT schedule will be set to the STA individually. Whereas, when set to “Broadcast”, it means the AP broadcasts TWT schedules to multiple STAs.

We want the device to wakeup for 20 ms, every minute.

Issue the following command in the terminal

(Optional) 9. Tear down the Target Wake Time flow.

To tear down the TWT flow, we will use the teardown subcommand, which takes the following parameters

  • <negotiation_type>: 0 – Individual, 1 – Broadcast, 2 – Wake TBTT
  • <setup_cmd>: 0 – Request, 1 – Suggest, 2 – Demand
  • <dialog_token>: 1-255, used to match action requests with action responses
  • <flow_id>: 0-7, gives an ID to the flow being created

Use the flow_id parameter to indicate which TWT flow to tear down.

We want to tear down the flow that was set up in the previous step, which we assigned flow_id 2.

Issue the following command in the terminal

Alternatively, teardown_all can be used to tear down all TWT flows, by sending the following command.

Register an account
Already have an account? Log in
(All fields are required unless specified optional)

  • 8 or more characters
  • Upper and lower case letters
  • At least one number or special character

Forgot your password?
Enter the email associated with your account, and we will send you a link to reset your password.