在ARM上使用QT的TCP/UDP实现图像数据传输

一般在同一局域网段进行通信。

  1. 在arm上使用qt的tcp实现图传

一般将arm设备当做客户端,只需要实现一个tcp的客户端即可。然后取图像数据,按照jpeg编码,通过流传输。

建立连接:

const QString IP = "192.168.3.99";//目标地址
const int PORT = 1000;
socket = new QTcpSocket();
//连接信号槽
QObject::connect(socket, &QTcpSocket::readyRead, this, &camera::socket_Read_Data);
//取消已有的连接
socket->abort();
//连接服务器
socket->connectToHost(IP, PORT);//填写服务器的地址

可以监测连接状态,断开连接的话再次连接:

if(socket->state()!= QAbstractSocket::ConnectedState)
{
    socket->connectToHost(IP, PORT);//填写服务器的地址
}

发送数据:

socket->write(QByteArray);//这里可以填QByteArray或者char[]都行
socket->flush();

发送图像数据:

if(photo == 1)
{
    QImage *mage = new QImage(rgb,640,480,QImage::Format_RGB888);//填入rgb数据即可
    QByteArray ba;
    QBuffer buf(&ba); //把ba绑定到buf上,操作buf就等于操作ba
    mage->save(&buf,"jpg",60);//压缩质量60
    //先写大小过去,告诉主机我们要传输的数据有多大
    socket->write(QString(size=%1").arg(ba.size()).toLocal8Bit().data());
    socket->waitForReadyRead();//等待主机响应“ok”,可有可无
    socket->write(ba);//把图像数据写入传输给主机,这里使用的流传输,由TCP自动控制速率
    socket->flush();
}

前面已经建立了信号槽,有数据时会自动读取,这里当接收到photo\r\n时,将photo标志置1,发送图片数据:

void socket_Read_Data()
{
    QByteArray buffer;
    //读取缓冲区数据
    buffer = socket->readAll();
    if(!buffer.isEmpty())
    {
        QString str;
        str+=tr(buffer);
        qDebug() << "Receive: " << tr(buffer);
        if(tr(buffer) == tr("photo\r\n"))
        {
            photo = 1;
        }
    }
}

  1. 在arm上使用qt的udp实现图传

udp不区分客户端和服务器端,直接建立收发二个socket即可,共用一个也是行的,个人比较喜欢分开写,看着较清晰。

const QString IP = "192.168.3.99";//目标地址
//读写端口也可以一致
const int readport = 1001;
const int writeport = 1002;

//读,绑定读取本地端口
readsocket = new QUdpSocket();
readsocket->bind(readport);
//写
writesocket = new QUdpSocket();

//连接信号槽
QObject::connect(readsocket, &QUdpSocket::readyRead, this, &camera::socket_Read_Data);

发送数据:

char st[10] = "hello";
writesocket->writeDatagram(st, strlen[st], QHostAddress(IP), writeport);

发送图像数据,当然也可以把数据分包传输:

if(photo == 1)
{
    QImage *mage = new QImage(rgb,640,480,QImage::Format_RGB888);
    QByteArray ba;
    QBuffer buf(&ba); //把ba绑定到buf上,操作buf就等于操作ba
    mage->save(&buf,"jpg",60);
    writesocket->writeDatagram(ba.data(), ba.size(), QHostAddress(IP), writeport);
    writesocket->flush();
}

接收数据:

void camera::socket_Read_Data()
{
    if(readsocket->hasPendingDatagrams()) 
    {
        QByteArray datagram;
        datagram.resize(readsocket->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;

        readsocket->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);
        qDebug() << "sender: " << sender.toString();//数据发送方IP
        qDebug() << "senderPort: " << senderPort;//数据发送方PORT
        qDebug() << "datagram: " << tr(datagram);//接收数据

        if(tr(datagram) == tr("photo\r\n"))
        {
            photo = 1;
        }        
    }
}

猜你喜欢

转载自blog.csdn.net/huntenganwei/article/details/128655991