Qt Weekly #27: WiFi networking support on embedded devices

As a part of the Qt for Device Creation offering we provide several
helpful add-on modules that assist in creating applications for embedded devices. In this blog post I would like to demonstrate some of the features supported by the B2Qt WiFi add-on module.

What is it?

The B2Qt WiFi module provides APIs for connecting embedded devices to a wireless network. There are C++ and QML APIs available for managing wireless network connectivity, scanning for wireless network access points, retrieving information from these access points, monitoring for network state changes and more. The API allows you to manage when and to which network to connect, and when to go offline.

Overview of the API

The module consists of 3 classes:

  • (Q)WifiConfiguration - Used to define a network configuration.
  • (Q)WifiDevice - Represents a physical device.
  • (Q)WifiManager - Main interface to the WiFi functionality (Singleton).

How to use it

Here is a code snippet in QML demonstrating how easy it is to connect a device to a wireless access point named "bus-station-wifi" that uses the WPA2 security protocol:

    import B2Qt.Wifi 1.0

WifiConfiguration { id: localConfig ssid: "bus-station-wifi" passphrase: "mypassword" protocol: "WPA2" }

Connections { target: WifiManager onBackendStateChanged: { if (WifiManager.backendState === WifiManager.Running) WifiManager.connect(localConfig) } onNetworkStateChanged: { if (WifiManager.networkState === WifiManager.Connected) print("successfully connected to: " + WifiManager.currentSSID) } }

Component.onCompleted: { if (WifiManager.backendState === WifiManager.Running) { WifiManager.connect(localConfig) } else { // starts initialization of wifi backend WifiManager.start() } }

And the following code illustrates how to achieve the same in C++:

class WifiConnectionHandler : public QObject { Q_OBJECT public: WifiConnectionHandler() { m_config.setSsid("bus-station-wifi"); m_config.setPassphrase("mypassword"); m_config.setProtocol("WPA2");

m_manager = QWifiManager::instance(); connect(m_manager, &QWifiManager::backendStateChanged, this, &WifiConnectionHandler::handleBackendStateChanged);

if (m_manager->backendState() == QWifiManager::Running) { m_manager->connect(&m_config); } else { m_manager->start(); } }

protected slots: void handleBackendStateChanged(QWifiManager::BackendState state) { if (state == QWifiManager::Running) m_manager->connect(&m_config); }

private: QWifiManager *m_manager; QWifiConfiguration m_config; };

The previous examples showed how to connect to a network for which the configuration is known beforehand. As mentioned earlier, the WiFi module can also be used to scan for available WiFi access points. In the next example we use the scan results and present them in a list where the user can select which network to use.

    Binding {
        target: WifiManager
        property: "scanning"
        value: WifiManager.backendState === WifiManager.Running

WifiConfiguration { id: config } ListView { anchors.fill: parent spacing: 8 model: WifiManager.networks delegate: Row { spacing: 10 Text { text: ssid } TextField { id: passwordInput } Button { text: "connect" onClicked: { config.ssid = ssid; config.passphrase = passwordInput.text WifiManager.connect(config) } } } }

Here you can see a screenshot of a more advanced application running on a Nitrogen6_MAX board that utilizes WiFi API for wireless network setup.


For more information check out the documentation.

Blog Topics: