diff options
Diffstat (limited to 'src/knx/netip/qknxnetipserverdiscoveryagent_p.h')
-rw-r--r-- | src/knx/netip/qknxnetipserverdiscoveryagent_p.h | 97 |
1 files changed, 93 insertions, 4 deletions
diff --git a/src/knx/netip/qknxnetipserverdiscoveryagent_p.h b/src/knx/netip/qknxnetipserverdiscoveryagent_p.h index 21bdcdf..46be5fe 100644 --- a/src/knx/netip/qknxnetipserverdiscoveryagent_p.h +++ b/src/knx/netip/qknxnetipserverdiscoveryagent_p.h @@ -47,14 +47,94 @@ #include <QtKnx/qknxnetipsearchrequest.h> #include <QtKnx/qknxnetipsearchresponse.h> #include <QtKnx/qknxnetipserverdiscoveryagent.h> + #include <QtNetwork/qhostaddress.h> #include <QtNetwork/qnetworkdatagram.h> +#include <QtNetwork/qnetworkinterface.h> #include <QtNetwork/qudpsocket.h> #include <private/qobject_p.h> QT_BEGIN_NAMESPACE +struct Adapter +{ + QHostAddress address; + QNetworkInterface iface; +}; + +struct DiscovererConfig +{ + DiscovererConfig() = default; + ~DiscovererConfig() = default; + + DiscovererConfig(int ttl, int timeout, bool nat, bool multicast, bool coreV1, bool coreV2, + const QVector<QKnxNetIpSrp> &srps) + : Ttl(ttl) + , Timeout(timeout) + , Nat(nat) + , Multicast(multicast) + , DiscoveryCoreV1(coreV1) + , DiscoveryCoreV2(coreV2) + , ExtendedSearchParameters(srps) + {} + + int Ttl { 64 }; + int Timeout { 3000 }; + + bool Nat { false }; + bool Multicast { true }; + + bool DiscoveryCoreV1 { true }; + bool DiscoveryCoreV2 { true }; + + QVector<QKnxNetIpSrp> ExtendedSearchParameters; +}; + +class Discoverer : public QObject +{ + Q_OBJECT + +public: + Discoverer(const QHostAddress &address, const QNetworkInterface iface, const DiscovererConfig &config); + ~Discoverer() override; + +public slots: + void start(); + void finish(); + +signals: + void started(); + void timeout(); + void finished(Discoverer *iam); + + void stateChanged(QKnxNetIpServerDiscoveryAgent::State state); + void errorOccurred(QKnxNetIpServerDiscoveryAgent::Error error, const QString &errorString); + + void deviceDiscovered(const QKnxNetIpServerInfo &discoveryInfo); + +private slots: + void onTimeout(); + void onReadyRead(); + void onError(QUdpSocket::SocketError error); + +private: + void setAndEmitStateChanged(QKnxNetIpServerDiscoveryAgent::State state); + +private: + QHostAddress m_address; + QNetworkInterface m_iface; + + QTimer *m_timer { nullptr }; + QUdpSocket *m_socket { nullptr }; + + DiscovererConfig m_config; + QVector<QByteArray> m_devices; + + QHostAddress m_multicast { QStringLiteral("224.0.23.12") }; + QKnxNetIpServerDiscoveryAgent::State m_state { QKnxNetIpServerDiscoveryAgent::State::NotRunning }; +}; + class Q_KNX_EXPORT QKnxNetIpServerDiscoveryAgentPrivate final : public QObjectPrivate { Q_DECLARE_PUBLIC(QKnxNetIpServerDiscoveryAgent) @@ -70,7 +150,13 @@ public: void setAndEmitStateChanged(QKnxNetIpServerDiscoveryAgent::State newState); void setAndEmitDeviceDiscovered(const QKnxNetIpServerInfo &discoveryInfo); - void setAndEmitErrorOccurred(QKnxNetIpServerDiscoveryAgent::Error e, const QString &message); + void setAndEmitErrorOccurred(QKnxNetIpServerDiscoveryAgent::Error newError, const QString &message); + + void start(); + void start(const QVector<Adapter> &adapters); + void start(const QVector<QHostAddress> addresses); + void start(QKnxNetIpServerDiscoveryAgent::InterfaceTypes types); + void stop(); private: QUdpSocket *socket { nullptr }; @@ -78,12 +164,12 @@ private: QTimer *frequencyTimer { nullptr }; quint16 port { 0 }, usedPort { 0 }; - QHostAddress address { QHostAddress::AnyIPv4 }, usedAddress; + QHostAddress address { QHostAddress::Null }, usedAddress; const quint16 multicastPort { QKnxNetIp::Constants::DefaultPort }; const QHostAddress multicastAddress { QLatin1String(QKnxNetIp::Constants::MulticastAddress) }; - quint8 ttl { 60 }; + quint8 ttl { 64 }; bool nat { false }; int frequency { 0 }; int timeout { QKnxNetIp::Timeout::SearchTimeout }; @@ -96,9 +182,12 @@ private: QKnxNetIpServerDiscoveryAgent::ResponseType type { QKnxNetIpServerDiscoveryAgent::ResponseType::Multicast }; - QKnxNetIpServerDiscoveryAgent::DiscoveryModes discoveryMode + QKnxNetIpServerDiscoveryAgent::DiscoveryModes mode { QKnxNetIpServerDiscoveryAgent::DiscoveryMode::CoreV1 }; QVector<QKnxNetIpSrp> srps; + + Adapter adapter; + QVector<Discoverer*> discoveries; }; QT_END_NAMESPACE |