134 lines
3.5 KiB
C++
Executable File
134 lines
3.5 KiB
C++
Executable File
#include "XNUDPTestService.h"
|
|
#include "XNUDPTestService_p.h"
|
|
#include <XNCore/XNServiceManager.h>
|
|
#include <XNCore/XNDDSManager.h>
|
|
#include <QFile>
|
|
#include <QDomDocument>
|
|
|
|
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());
|
|
}
|
|
}
|