QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
UDPLink.h
Go to the documentation of this file.
1#pragma once
2
3#include "LinkConfiguration.h"
4#include "LinkInterface.h"
5
6#include <QtCore/QByteArray>
7#include <QtCore/QList>
8#include <QtCore/QLoggingCategory>
9#include <QtCore/QMutex>
10#include <QtCore/QString>
11#include <QtNetwork/QHostAddress>
12
13#include <atomic>
14
15#ifdef QGC_ZEROCONF_ENABLED
16#ifdef Q_OS_WIN
17#define WIN32_LEAN_AND_MEAN
18#endif
19#include <dns_sd.h>
20#endif
21
22class QUdpSocket;
23class QThread;
24
26
27/*===========================================================================*/
28
30{
31 UDPClient(const QHostAddress &addr, quint16 portNum)
32 : address(addr)
33 , port(portNum)
34 {}
35
36 explicit UDPClient(const UDPClient *other)
37 : address(other->address)
38 , port(other->port)
39 {}
40
41 bool operator==(const UDPClient &other) const
42 {
43 return ((address == other.address) && (port == other.port));
44 }
45
47 {
48 address = other.address;
49 port = other.port;
50
51 return *this;
52 }
53
54 QHostAddress address;
55 quint16 port = 0;
56};
57
58/*===========================================================================*/
59
61{
62 Q_OBJECT
63
64 Q_PROPERTY(QStringList hostList READ hostList NOTIFY hostListChanged)
65 Q_PROPERTY(quint16 localPort READ localPort WRITE setLocalPort NOTIFY localPortChanged)
66
67public:
68 explicit UDPConfiguration(const QString &name, QObject *parent = nullptr);
69 explicit UDPConfiguration(const UDPConfiguration *source, QObject *parent = nullptr);
70 virtual ~UDPConfiguration();
71
72 Q_INVOKABLE void addHost(const QString &host);
73 Q_INVOKABLE void addHost(const QString &host, quint16 port);
74 Q_INVOKABLE void removeHost(const QString &host);
75 Q_INVOKABLE void removeHost(const QString &host, quint16 port);
76
77 LinkType type() const override { return LinkConfiguration::TypeUdp; }
78 void setAutoConnect(bool autoc = true) override;
79 void copyFrom(const LinkConfiguration *source) override;
80 void loadSettings(QSettings &settings, const QString &root) override;
81 void saveSettings(QSettings &settings, const QString &root) const override;
82 QString settingsURL() const override { return QStringLiteral("UdpSettings.qml"); }
83 QString settingsTitle() const override { return tr("UDP Link Settings"); }
84
85 QStringList hostList() const { return _hostList; }
86 QList<std::shared_ptr<UDPClient>> targetHosts() const { return _targetHosts; }
87 quint16 localPort() const { return _localPort; }
88 void setLocalPort(quint16 port) { if (port != _localPort) { _localPort = port; emit localPortChanged(); } }
89
90signals:
93
94private:
95 void _updateHostList();
96
97 static QString _getIpAddress(const QString &address);
98
99 QStringList _hostList;
100 QList<std::shared_ptr<UDPClient>> _targetHosts;
101 quint16 _localPort = 0;
102};
103
104/*===========================================================================*/
105
106class UDPWorker : public QObject
107{
108 Q_OBJECT
109
110public:
111 explicit UDPWorker(const UDPConfiguration *config, QObject *parent = nullptr);
112 virtual ~UDPWorker();
113
114 bool isConnected() const;
115
116public slots:
117 void setupSocket();
118 void connectLink();
119 void disconnectLink();
120 void writeData(const QByteArray &data);
121
122signals:
123 void connected();
125 void errorOccurred(const QString &errorString);
126 void dataReceived(const QByteArray &data);
127 void dataSent(const QByteArray &data);
128
129private slots:
130 void _onSocketConnected();
131 void _onSocketDisconnected();
132 void _onSocketReadyRead();
133 void _onSocketBytesWritten(qint64 bytes);
134 void _onSocketErrorOccurred(QAbstractSocket::SocketError socketError);
135
136private:
137 const UDPConfiguration *_udpConfig = nullptr;
138 QUdpSocket *_socket = nullptr;
139 QMutex _sessionTargetsMutex;
140 QList<std::shared_ptr<UDPClient>> _sessionTargets;
141 bool _isConnected = false;
142 bool _errorEmitted = false;
143 QSet<QHostAddress> _localAddresses;
144
145 static const QHostAddress _multicastGroup;
146
147#ifdef QGC_ZEROCONF_ENABLED
148 void _registerZeroconf(uint16_t port);
149 void _deregisterZeroconf();
150 static void _zeroconfRegisterCallback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context);
151
152 DNSServiceRef _dnssServiceRef = nullptr;
153#endif
154};
155
156/*===========================================================================*/
157
158class UDPLink : public LinkInterface
159{
160 Q_OBJECT
161
162public:
163 explicit UDPLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
164 virtual ~UDPLink();
165
166 bool isConnected() const override;
167 void disconnect() override;
168 bool isSecureConnection() const override;
169
170protected:
171 bool _connect() override;
172
173private slots:
174 void _writeBytes(const QByteArray &data) override;
175 void _onConnected();
176 void _onDisconnected();
177 void _onErrorOccurred(const QString &errorString);
178 void _onDataReceived(const QByteArray &data);
179 void _onDataSent(const QByteArray &data);
180
181private:
182 const UDPConfiguration *_udpConfig = nullptr;
183 UDPWorker *_worker = nullptr;
184 QThread *_workerThread = nullptr;
185 std::atomic<bool> _disconnectedEmitted{false};
186};
Q_DECLARE_LOGGING_CATEGORY(AndroidSerialLog)
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
QString errorString
Interface holding link specific settings.
The link interface defines the interface for all links used to communicate with the ground station ap...
void localPortChanged()
void hostListChanged()
void dataReceived(const QByteArray &data)
void disconnected()
bool isConnected() const
Definition UDPLink.cc:270
void dataSent(const QByteArray &data)
void errorOccurred(const QString &errorString)
void writeData(const QByteArray &data)
Definition UDPLink.cc:371
void setupSocket()
Definition UDPLink.cc:275
virtual ~UDPWorker()
Definition UDPLink.cc:263
void connected()
void connectLink()
Definition UDPLink.cc:314
void disconnectLink()
Definition UDPLink.cc:352
quint16 port
Definition UDPLink.h:55
UDPClient(const QHostAddress &addr, quint16 portNum)
Definition UDPLink.h:31
QHostAddress address
Definition UDPLink.h:54
UDPClient(const UDPClient *other)
Definition UDPLink.h:36
bool operator==(const UDPClient &other) const
Definition UDPLink.h:41
UDPClient & operator=(const UDPClient &other)
Definition UDPLink.h:46