summaryrefslogtreecommitdiffstats
path: root/examples/wifi/wifi-cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/wifi/wifi-cpp')
-rw-r--r--examples/wifi/wifi-cpp/doc/images/wifi-cpp.jpgbin0 -> 41866 bytes
-rw-r--r--examples/wifi/wifi-cpp/doc/src/wifi-cpp.qdoc97
-rw-r--r--examples/wifi/wifi-cpp/main.cpp228
-rw-r--r--examples/wifi/wifi-cpp/wifi-cpp.pro9
4 files changed, 334 insertions, 0 deletions
diff --git a/examples/wifi/wifi-cpp/doc/images/wifi-cpp.jpg b/examples/wifi/wifi-cpp/doc/images/wifi-cpp.jpg
new file mode 100644
index 0000000..90feb20
--- /dev/null
+++ b/examples/wifi/wifi-cpp/doc/images/wifi-cpp.jpg
Binary files differ
diff --git a/examples/wifi/wifi-cpp/doc/src/wifi-cpp.qdoc b/examples/wifi/wifi-cpp/doc/src/wifi-cpp.qdoc
new file mode 100644
index 0000000..334dba7
--- /dev/null
+++ b/examples/wifi/wifi-cpp/doc/src/wifi-cpp.qdoc
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use the contact form at
+** http://www.qt.io
+**
+** This file is part of Qt Enterprise Embedded.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** the contact form at http://www.qt.io
+**
+****************************************************************************/
+/*!
+ \title Getting Started with B2Qt.Wifi in C++
+ \example wifi/wifi-cpp
+ \ingroup wifi-examples
+ \brief Guide to getting started with B2Qt.Wifi using C++.
+
+ \section1 Preparing the Application
+
+ Use the following \c include statement to access the C++ classes:
+
+ \code
+ #include <B2QtWifi>
+ \endcode
+
+ Before building your application, add the following statement to your
+ \c .pro file to link against the B2Qt.Wifi library:
+
+ \code
+ QT += b2qtwifi
+ \endcode
+
+ This guide will demonstrate how to create a Qt Widget-based application
+ that utilizes the B2Qt.Wifi API to set up a wifi network connection. We
+ will start by looking at how to scan for wifi access points, and how to
+ display and process this data in the application. At the end of the guide
+ we will show how to connect directly to a known wifi network configuration.
+
+ \image wifi-cpp.jpg
+
+ \section1 Listing Wifi Networks
+
+ First we need to set up QListView widget which we will use to list wifi
+ networks that can be detected by the device. The detected network access
+ points are packed as a list-based data model and can be retrieved using
+ QWifiManager::networks. Here we also set a custom item delegate and
+ connect to two QWifiManager signals.
+
+ \snippet wifi/wifi-cpp/main.cpp 0
+
+ \section1 Creating a Delegate
+
+ The Wifi network model has many data roles that describe the different
+ properties of Wifi network. This data can be used by an application to list
+ detailed network information and/or to create QWifiConfiguration objects.
+ In this example we are interested in the network name. In the paint()
+ method we check if the network name is equal to the currently active
+ network connection, and append appropriate network state information.
+
+ \snippet wifi/wifi-cpp/main.cpp 1
+
+ \section1 Connecting to a Selected Network
+
+ On press of the \uicontrol Connect button, connetToNetwork() slot gets
+ invoked. In this slot we query network properties for the selected network
+ and create a QWifiConfiguration object, which we later pass to the
+ QWifiManager::connect function to set up a connection. During this
+ operation any changes in the network state is reported by QWifiManager
+ asynchronously.
+
+ \snippet wifi/wifi-cpp/main.cpp 2
+
+ We use QWifiManager::NetworkState change event handler to trigger the
+ repainting of the delegate. This way, we can present a current network
+ state to the user.
+
+ \snippet wifi/wifi-cpp/main.cpp 4
+
+ \section1 Connecting To a Known Network
+
+ If you already know the network configuration beforehand, you can skip the
+ network scanning, listing and selection steps. This can be a valid use-case
+ for devices that do not change their physical location.
+
+ QWifiManager::BackendState change events are reported asynchronously, so we
+ must connect the signal to a slot that connects to the network access point
+ after the backend initialization is complete.
+
+ \snippet wifi/wifi-cpp/main.cpp 3
+ */
diff --git a/examples/wifi/wifi-cpp/main.cpp b/examples/wifi/wifi-cpp/main.cpp
new file mode 100644
index 0000000..54a35e9
--- /dev/null
+++ b/examples/wifi/wifi-cpp/main.cpp
@@ -0,0 +1,228 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use the contact form at
+** http://www.qt.io
+**
+** This file is part of Qt Enterprise Embedded.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** the contact form at http://www.qt.io
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtWidgets>
+#include <B2QtWifi>
+
+class NetworkDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+//! [1]
+public:
+ NetworkDelegate(QObject *parent = 0)
+ : QStyledItemDelegate(parent)
+ {
+ m_wifiManager = QWifiManager::instance();
+ }
+
+ void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+ {
+ QStyledItemDelegate::paint(painter, option, index);
+ painter->save();
+ QString ssid = qvariant_cast<QString>(index.data(QWifiManager::SSID));
+ if (ssid == m_wifiManager->currentSSID())
+ ssid += networkStateText();
+ painter->drawText(option.rect, Qt::AlignVCenter, ssid);
+ painter->restore();
+ }
+
+ QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+ {
+ QFont font = QApplication::font();
+ QFontMetrics fm(font);
+ return QSize(option.rect.width(), fm.height() * 2);
+ }
+
+protected:
+ QString networkStateText() const
+ {
+ QWifiManager::NetworkState networkState = m_wifiManager->networkState();
+ switch (networkState) {
+ case QWifiManager::Disconnected:
+ return QStringLiteral("");
+ break;
+ case QWifiManager::Authenticating:
+ return QStringLiteral(" (authenticating)");
+ break;
+ case QWifiManager::HandshakeFailed:
+ return QStringLiteral(" (handshake failed)");
+ break;
+ case QWifiManager::ObtainingIPAddress:
+ return QStringLiteral(" (obtaining IP address)");
+ break;
+ case QWifiManager::DhcpRequestFailed:
+ return QStringLiteral(" (dhcp request failed)");
+ break;
+ case QWifiManager::Connected:
+ return QStringLiteral(" (connected)");
+ break;
+ }
+ }
+//! [1]
+private:
+ QWifiManager *m_wifiManager;
+};
+
+class WifiSettings : public QWidget
+{
+ Q_OBJECT
+public:
+ //! [0]
+ WifiSettings(QWidget *parent = 0)
+ : QWidget(parent)
+ , m_listView(new QListView(this))
+ , m_networkDelegate(new NetworkDelegate(this))
+ {
+ m_wifiManager = QWifiManager::instance();
+ m_listView->setModel(m_wifiManager->networks());
+ m_listView->setItemDelegate(m_networkDelegate);
+
+ connect(m_wifiManager, &QWifiManager::backendStateChanged,
+ this, &WifiSettings::handleBackendStateChanged);
+ connect(m_wifiManager, &QWifiManager::networkStateChanged,
+ this, &WifiSettings::handleNetworkStateChanged);
+
+ setupWidgets();
+ }
+ //! [0]
+protected:
+ void setupWidgets()
+ {
+ m_backendStateReporter = new QLabel(this);
+ handleBackendStateChanged(m_wifiManager->backendState());
+ m_passwordInput = new QLineEdit(this);
+ m_passwordInput->setPlaceholderText("Enter Password");
+
+ QPushButton *connectButton = new QPushButton("Connect", this);
+ QPushButton *disconnectButton = new QPushButton("Disconnect", this);
+ QPushButton *startBackendButton = new QPushButton("Switch On", this);
+ QPushButton *stopBackendButton = new QPushButton("Switch Off", this);
+
+ connect(startBackendButton, &QPushButton::clicked, m_wifiManager, &QWifiManager::start);
+ connect(stopBackendButton, &QPushButton::clicked, m_wifiManager, &QWifiManager::stop);
+ connect(connectButton, &QPushButton::clicked, this, &WifiSettings::connectToNetwork);
+ connect(disconnectButton, &QPushButton::clicked, m_wifiManager, &QWifiManager::disconnect);
+
+ QGridLayout *grid = new QGridLayout(this);
+ grid->addWidget(connectButton, 0, 0);
+ grid->addWidget(disconnectButton, 0, 1);
+ grid->addWidget(startBackendButton, 1, 0);
+ grid->addWidget(stopBackendButton, 1, 1);
+ grid->addWidget(m_listView, 2, 0, 1, 2);
+ grid->addWidget(m_passwordInput, 3, 0, 1, 2);
+ grid->addWidget(m_backendStateReporter, 4, 0, 1, 2);
+ setLayout(grid);
+ }
+
+
+protected slots:
+ void handleBackendStateChanged(QWifiManager::BackendState state)
+ {
+ switch (state) {
+ case QWifiManager::Running:
+ m_wifiManager->setScanning(true);
+ m_backendStateReporter->setText("wifi backend state: <b>running<\b>");
+ break;
+ case QWifiManager::NotRunning:
+ m_wifiManager->setScanning(false);
+ m_backendStateReporter->setText("wifi backend state: <b>stopped<\b>");
+ break;
+ case QWifiManager::Initializing:
+ m_backendStateReporter->setText("wifi backend state: <b>initializing<\b>");
+ break;
+ case QWifiManager::Terminating:
+ m_backendStateReporter->setText("wifi backend state: <b>terminating<\b>");
+ break;
+ }
+ }
+ //! [4]
+ void handleNetworkStateChanged(QWifiManager::NetworkState state)
+ {
+ m_listView->viewport()->repaint();
+ }
+ //! [4]
+ //! [2]
+ void connectToNetwork()
+ {
+ QModelIndex index = m_listView->currentIndex();
+ QWifiConfiguration config;
+ if (index.isValid()) {
+ QString ssid = qvariant_cast<QString>(index.data(QWifiManager::SSID));
+ config.setSsid(ssid);
+ config.setPassphrase(m_passwordInput->text());
+ m_wifiManager->connect(&config);
+ }
+ }
+ //! [2]
+private:
+ QWifiManager *m_wifiManager;
+ QListView *m_listView;
+ NetworkDelegate *m_networkDelegate;
+ QLabel *m_backendStateReporter;
+ QLineEdit *m_passwordInput;
+};
+
+//! [3]
+class WifiConnectionHandler : public QObject
+{
+ Q_OBJECT
+public:
+ WifiConnectionHandler()
+ {
+ // replace with a valid network configuration
+ m_config.setSsid("my-local-wifi");
+ m_config.setPassphrase("helloworld123");
+ m_config.setProtocol("WPA");
+ m_manager = QWifiManager::instance();
+ if (m_manager->backendState() == QWifiManager::Running) {
+ m_manager->connect(&m_config);
+ } else {
+ connect(m_manager, &QWifiManager::backendStateChanged,
+ this, &WifiConnectionHandler::connectToNetwork);
+ m_manager->start();
+ }
+ }
+
+protected slots:
+ void connectToNetwork(QWifiManager::BackendState state)
+ {
+ if (state == QWifiManager::Running)
+ m_manager->connect(&m_config);
+ }
+
+private:
+ QWifiManager *m_manager;
+ QWifiConfiguration m_config;
+};
+//! [3]
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+
+ WifiSettings wifiSettingsWindow;
+ wifiSettingsWindow.show();
+
+ // disable the above 2 lines before enabling this
+ // WifiConnectionHandler connectionHandler;
+
+ return a.exec();
+}
+
+#include "main.moc"
diff --git a/examples/wifi/wifi-cpp/wifi-cpp.pro b/examples/wifi/wifi-cpp/wifi-cpp.pro
new file mode 100644
index 0000000..f457df3
--- /dev/null
+++ b/examples/wifi/wifi-cpp/wifi-cpp.pro
@@ -0,0 +1,9 @@
+QT += core widgets b2qtwifi
+
+TARGET = wifi-cpp
+TEMPLATE = app
+
+target.path = /data/user/qt/$$TARGET
+INSTALLS += target
+
+SOURCES += main.cpp