diff options
author | Andrew O'Doherty <andrew.odoherty@qt.io> | 2018-08-09 16:46:09 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-08-16 08:13:04 +0000 |
commit | 9b155d1df00ccd60d6c80d3b47a410e2b50df152 (patch) | |
tree | 3366a6b5e6dfb26a94338ce6121794f27bf0b52d /examples | |
parent | 789657bd1b038bcebc82df1aeafc7de66d5786cd (diff) |
AN184: Implement TCP support as specified in KnxNet/IP Core v2
Change-Id: Id3139d106e43ee37824b5d555f652641e685f0d2
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/knx/knxeditor/localdevicemanagement.cpp | 20 | ||||
-rw-r--r-- | examples/knx/knxeditor/localdevicemanagement.h | 2 | ||||
-rw-r--r-- | examples/knx/knxeditor/mainwindow.cpp | 16 | ||||
-rw-r--r-- | examples/knx/knxeditor/mainwindow.h | 1 | ||||
-rw-r--r-- | examples/knx/knxeditor/mainwindow.ui | 20 | ||||
-rw-r--r-- | examples/knx/knxeditor/tunneling.cpp | 9 | ||||
-rw-r--r-- | examples/knx/knxeditor/tunneling.h | 2 |
7 files changed, 62 insertions, 8 deletions
diff --git a/examples/knx/knxeditor/localdevicemanagement.cpp b/examples/knx/knxeditor/localdevicemanagement.cpp index 9b82f48..803badf 100644 --- a/examples/knx/knxeditor/localdevicemanagement.cpp +++ b/examples/knx/knxeditor/localdevicemanagement.cpp @@ -82,7 +82,9 @@ LocalDeviceManagement::LocalDeviceManagement(QWidget* parent) connect(ui->connectRequestDeviceManagement, &QPushButton::clicked, this, [&]() { m_management.setLocalPort(0); - m_management.connectToHost(m_server.controlEndpointAddress(), m_server.controlEndpointPort()); + m_management.connectToHost(m_server.controlEndpointAddress(), + m_server.controlEndpointPort(), + m_proto); }); connect(&m_management, &QKnxNetIpDeviceManagement::connected, this, [&] { @@ -165,6 +167,11 @@ void LocalDeviceManagement::setKnxNetIpServer(const QKnxNetIpServerInfo &server) ui->deviceManagementSendRequest->setEnabled(false); } +void LocalDeviceManagement::setTcpEnable(bool value) +{ + m_proto = (value ? QKnxNetIp::HostProtocol::TCP_IPv4 : QKnxNetIp::HostProtocol::UDP_IPv4); +} + void LocalDeviceManagement::clearLogging() { ui->textOuputDeviceManagement->clear(); @@ -308,8 +315,17 @@ void LocalDeviceManagement::updatePropertyTypeCombobox(const QString &type) void LocalDeviceManagement::handleIoListResponse(const QKnxDeviceManagementFrame &frame) { if (frame.objectType() != QKnxInterfaceObjectType::System::Device - || frame.property() != QKnxInterfaceObjectProperty::Device::IoList) + || frame.property() != QKnxInterfaceObjectProperty::Device::IoList) { + return; + } + + if (frame.isNegativeConfirmation()) { + auto metaEnum = QMetaEnum::fromType<QKnxNetIp::CemiServer::Error>(); + ui->textOuputDeviceManagement->append(tr("Received negative confirmation. Error code: %1") + .arg(QString::fromLatin1(metaEnum.valueToKey(int(frame.error()))))); + m_awaitIoListResponse = false; return; + } auto dataTypes = QKnxInterfaceObjectPropertyDataType::fromProperty(QKnxInterfaceObjectProperty ::Device::IoList); diff --git a/examples/knx/knxeditor/localdevicemanagement.h b/examples/knx/knxeditor/localdevicemanagement.h index 1dedc34..218ad95 100644 --- a/examples/knx/knxeditor/localdevicemanagement.h +++ b/examples/knx/knxeditor/localdevicemanagement.h @@ -77,6 +77,7 @@ public: void setNatAware(bool isNatAware); void setLocalAddress(const QHostAddress &address); void setKnxNetIpServer(const QKnxNetIpServerInfo &server); + void setTcpEnable(bool value); public slots: void clearLogging(); @@ -108,6 +109,7 @@ private: QKnxNetIpServerInfo m_server; QKnxNetIpDeviceManagement m_management; + QKnxNetIp::HostProtocol m_proto { QKnxNetIp::HostProtocol::UDP_IPv4 }; }; #endif diff --git a/examples/knx/knxeditor/mainwindow.cpp b/examples/knx/knxeditor/mainwindow.cpp index ad4fa49..0640a2d 100644 --- a/examples/knx/knxeditor/mainwindow.cpp +++ b/examples/knx/knxeditor/mainwindow.cpp @@ -176,7 +176,7 @@ void MainWindow::newServerSelected(int serverBoxIndex) return; auto info = ui->serverBox->itemData(serverBoxIndex).value<QKnxNetIpServerInfo>(); - + bool version2Supported = false; ui->serverDescription->setText(tr("<html><head><style> th { text-align: left; } td.padding { " "padding-left: 10px; } </style></head> <body>" " <table style=\"width:100%\">" @@ -191,13 +191,15 @@ void MainWindow::newServerSelected(int serverBoxIndex) "</body></html>") .arg(info.individualAddress().toString()) .arg(info.controlEndpointAddress().toString()).arg(info.controlEndpointPort()) - .arg([&info]() -> QString { + .arg([&info, &version2Supported]() -> QString { QString value; const auto services = info.supportedServices(); for (const auto &service : services) { value.append(tr("<tr><td class=\"padding\">%1</td></th>") .arg(tr("KNXnet/IP %1, Version: %2").arg(familieToString(service.ServiceFamily)) .arg(service.ServiceFamilyVersion))); + if (service.ServiceFamilyVersion >= 2) + version2Supported = true; } return value; }()) @@ -205,9 +207,6 @@ void MainWindow::newServerSelected(int serverBoxIndex) const auto &hpai = info.endpoint(); const QKnxNetIpHpaiProxy endpoint(hpai); - if (endpoint.hostProtocol() != QKnxNetIp::HostProtocol::UDP_IPv4) - return; - if (endpoint.isValid() && m_server != info) { m_server = info; @@ -217,6 +216,7 @@ void MainWindow::newServerSelected(int serverBoxIndex) ui->deviceManagement->setEnabled(true); ui->deviceManagement->setKnxNetIpServer(m_server); } + ui->radioButtonTCP->setEnabled(version2Supported); } void MainWindow::newIPAddressSelected(int localIpBoxIndex) @@ -261,6 +261,12 @@ void MainWindow::showServerAndServices(const QKnxNetIpServerInfo &info) .toString()).arg(info.controlEndpointPort()), QVariant::fromValue(info)); } +void MainWindow::on_radioButtonTCP_toggled(bool checked) +{ + ui->tunneling->setTcpEnable(checked); + ui->deviceManagement->setTcpEnable(checked); +} + void MainWindow::fillLocalIpBox() { auto firstItem = new QStandardItem(tr("Interface: IP address --Select One--")); diff --git a/examples/knx/knxeditor/mainwindow.h b/examples/knx/knxeditor/mainwindow.h index 9c6d955..8aa256f 100644 --- a/examples/knx/knxeditor/mainwindow.h +++ b/examples/knx/knxeditor/mainwindow.h @@ -73,6 +73,7 @@ private slots: void newServerSelected(int serverBoxIndex); void newIPAddressSelected(int localIpBoxIndex); void showServerAndServices(const QKnxNetIpServerInfo &info); + void on_radioButtonTCP_toggled(bool checked); private: void fillLocalIpBox(); diff --git a/examples/knx/knxeditor/mainwindow.ui b/examples/knx/knxeditor/mainwindow.ui index edbe82c..e981c61 100644 --- a/examples/knx/knxeditor/mainwindow.ui +++ b/examples/knx/knxeditor/mainwindow.ui @@ -99,6 +99,26 @@ </spacer> </item> <item> + <widget class="QRadioButton" name="radioButtonUDP"> + <property name="text"> + <string>Use UDP as transport layer protocol</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="radioButtonTCP"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Use TCP as transport layer protocol</string> + </property> + </widget> + </item> + <item> <widget class="QCheckBox" name="checkboxNat"> <property name="text"> <string>Use NAT for KNXnet/IP communication</string> diff --git a/examples/knx/knxeditor/tunneling.cpp b/examples/knx/knxeditor/tunneling.cpp index 5684837..0d7486a 100644 --- a/examples/knx/knxeditor/tunneling.cpp +++ b/examples/knx/knxeditor/tunneling.cpp @@ -94,7 +94,9 @@ Tunneling::Tunneling(QWidget* parent) connect(ui->connectTunneling, &QPushButton::clicked, this, [&]() { m_tunnel.setLocalPort(0); - m_tunnel.connectToHost(m_server.controlEndpointAddress(), m_server.controlEndpointPort()); + m_tunnel.connectToHost(m_server.controlEndpointAddress(), + m_server.controlEndpointPort(), + m_proto); }); connect(&m_tunnel, &QKnxNetIpTunnel::connected, this, [&] { @@ -259,6 +261,11 @@ void Tunneling::setKnxNetIpServer(const QKnxNetIpServerInfo &server) ui->tunnelingSendRequest->setEnabled(false); } +void Tunneling::setTcpEnable(bool value) +{ + m_proto = (value ? QKnxNetIp::HostProtocol::TCP_IPv4 : QKnxNetIp::HostProtocol::UDP_IPv4); +} + void Tunneling::clearLogging() { ui->textOuputTunneling->clear(); diff --git a/examples/knx/knxeditor/tunneling.h b/examples/knx/knxeditor/tunneling.h index 45458ca..4431223 100644 --- a/examples/knx/knxeditor/tunneling.h +++ b/examples/knx/knxeditor/tunneling.h @@ -93,6 +93,7 @@ public: void setNatAware(bool isNatAware); void setLocalAddress(const QHostAddress &address); void setKnxNetIpServer(const QKnxNetIpServerInfo &server); + void setTcpEnable(bool value); public slots: void clearLogging(); @@ -117,6 +118,7 @@ private: QKnxLinkLayerFrame m_frame; QKnxNetIpTunnel m_tunnel; QKnxNetIpServerInfo m_server; + QKnxNetIp::HostProtocol m_proto { QKnxNetIp::HostProtocol::UDP_IPv4 }; }; #endif |