feat:新增组播

Video_Medical
wanghaoyu 4 weeks ago
parent 8725cf2da6
commit e2bf903a68

@ -490,6 +490,11 @@ void CommandWidget::setPodIPConfig(NetworkIPStruct networkIP, bool isConnect)
qDebug() << "端口号绑定失败"; qDebug() << "端口号绑定失败";
} }
if (!m_CUdpSocket->joinMulticast())
{
qDebug() << "加入组播失败";
}
//绑定目标IP Port //绑定目标IP Port
m_CUdpSocket->setTargetInfo(networkIP.remoteIP, networkIP.remotePort); m_CUdpSocket->setTargetInfo(networkIP.remoteIP, networkIP.remotePort);
} }
@ -526,14 +531,6 @@ void CommandWidget::setStopTracking()
/***武汉天进吊舱控制***/ /***武汉天进吊舱控制***/
void CommandWidget::initmUdpParam() void CommandWidget::initmUdpParam()
{ {
if (!m_CUdpSocket->bind("172.10.0.249", 10001))
{
qDebug() << "端口号绑定失败";
}
//绑定目标IP Port
m_CUdpSocket->setTargetInfo("172.10.0.249", 10000);
QIntValidator* validator = new QIntValidator(0, 100, this); QIntValidator* validator = new QIntValidator(0, 100, this);
ui->cmdLineEdit->setValidator(validator); ui->cmdLineEdit->setValidator(validator);
ui->cmdLineEdit->setText("40"); ui->cmdLineEdit->setText("40");

@ -1,4 +1,5 @@
#include "CUdpSocket.h" #include "CUdpSocket.h"
#include "../global.h"
CUdpSocket::CUdpSocket(QObject* parent) : QObject(parent) CUdpSocket::CUdpSocket(QObject* parent) : QObject(parent)
{ {
@ -10,6 +11,11 @@ CUdpSocket::CUdpSocket(QObject* parent) : QObject(parent)
CUdpSocket::~CUdpSocket() CUdpSocket::~CUdpSocket()
{ {
//离开所有加入的组播组
if (m_sock->state() == QAbstractSocket::BoundState) {
m_sock->leaveMulticastGroup(m_hostAddr);
}
// 释放UDP套接字内存空间 // 释放UDP套接字内存空间
m_sock->close(); m_sock->close();
delete m_sock; delete m_sock;
@ -18,7 +24,10 @@ CUdpSocket::~CUdpSocket()
bool CUdpSocket::bind(QString ip, ushort port) bool CUdpSocket::bind(QString ip, ushort port)
{ {
// 返回绑定函数返回值 // 返回绑定函数返回值
m_localIP = ip;
m_localAddr = QHostAddress(ip);
m_localPort = port;
if (!m_sock->bind(QHostAddress(ip), port)) if (!m_sock->bind(QHostAddress(ip), port))
{ {
qDebug() << "Bind failed:" << m_sock->errorString(); qDebug() << "Bind failed:" << m_sock->errorString();
@ -40,13 +49,18 @@ void CUdpSocket::sendData(QByteArray data)
void CUdpSocket::setTargetInfo(QString ip, quint16 port) void CUdpSocket::setTargetInfo(QString ip, quint16 port)
{ {
// 存储传入的IP和端口号 //存储传入的IP和端口号
m_hostAddr = QHostAddress(ip); m_hostAddr = QHostAddress(ip);
m_port = port; m_port = port;
} }
bool CUdpSocket::close() bool CUdpSocket::close()
{ {
//离开所有加入的组播组
if (m_sock->state() == QAbstractSocket::BoundState) {
m_sock->leaveMulticastGroup(m_hostAddr);
}
m_sock->close(); m_sock->close();
if (m_sock->state() == QUdpSocket::UnconnectedState) { if (m_sock->state() == QUdpSocket::UnconnectedState) {
qDebug() << "Socket 已成功关闭"; qDebug() << "Socket 已成功关闭";
@ -57,16 +71,35 @@ bool CUdpSocket::close()
return false; return false;
} }
bool CUdpSocket::joinMulticast()
{
bool a = isMulticastAddress(m_localIP);
if (m_localIP.isNull() || !isMulticastAddress(m_localIP)) { return false; }
if (!m_sock->joinMulticastGroup(m_localAddr)) {
qDebug() << "Join multicast group failed:" << m_sock->errorString();
return false;
}
return true;
}
QPair<QString, quint16> CUdpSocket::getSenderIPSetting()
{
return qMakePair(m_localIP, m_localPort);
}
void CUdpSocket::on_readyReadData() void CUdpSocket::on_readyReadData()
{ {
// 通过函数判断当前是否有等待读取的数据并循环获取 //通过函数判断当前是否有等待读取的数据并循环获取
while (m_sock->hasPendingDatagrams()) while (m_sock->hasPendingDatagrams())
{ {
//创建数据存储容器,并设置长度为将接收的数据长度 //创建数据存储容器,并设置长度为将接收的数据长度
QByteArray data; QByteArray data;
data.resize(m_sock->pendingDatagramSize()); data.resize(m_sock->pendingDatagramSize());
//读取数据并保存信息发送者的地址和ip(方便发送时指定发送位置) //读取数据并保存信息发送者的地址和ip(方便发送时指定发送位置)
m_sock->readDatagram(data.data(), data.size(), &m_hostAddr, &m_port); m_sock->readDatagram(data.data(), data.size(), &senderIP, &senderPort);
//发送接收数据的信号 //发送接收数据的信号
emit recvDataSignal(data); emit recvDataSignal(data);
} }

@ -4,6 +4,7 @@
#include <QObject> #include <QObject>
#include <QUdpSocket> #include <QUdpSocket>
#include <QHostAddress> #include <QHostAddress>
#include <QPair>
class CUdpSocket : public QObject class CUdpSocket : public QObject
{ Q_OBJECT { Q_OBJECT
public: public:
@ -22,6 +23,11 @@ public:
//关闭socket //关闭socket
bool close(); bool close();
//加入组播
bool joinMulticast();
//获取发送者的IP及端口号
QPair<QString, quint16> getSenderIPSetting();
signals: signals:
//通过该信号传递接收到的数据 //通过该信号传递接收到的数据
void recvDataSignal(QString data); void recvDataSignal(QString data);
@ -31,11 +37,17 @@ public slots:
void on_readyReadData(); void on_readyReadData();
private: private:
QUdpSocket* m_sock; //UDP套接字指针 QUdpSocket* m_sock{nullptr}; //UDP套接字指针
QHostAddress m_hostAddr; //保存目标的地址对象 QHostAddress m_hostAddr; //保存目标的地址对象
quint16 m_port; //保存目标的端口号(类型一致) quint16 m_port{0}; //保存目标的端口号(类型一致)
QString m_localIP{""}; //本地IP
QHostAddress m_localAddr; //保存本地的地址对象
quint16 m_localPort{0}; //保存本地的端口号(类型一致)
bool isSocketBind{false}; //数据绑定成功or失败 QHostAddress senderIP; //发送者IP
quint16 senderPort{0}; //发送者端口号
bool isSocketBind{false}; //数据绑定成功or失败
}; };
#endif #endif
Loading…
Cancel
Save