通讯中间件(一)

通讯中间件

最近做的一个小项目是通讯中间件,一端与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的组播形式)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值