通讯中间件
最近做的一个小项目是通讯中间件,一端与ERP/MES对接,一端与机台工作软件对接。通讯中间件的目的在于,工作软件不需要支持多种协议即可与ERP/MES进行数据交互。换句话说就是工作软件只需要支持一种通讯协议,能够与中间件进行交互即可,其它的交给中间件,不需要理会ERP/MES端支持哪种协议。目前我的中间件支持UDP,TCP,Modbus-Tcp,Opc-Ua四种通讯协议。(以下内容如有错误,还望指正!)
UDP
今天先记录UDP通讯的代码和注意事项。
UDP的通讯很简单,服务端与客户端之间不需要建立连接,相互之间都是只管发出数据。如果你的服务端和客户端不需要接收数据,只想发数据,那么你不需要绑定IP地址和端口,否则你需要先绑定一个IP地址和端口号。
//初始化
m_pUdpDevice = new QUdpSocket(this);
if(!m_pUdpDevice->bind(QHostAddress::AnyIPv4,ipPort.toInt()))
{
//绑定失败
return false;
}
connect(m_pUdpDevice,SIGNAL(readyRead()),this,SLOT(UdpSlotReadyRead()));
connect(m_pUdpDevice,SIGNAL(disconnected()),this,SLOT(UdpSlotStateChange()));
//接收数据
void UdpContact::UdpSlotReadyRead()
{
while(m_pUdpDevice->hasPendingDatagrams())
{
qint64 datagramSize = m_pUdpDevice->pendingDatagramSize();
QByteArray buf(datagramSize,0);
m_pUdpDevice->readDatagram(buf.data(),buf.size());
qDebug()<<buf;
}
}
//发送数据包
bool UdpContact::sendPacket(int iMchType,QByteArray array,bool bChange)
{
Q_UNUSED(iMchType);
Q_UNUSED(bChange);
if (m_bConnect && m_pUdpDevice != NULL)
{
int index = m_strIPAddressPort.indexOf(":");
QString ipAddress = m_strIPAddressPort.left(index);
QString ipPort = m_strIPAddressPort.right(m_strIPAddressPort.length() - (index+1));
if (m_pUdpDevice->writeDatagram(array,QHostAddress(ipAddress),ipPort.toInt()) == -1)
{
return false;
}
return true;
}
return false;
}
总结
QT的UDP模块真的是非常简单好用,发送数据包时填入IP地址跟端口即可。如果要接收数据,要先进行绑定IP地址与端口。这里只是介绍UDP的简单通讯,后面有时间再介绍一个聊天程序(采用UDP的组播形式)。
1万+

被折叠的 条评论
为什么被折叠?



