#pragma once #include "qsacnnode_global.h" #include "sacn/node.h" #include "sdt/udp.h" #include #include #include #include /** * @brief The QSacnNode class */ class QT_EXPORT QSacnNode : public QUdpSocket , public sACN::Node { Q_OBJECT public: explicit QSacnNode(QObject *parent = nullptr, QUuid = QUuid::createUuid()); // rlp component void rlpSend(const ACN::PDU::Stream, const ACN::SDT::UDP::ipAddress&) override; // reciever QSacnUniverse * universe(const uint16_t u) {return rx_universes_.value(u); } void subscribe(const uint16_t universe = 1) override; void unsubscribe(const uint16_t) override; // source QSacnUniverse * source(const uint16_t u) {return tx_universes_.value(u); } void create(const uint16_t) override; void terminate(const uint16_t) override; signals: void foundUniverse( std::shared_ptr); private: void udpReceive(); QHash rx_universes_; QHash tx_universes_; public: // 9.3.1 Allocation of IPv4 Multicast Addresses // Multicast addresses are from the IPv4 Local Scope. static inline QHostAddress IPv4MulticastAddress(uint16_t universe) { quint32 address = 239 << 24 | 255 << 16 | universe; return QHostAddress(address); }; // 9.3.2 Allocation of IPv6 Multicast Addresses static inline QHostAddress IPv6MulticastAddress(uint16_t universe) { quint8 address [] = {255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, (quint8)(universe >> 8), (quint8)(universe & 0xff)}; return QHostAddress(address); }; };