diff --git a/QGCExternalLibs.pri b/QGCExternalLibs.pri index 03ae6cf709151af0462ced13d53a9cff23010ae6..4ae555ca9159f269a742b088f46033e5f516c087 100644 --- a/QGCExternalLibs.pri +++ b/QGCExternalLibs.pri @@ -278,3 +278,19 @@ else:WindowsBuild { DEFINES += QGC_SPEECH_ENABLED LIBS += -lOle32 } + +# +# [OPTIONAL] Zeroconf for UDP links +# +contains (DEFINES, DISABLE_ZEROCONF) { + message("Skipping support for Zeroconf (manual override from command line)") + DEFINES -= DISABLE_ZEROCONF +# Otherwise the user can still disable this feature in the user_config.pri file. +} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_ZEROCONF) { + message("Skipping support for Zeroconf (manual override from user_config.pri)") +# Mac support is built into OS +} else:MacBuild|iOSBuild { + message("Including support for Zeroconf (Bonjour)") + DEFINES += QGC_ZEROCONF_ENABLED +} + diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index 4838316913f723b6a20f79469633de2b82d39ffa..5669a5d8dca0f441b2461cf04439ef9c278cf26e 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -39,6 +39,8 @@ This file is part of the QGROUNDCONTROL project #include "QGC.h" #include +static const char* kZeroconfRegistration = "_qgroundcontrol._udp"; + static bool is_ip(const QString& address) { int a,b,c,d; @@ -75,6 +77,7 @@ static QString get_ip_address(const QString& address) UDPLink::UDPLink(UDPConfiguration* config) : _socket(NULL) , _connectState(false) + , _dnssServiceRef(NULL) { Q_ASSERT(config != NULL); _config = config; @@ -108,6 +111,7 @@ void UDPLink::run() _hardwareConnect(); exec(); if (_socket) { + _deregisterZeroconf(); _socket->close(); } } @@ -267,6 +271,7 @@ bool UDPLink::_hardwareConnect() _socket->setProxy(QNetworkProxy::NoProxy); _connectState = _socket->bind(host, _config->localPort(), QAbstractSocket::ReuseAddressHint); if (_connectState) { + _registerZeroconf(_config->localPort(), kZeroconfRegistration); QObject::connect(_socket, SIGNAL(readyRead()), this, SLOT(readBytes())); emit connected(); } else { @@ -300,6 +305,40 @@ qint64 UDPLink::getCurrentOutDataRate() const return 0; } +void UDPLink::_registerZeroconf(uint16_t port, const std::string ®Type) +{ +#if defined(QGC_ZEROCONF_ENABLED) + DNSServiceErrorType result = DNSServiceRegister(&_dnssServiceRef, 0, 0, 0, + regType.c_str(), + NULL, + NULL, + htons(port), + 0, + NULL, + NULL, + NULL); + if (result != kDNSServiceErr_NoError) + { + emit communicationError("UDP Link Error", "Error registering Zeroconf"); + _dnssServiceRef = NULL; + } +#else + Q_UNUSED(port); + Q_UNUSED(regType); +#endif +} + +void UDPLink::_deregisterZeroconf() +{ +#if defined(QGC_ZEROCONF_ENABLED) + if (_dnssServiceRef) + { + DNSServiceRefDeallocate(_dnssServiceRef); + _dnssServiceRef = NULL; + } +#endif +} + //-------------------------------------------------------------------------- //-- UDPConfiguration diff --git a/src/comm/UDPLink.h b/src/comm/UDPLink.h index bb6b17a56f0bafc1d2f84bea0b468f52e6128566..f333bac71f6e840a265e79d4f4da0169c9fe83e5 100644 --- a/src/comm/UDPLink.h +++ b/src/comm/UDPLink.h @@ -37,6 +37,10 @@ This file is part of the QGROUNDCONTROL project #include #include +#if defined(QGC_ZEROCONF_ENABLED) +#include +#endif + #include "QGCConfig.h" #include "LinkManager.h" @@ -201,6 +205,12 @@ private: bool _hardwareConnect(); void _restartConnection(); +#if defined(QGC_ZEROCONF_ENABLED) + void _registerZeroconf(uint16_t port, const std::string& regType); + void _deregisterZeroconf(); + DNSServiceRef _dnssServiceRef; +#endif + signals: //Signals are defined by LinkInterface