From 4a6df2b93c3e59f214e88ed3105602c9cb3c31a3 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 27 Apr 2020 10:26:22 +0200 Subject: [PATCH 1/3] Add IP address information --- debian/changelog | 5 ++ .../bluetooth/wirelessservice.cpp | 10 +++- libnymea-networkmanager/networkdevice.cpp | 57 +++++++++++++++---- libnymea-networkmanager/networkdevice.h | 9 ++- libnymea-networkmanager/networkmanager.cpp | 2 +- 5 files changed, 68 insertions(+), 15 deletions(-) diff --git a/debian/changelog b/debian/changelog index 00b35c0..8d114cf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,8 @@ +libnymea-networkmanager (0.4.0) UNRELEASED; urgency=medium + + + -- Michael Zanetti Mon, 27 Apr 2020 10:24:32 +0200 + libnymea-networkmanager (0.3.0) xenial; urgency=medium [ Michael Zanetti ] * Remove misleading return value, now that the method is async diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.cpp b/libnymea-networkmanager/bluetooth/wirelessservice.cpp index d3b4afb..4900d2f 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.cpp +++ b/libnymea-networkmanager/bluetooth/wirelessservice.cpp @@ -385,7 +385,15 @@ void WirelessService::commandGetCurrentConnection(const QVariantMap &request) connectionDataMap.insert("p", 0); connectionDataMap.insert("i", ""); } else { - QHostAddress address = wifiInterface.addressEntries().first().ip(); + QHostAddress address; + // Note: for now, we'll just use the first IPv4 address. However, in a future version + // this should somehow pack all addresses, IPv4 and IPv6 ones. + foreach (const QNetworkAddressEntry &entry, wifiInterface.addressEntries()) { + if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) { + address = entry.ip(); + break; + } + } qCDebug(dcNetworkManagerBluetoothServer()) << "Current connection:" << m_device->activeAccessPoint() << address.toString(); connectionDataMap.insert("e", m_device->activeAccessPoint()->ssid()); connectionDataMap.insert("m", m_device->activeAccessPoint()->macAddress()); diff --git a/libnymea-networkmanager/networkdevice.cpp b/libnymea-networkmanager/networkdevice.cpp index a875320..e4af352 100644 --- a/libnymea-networkmanager/networkdevice.cpp +++ b/libnymea-networkmanager/networkdevice.cpp @@ -170,6 +170,8 @@ NetworkDevice::NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent) return; } + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::deviceInterfaceString(), "StateChanged", this, SLOT(onStateChanged(uint,uint,uint))); + m_udi = m_networkDeviceInterface->property("Udi").toString(); m_interface = m_networkDeviceInterface->property("Interface").toString(); m_ipInterface = m_networkDeviceInterface->property("IpInterface").toString(); @@ -185,10 +187,8 @@ NetworkDevice::NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent) m_deviceType = NetworkDeviceType(m_networkDeviceInterface->property("DeviceType").toUInt()); m_activeConnection = qdbus_cast(m_networkDeviceInterface->property("ActiveConnection")); - m_ip4Config = qdbus_cast(m_networkDeviceInterface->property("Ip4Config")); - m_ip6Config = qdbus_cast(m_networkDeviceInterface->property("Ip6Config")); - - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::deviceInterfaceString(), "StateChanged", this, SLOT(onStateChanged(uint,uint,uint))); + m_ipv4Addresses = readIpAddresses("Ip4Config", "org.freedesktop.NetworkManager.IP4Config"); + m_ipv6Addresses = readIpAddresses("Ip6Config", "org.freedesktop.NetworkManager.IP6Config"); } /*! Returns the dbus object path of this \l{NetworkDevice}. */ @@ -257,6 +257,18 @@ bool NetworkDevice::autoconnect() const return m_autoconnect; } +/*! Returns IPv4 addresses for this \l{NetworkDevice}. */ +QStringList NetworkDevice::ipv4Addresses() const +{ + return m_ipv4Addresses; +} + +/*! Returns IPv4 addresses for this \l{NetworkDevice}. */ +QStringList NetworkDevice::ipv6Addresses() const +{ + return m_ipv6Addresses; +} + /*! Returns the device state of this \l{NetworkDevice}. \sa NetworkDeviceState, */ NetworkDevice::NetworkDeviceState NetworkDevice::deviceState() const { @@ -287,12 +299,6 @@ QDBusObjectPath NetworkDevice::activeConnection() const return m_activeConnection; } -/*! Returns the dbus object path from the IPv4 configuration of this \l{NetworkDevice}. */ -QDBusObjectPath NetworkDevice::ip4Config() const -{ - return m_ip4Config; -} - /*! Returns the list of dbus object paths for the currently available connection of this \l{NetworkDevice}. */ QList NetworkDevice::availableConnections() const { @@ -335,15 +341,44 @@ QString NetworkDevice::deviceStateReasonToString(const NetworkDevice::NetworkDev return QString(metaEnum.valueToKey(deviceStateReason)); } +QStringList NetworkDevice::readIpAddresses(const QString &property, const QString &interface) +{ + QStringList ret; + QDBusObjectPath configPath = qdbus_cast(m_networkDeviceInterface->property(property.toUtf8())); + + if (configPath.path() != "/") { + QDBusInterface iface(NetworkManagerUtils::networkManagerServiceString(), configPath.path(), "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); + + QDBusMessage reply = iface.call("Get", interface, "AddressData"); + QVariant v = reply.arguments().first(); + QDBusArgument arg = v.value().variant().value(); + + arg.beginArray(); + while(!arg.atEnd()) { + QVariantMap m; + arg >> m; + ret.append(m.value("address").toString()); + } + } + return ret; +} + void NetworkDevice::onStateChanged(uint newState, uint oldState, uint reason) { Q_UNUSED(oldState) qCDebug(dcNetworkManager()) << m_interface << "--> State changed:" << deviceStateToString(NetworkDeviceState(newState)) << ":" << deviceStateReasonToString(NetworkDeviceStateReason(reason)); + + if (m_deviceState != NetworkDeviceState(newState)) { - m_deviceState = NetworkDeviceState(newState); + m_ipv4Addresses = readIpAddresses("Ip4Config", "org.freedesktop.NetworkManager.IP4Config"); + m_ipv6Addresses = readIpAddresses("Ip6Config", "org.freedesktop.NetworkManager.IP6Config"); + qCDebug(dcNetworkManager()) << "Fooooooooooooo" << m_ipv4Addresses << m_ipv6Addresses; emit deviceChanged(); + + m_deviceState = NetworkDeviceState(newState); emit stateChanged(m_deviceState); } + } QDebug operator<<(QDebug debug, NetworkDevice *device) diff --git a/libnymea-networkmanager/networkdevice.h b/libnymea-networkmanager/networkdevice.h index 7193efe..6ac78fe 100644 --- a/libnymea-networkmanager/networkdevice.h +++ b/libnymea-networkmanager/networkdevice.h @@ -170,6 +170,8 @@ public: uint mtu() const; uint metered() const; bool autoconnect() const; + QStringList ipv4Addresses() const; + QStringList ipv6Addresses() const; NetworkDeviceState deviceState() const; QString deviceStateString() const; @@ -200,6 +202,8 @@ private: QString m_driverVersion; QString m_firmwareVersion; QString m_physicalPortId; + QList m_ipv4Addresses; + QList m_ipv6Addresses; uint m_mtu = 0; uint m_metered = 0; bool m_autoconnect = false; @@ -208,11 +212,12 @@ private: NetworkDeviceType m_deviceType = NetworkDeviceTypeUnknown; QDBusObjectPath m_activeConnection; - QDBusObjectPath m_ip4Config; - QDBusObjectPath m_ip6Config; QList m_availableConnections; +private: + QStringList readIpAddresses(const QString &property, const QString &interface); + private slots: void onStateChanged(uint newState, uint oldState, uint reason); diff --git a/libnymea-networkmanager/networkmanager.cpp b/libnymea-networkmanager/networkmanager.cpp index a8d07af..205d021 100644 --- a/libnymea-networkmanager/networkmanager.cpp +++ b/libnymea-networkmanager/networkmanager.cpp @@ -355,7 +355,7 @@ void NetworkManager::init() qCDebug(dcNetworkManager()) << "Initializing network manager"; // Check DBus connection if (!QDBusConnection::systemBus().isConnected()) { - qCWarning(dcNetworkManager()) << "System DBus not connected. NetworkManagre not available."; + qCWarning(dcNetworkManager()) << "System DBus not connected. NetworkManager not available."; setAvailable(false); return; } From 09630729cb29639af235ea40cd5eca059f5ac5ec Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 4 May 2020 15:35:10 +0200 Subject: [PATCH 2/3] Add wifi mode property --- .../bluetooth/wirelessservice.cpp | 18 ++--- .../bluetooth/wirelessservice.h | 4 +- .../wirelessnetworkdevice.cpp | 65 +++++++------------ .../wirelessnetworkdevice.h | 40 +++++------- 4 files changed, 51 insertions(+), 76 deletions(-) diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.cpp b/libnymea-networkmanager/bluetooth/wirelessservice.cpp index 4900d2f..8fceea6 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.cpp +++ b/libnymea-networkmanager/bluetooth/wirelessservice.cpp @@ -68,7 +68,7 @@ WirelessService::WirelessService(QLowEnergyService *service, NetworkManager *net m_device = m_networkManager->wirelessNetworkDevices().first(); connect(m_device, &WirelessNetworkDevice::bitRateChanged, this, &WirelessService::onWirelessDeviceBitRateChanged); connect(m_device, &WirelessNetworkDevice::stateChanged, this, &WirelessService::onWirelessDeviceStateChanged); - connect(m_device, &WirelessNetworkDevice::modeChanged, this, &WirelessService::onWirelessModeChanged); + connect(m_device, &WirelessNetworkDevice::wirelessModeChanged, this, &WirelessService::onWirelessModeChanged); } QLowEnergyService *WirelessService::service() @@ -119,9 +119,9 @@ QLowEnergyServiceData WirelessService::serviceData(NetworkManager *networkManage wirelessModeCharacteristicData.addDescriptor(clientConfigDescriptorData); wirelessModeCharacteristicData.setValueLength(1, 1); if (networkManager->wirelessNetworkDevices().isEmpty()) { - wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(WirelessNetworkDevice::ModeUnknown)); + wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(WirelessNetworkDevice::WirelessModeUnknown)); } else { - wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(networkManager->wirelessNetworkDevices().first()->mode())); + wirelessModeCharacteristicData.setValue(WirelessService::getWirelessMode(networkManager->wirelessNetworkDevices().first()->wirelessMode())); } serviceData.addCharacteristic(wirelessModeCharacteristicData); @@ -190,16 +190,16 @@ QByteArray WirelessService::getWirelessNetworkDeviceState(const NetworkDevice::N return QByteArray::fromHex("00"); } -QByteArray WirelessService::getWirelessMode(WirelessNetworkDevice::Mode mode) +QByteArray WirelessService::getWirelessMode(WirelessNetworkDevice::WirelessMode mode) { switch (mode) { - case WirelessNetworkDevice::ModeUnknown: + case WirelessNetworkDevice::WirelessModeUnknown: return QByteArray::fromHex("00"); - case WirelessNetworkDevice::ModeAdhoc: + case WirelessNetworkDevice::WirelessModeAdhoc: return QByteArray::fromHex("01"); - case WirelessNetworkDevice::ModeInfrastructure: + case WirelessNetworkDevice::WirelessModeInfrastructure: return QByteArray::fromHex("02"); - case WirelessNetworkDevice::ModeAccessPoint: + case WirelessNetworkDevice::WirelessModeAccessPoint: return QByteArray::fromHex("03"); } @@ -605,7 +605,7 @@ void WirelessService::onWirelessDeviceStateChanged(const NetworkDevice::NetworkD m_service->writeCharacteristic(characteristic, WirelessService::getWirelessNetworkDeviceState(state)); } -void WirelessService::onWirelessModeChanged(WirelessNetworkDevice::Mode mode) +void WirelessService::onWirelessModeChanged(WirelessNetworkDevice::WirelessMode mode) { if (!m_service) { qCWarning(dcNetworkManagerBluetoothServer()) << "WirelessService: Could not update wireless device mode. Service not valid"; diff --git a/libnymea-networkmanager/bluetooth/wirelessservice.h b/libnymea-networkmanager/bluetooth/wirelessservice.h index d9a813f..f879034 100644 --- a/libnymea-networkmanager/bluetooth/wirelessservice.h +++ b/libnymea-networkmanager/bluetooth/wirelessservice.h @@ -86,7 +86,7 @@ private: // Note: static to be available in serviceData static QByteArray getWirelessNetworkDeviceState(const NetworkDevice::NetworkDeviceState &state); - static QByteArray getWirelessMode(WirelessNetworkDevice::Mode mode); + static QByteArray getWirelessMode(WirelessNetworkDevice::WirelessMode mode); void streamData(const QVariantMap &responseMap); @@ -116,7 +116,7 @@ private slots: // Wireless network device void onWirelessDeviceBitRateChanged(const int &bitRate); void onWirelessDeviceStateChanged(const NetworkDevice::NetworkDeviceState &state); - void onWirelessModeChanged(WirelessNetworkDevice::Mode mode); + void onWirelessModeChanged(WirelessNetworkDevice::WirelessMode mode); }; diff --git a/libnymea-networkmanager/wirelessnetworkdevice.cpp b/libnymea-networkmanager/wirelessnetworkdevice.cpp index ea0c450..40227c8 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.cpp +++ b/libnymea-networkmanager/wirelessnetworkdevice.cpp @@ -86,9 +86,9 @@ WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, readAccessPoints(); - setMacAddress(m_wirelessInterface->property("HwAddress").toString()); - setMode(static_cast(m_wirelessInterface->property("Mode").toUInt())); - setBitrate(m_wirelessInterface->property("Bitrate").toInt()); + m_macAddress = m_wirelessInterface->property("HwAddress").toString(); + m_wirelessMode = static_cast(m_wirelessInterface->property("Mode").toUInt()); + m_bitRate = m_wirelessInterface->property("Bitrate").toInt() / 1000; setActiveAccessPoint(qdbus_cast(m_wirelessInterface->property("ActiveAccessPoint"))); } @@ -104,9 +104,9 @@ int WirelessNetworkDevice::bitRate() const return m_bitRate; } -WirelessNetworkDevice::Mode WirelessNetworkDevice::mode() const +WirelessNetworkDevice::WirelessMode WirelessNetworkDevice::wirelessMode() const { - return m_mode; + return m_wirelessMode; } /*! Returns the current active \l{WirelessAccessPoint} of this \l{WirelessNetworkDevice}. */ @@ -169,34 +169,6 @@ void WirelessNetworkDevice::readAccessPoints() argument.endArray(); } -void WirelessNetworkDevice::setMacAddress(const QString &macAddress) -{ - m_macAddress = macAddress; -} - -void WirelessNetworkDevice::setMode(WirelessNetworkDevice::Mode mode) -{ - if (m_mode == mode) - return; - - m_mode = mode; - emit modeChanged(m_mode); -} - -void WirelessNetworkDevice::setBitrate(int bitRate) -{ - if (m_bitRate != bitRate / 1000) { - m_bitRate = bitRate / 1000; - emit bitRateChanged(m_bitRate); - emit deviceChanged(); - } -} - -void WirelessNetworkDevice::setLastScan(int lastScan) -{ - m_lastScan = lastScan; -} - void WirelessNetworkDevice::setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath) { if (m_activeAccessPointObjectPath != activeAccessPointObjectPath) { @@ -251,20 +223,27 @@ void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties) { //qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: Property changed" << properties; - if (properties.contains("Bitrate")) - setBitrate(properties.value("Bitrate").toInt()); + if (properties.contains("Bitrate")) { + m_bitRate = properties.value("Bitrate").toInt() / 1000; + emit bitRateChanged(m_bitRate); + } - if (properties.contains("ActiveAccessPoint")) - setActiveAccessPoint(qdbus_cast(properties.value("ActiveAccessPoint"))); - - if (properties.contains("Mode")) - setMode(static_cast(m_wirelessInterface->property("Mode").toUInt())); + if (properties.contains("Mode")) { + m_wirelessMode = static_cast(m_wirelessInterface->property("Mode").toUInt()); + emit wirelessModeChanged(m_wirelessMode); + } // Note: available since 1.12 (-1 means never scanned) - if (properties.contains("LastScan")) - setLastScan(m_wirelessInterface->property("LastScan").toInt()); + if (properties.contains("LastScan")) { + m_lastScan = m_wirelessInterface->property("LastScan").toInt(); + emit lastScanChanged(m_lastScan); + } + if (properties.contains("ActiveAccessPoint")) { + setActiveAccessPoint(qdbus_cast(properties.value("ActiveAccessPoint"))); + } + emit deviceChanged(); } /*! Writes the given \a device to the given to \a debug. \sa WirelessNetworkDevice, */ @@ -272,7 +251,7 @@ QDebug operator<<(QDebug debug, WirelessNetworkDevice *device) { debug.nospace() << "WirelessNetworkDevice(" << device->interface() << ", "; debug.nospace() << device->macAddress() << ", "; - debug.nospace() << device->mode() << ", "; + debug.nospace() << device->wirelessMode() << ", "; debug.nospace() << device->bitRate() << " [Mb/s], "; debug.nospace() << device->deviceStateString() << ") "; return debug.space(); diff --git a/libnymea-networkmanager/wirelessnetworkdevice.h b/libnymea-networkmanager/wirelessnetworkdevice.h index 0dac008..667734c 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.h +++ b/libnymea-networkmanager/wirelessnetworkdevice.h @@ -46,20 +46,20 @@ class WirelessNetworkDevice : public NetworkDevice { Q_OBJECT public: - enum Mode { - ModeUnknown = 0, - ModeAdhoc = 1, - ModeInfrastructure = 2, - ModeAccessPoint = 3 + enum WirelessMode { + WirelessModeUnknown = 0, + WirelessModeAdhoc = 1, + WirelessModeInfrastructure = 2, + WirelessModeAccessPoint = 3 }; - Q_ENUM(Mode) + Q_ENUM(WirelessMode) explicit WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr); // Properties QString macAddress() const; int bitRate() const; - Mode mode() const; + WirelessMode wirelessMode() const; WirelessAccessPoint *activeAccessPoint(); // Accesspoints @@ -70,13 +70,23 @@ public: // Methods void scanWirelessNetworks(); +signals: + void bitRateChanged(int bitRate); + void wirelessModeChanged(WirelessMode mode); + void lastScanChanged(int lastScan); + +private slots: + void accessPointAdded(const QDBusObjectPath &objectPath); + void accessPointRemoved(const QDBusObjectPath &objectPath); + void propertiesChanged(const QVariantMap &properties); + private: QDBusInterface *m_wirelessInterface = nullptr; WirelessAccessPoint *m_activeAccessPoint = nullptr; int m_bitRate; QString m_macAddress; - Mode m_mode = ModeUnknown; + WirelessMode m_wirelessMode = WirelessModeUnknown; int m_lastScan = -1; QDBusObjectPath m_activeAccessPointObjectPath; @@ -84,21 +94,7 @@ private: void readAccessPoints(); - void setMacAddress(const QString &macAddress); - void setMode(Mode mode); - void setBitrate(int bitRate); - void setLastScan(int lastScan); void setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath); - -private slots: - void accessPointAdded(const QDBusObjectPath &objectPath); - void accessPointRemoved(const QDBusObjectPath &objectPath); - void propertiesChanged(const QVariantMap &properties); - -signals: - void bitRateChanged(int bitRate); - void modeChanged(Mode mode); - }; QDebug operator<<(QDebug debug, WirelessNetworkDevice *device); From 5963dc7b5572839f4664ab23a5394a05a7350e1e Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 3 Jun 2020 13:06:18 +0200 Subject: [PATCH 3/3] drop debug print --- libnymea-networkmanager/networkdevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libnymea-networkmanager/networkdevice.cpp b/libnymea-networkmanager/networkdevice.cpp index e4af352..4603e22 100644 --- a/libnymea-networkmanager/networkdevice.cpp +++ b/libnymea-networkmanager/networkdevice.cpp @@ -372,7 +372,6 @@ void NetworkDevice::onStateChanged(uint newState, uint oldState, uint reason) if (m_deviceState != NetworkDeviceState(newState)) { m_ipv4Addresses = readIpAddresses("Ip4Config", "org.freedesktop.NetworkManager.IP4Config"); m_ipv6Addresses = readIpAddresses("Ip6Config", "org.freedesktop.NetworkManager.IP6Config"); - qCDebug(dcNetworkManager()) << "Fooooooooooooo" << m_ipv4Addresses << m_ipv6Addresses; emit deviceChanged(); m_deviceState = NetworkDeviceState(newState);