#include "XNUDPTestService.h" #include "XNUDPTestService_p.h" #include #include #include #include XN_DLL_INITIALIZE(XNUDPTestService) XN_REGISTER_SERVICE_BEGIN_SERVICE(XNUDPTestService) XN_REGISTER_SERVICE_END_SERVICE(XNUDPTestService) XNUDPTestService::XNUDPTestService(QObject *parent) : XNServiceObject(*new XNUDPTestServicePrivate(this), parent) { } XNUDPTestService::~XNUDPTestService() { } XNUDPTestService::XNUDPTestService(XNUDPTestServicePrivate &dd, QObject *parent) : XNServiceObject(dd, parent) { } void XNUDPTestService::OnInitialize() { Q_D(XNUDPTestService); XNServiceObject::OnInitialize(); // 读取配置文件 QFile file(GetXmlPath()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { LOG_WARNING("Failed to open config file:%1", GetXmlPath()); return; } QDomDocument doc; if (!doc.setContent(&file)) { file.close(); LOG_WARNING("Failed to parse config file:%1", GetXmlPath()); return; } file.close(); // 读取UDP配置 QDomElement udpElement = doc.documentElement().firstChildElement("UDP"); if (!udpElement.isNull()) { d->localPort = udpElement.firstChildElement("LocalPort").text().toUInt(); d->targetHost = udpElement.firstChildElement("TargetHost").text(); d->targetPort = udpElement.firstChildElement("TargetPort").text().toUInt(); } else { LOG_WARNING("UDP configuration not found, using default values"); d->localPort = 12345; d->targetHost = "127.0.0.1"; d->targetPort = 54321; } } void XNUDPTestService::OnPrepareForExecute() { Q_D(XNUDPTestService); XNServiceObject::OnPrepareForExecute(); // 初始化UDP socket d->udpSocket = new QUdpSocket(this); // 绑定本地端口 if (!d->udpSocket->bind(QHostAddress::Any, d->localPort)) { LOG_WARNING("UDP socket bind failed on port:%1", d->localPort); return; } // 连接UDP socket的信号 //connect(d->udpSocket, &QUdpSocket::readyRead, this, &XNUDPTestService::HandleIncomingData); RegisterRTEventHandler("SendTestUDPData", std::bind(&XNUDPTestService::SendData, this, std::placeholders::_1)); } void XNUDPTestService::HandleIncomingData() { Q_D(XNUDPTestService); return; while (d->udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(d->udpSocket->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; d->udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); // 处理接收到的数据 if (datagram.size() <= 5 || datagram[0] != 0x0b || datagram[4] != datagram.size()) { LOG_WARNING("Invalid UDP datagram received"); continue; } if (datagram[1] == 0x04) { if (datagram[2] == 0x00 && datagram[3] == 0x00) { TriggerRTEvent("ATA04AeroInput", datagram); continue; } else if (datagram[2] == 0x01 && datagram[3] == 0x00) { TriggerRTEvent("ATA04GhInput", datagram); continue; } else if (datagram[2] == 0x02 && datagram[3] == 0x00) { TriggerRTEvent("ATA04WbInput", datagram); continue; } } // TODO: 根据具体需求处理其它数据 //TriggerRTEvent("ReceiveUDPData", datagram); } } void XNUDPTestService::SendData(const QVariant &data) { Q_D(XNUDPTestService); if (!d->udpSocket) { LOG_WARNING("UDP socket not initialized"); return; } // 将QVariant转换为字节数组 QByteArray datagram = data.toByteArray(); // 发送数据 qint64 bytesSent = d->udpSocket->writeDatagram(datagram, QHostAddress(d->targetHost), d->targetPort); if (bytesSent == -1) { LOG_WARNING("Failed to send UDP datagram:%1", d->udpSocket->errorString()); } }