这篇文章以UDP通信为例进行介绍。UDP比较简单,在windows上用的挺多。
QQt版本v2.1.7.0
QQt通讯模组
QQt通讯模组分为三个部分,通讯接口,通讯协议,通讯报文。
大多数的工作都集中在通讯协议部分,通讯报文是通讯的数据包。
QQtSocketUdpClient
它负责在硬件上通信。客户端服务器都用这个类,服务器bind本地端口一下,其他相同使用方法。太简单了。
需要安装QQtUdpProtocol进行使用。
QQtUdpProtocol
它是重点,用它可以直接发送报文,接收报文。
用户主要实现的就是这个类的子类。
在此以一个检测系统的系统协议进行讲解。
通信有多个Client
在继承下来的类当中,这样处理,和多个客户端通信的时候的客户端连接。
重点在于这个Protocol,只有一个。
CedianUdpProtocol *cedianUdpServer(QObject *parent)
{
static CedianUdpServer* s0[9] = {
NULL};
static CedianUdpProtocol* p0 = NULL;
if(!s0[0] && !p0)
{
p0 = new CedianUdpProtocol(parent);
for(int i =0; i < 9; i++)
{
int port = cedianUdpPort(i+1);
pline() << i+1 << port;
s0[i] = new CedianUdpServer(parent);
/*通讯端口:绑定本地端口*/
s0[i]->bind(port);
/*通讯端口:给测点协议*/
s0[i]->installProtocol(p0);
}
}
return p0;
}
收到消息
重载dispatcher函数咯,在父类当中介绍了。
bool CedianUdpProtocol::dispatcher(const QNetworkDatagram & dg)
{
mDG = dg;
mAddress = dg.senderAddress();
mPort = dg.senderPort();
mLocalPort = dg.destinationPort();
QByteArray data = dg.data();
mMsg.parser(data);
emit msgIncoming();
}
获取收到的消息
你看到发的信号吗?在哪里进行收取。需要什么信息,就把什么信息保存在局部变量里,通过函数公开出来。
那个mMsg是什么?它是通讯模组的第三个重点。数据报。
QQtMessage
这个类真的是老生常谈,到哪里都是它。
它里面就两个函数,
packer,把要发送的打包到QByteArray里。
parser,把收到的解压到局部变量中。程序中总是用这些局部变量。
其实还有一个打印函数,可以打印数据报的报文。
QDebug operator<<(QDebug dbg, const CedianUdpMessage &c)
{
// dbg.nospace() << "{" << hex << c.head() << "|" <<
// hex << c.size() << "=" << dec << c.size() << "|" <<
// hex << c.cmd() << "|" <<
// hex << c.uid() << "|" <<
// c.data().data() << "@" << dec << c.data().size() << "|" <<
// hex << c.sum() << "|" <<
// hex <<