2024-01-25 18:37:25 +08:00
|
|
|
|
#include "HxBroadcast.h"
|
2024-01-12 18:43:14 +08:00
|
|
|
|
|
|
|
|
|
#include <QHostAddress>
|
2024-01-21 22:06:55 +08:00
|
|
|
|
#include <QJsonDocument>
|
|
|
|
|
#include <QJsonObject>
|
2024-01-12 18:43:14 +08:00
|
|
|
|
|
|
|
|
|
HxBroadcast *broadcast = nullptr;
|
|
|
|
|
|
2024-01-21 22:06:55 +08:00
|
|
|
|
HxBroadcast *HxBroadcast::context() { return broadcast; }
|
2024-01-12 18:43:14 +08:00
|
|
|
|
|
2024-02-04 18:28:34 +08:00
|
|
|
|
void HxBroadcast::initialization(int port, QString ip)
|
2024-01-12 18:43:14 +08:00
|
|
|
|
{
|
|
|
|
|
broadcast = new HxBroadcast();
|
|
|
|
|
|
2024-02-04 18:28:34 +08:00
|
|
|
|
broadcast->ip = ip;
|
2024-01-12 18:43:14 +08:00
|
|
|
|
broadcast->port = port;
|
|
|
|
|
broadcast->socket = new QUdpSocket();
|
|
|
|
|
connect(broadcast->socket, &QUdpSocket::readyRead, broadcast, &HxBroadcast::receive_ready_read);
|
|
|
|
|
connect(broadcast, &HxBroadcast::publish_event, broadcast, &HxBroadcast::publish_achieve);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-21 22:06:55 +08:00
|
|
|
|
void HxBroadcast::publish(QString message) { emit broadcast->publish_event(message); }
|
2024-01-12 18:43:14 +08:00
|
|
|
|
|
2024-02-01 01:03:55 +08:00
|
|
|
|
void HxBroadcast::publish_json(int action_type, QJsonObject msginfo)
|
2024-01-12 18:43:14 +08:00
|
|
|
|
{
|
2024-02-01 01:03:55 +08:00
|
|
|
|
QJsonObject root;
|
2024-01-21 22:06:55 +08:00
|
|
|
|
|
|
|
|
|
root.insert("action_type", action_type);
|
|
|
|
|
root.insert("msgInfo", msginfo);
|
|
|
|
|
|
|
|
|
|
publish(QJsonDocument(root).toJson(QJsonDocument::Compact));
|
2024-01-12 18:43:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 01:03:55 +08:00
|
|
|
|
void HxBroadcast::publish_json(int action_type, std::initializer_list<QPair<QString, QJsonValue>> args)
|
|
|
|
|
{
|
|
|
|
|
QJsonObject msginfo;
|
|
|
|
|
|
|
|
|
|
for (std::initializer_list<QPair<QString, QJsonValue>>::const_iterator i = args.begin(); i != args.end(); ++i)
|
|
|
|
|
msginfo.insert(i->first, i->second);
|
|
|
|
|
|
|
|
|
|
publish_json(action_type, msginfo);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-04 18:28:34 +08:00
|
|
|
|
void HxBroadcast::publish_achieve(QString message)
|
|
|
|
|
{
|
|
|
|
|
if(ip.isEmpty())
|
|
|
|
|
socket->writeDatagram(message.toUtf8(), QHostAddress::Broadcast, broadcast->port);
|
|
|
|
|
else
|
|
|
|
|
socket->writeDatagram(message.toUtf8(), QHostAddress(ip), broadcast->port);
|
|
|
|
|
}
|
2024-01-21 22:06:55 +08:00
|
|
|
|
|
2024-01-12 18:43:14 +08:00
|
|
|
|
void HxBroadcast::receive_ready_read()
|
|
|
|
|
{
|
|
|
|
|
/* 拥有等待的数据报 */
|
|
|
|
|
while (socket->hasPendingDatagrams())
|
|
|
|
|
{
|
|
|
|
|
QByteArray datagram;
|
|
|
|
|
|
|
|
|
|
/* 让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据 */
|
|
|
|
|
datagram.resize(socket->pendingDatagramSize());
|
|
|
|
|
|
2024-01-21 22:06:55 +08:00
|
|
|
|
/* 接收数据报,将其存放到datagram中 */
|
2024-01-12 18:43:14 +08:00
|
|
|
|
socket->readDatagram(datagram.data(), datagram.size());
|
|
|
|
|
|
2024-01-21 22:06:55 +08:00
|
|
|
|
emit broadcast->receive_event(datagram);
|
2024-01-12 18:43:14 +08:00
|
|
|
|
}
|
|
|
|
|
}
|