Verwendung von TCP/UDP von QT zur Übertragung von Bilddaten auf ARM

Kommunizieren Sie im Allgemeinen im selben LAN-Segment.

  1. Verwendung von qts TCP zur Implementierung der Bildübertragung auf dem Arm

Im Allgemeinen wird das ARM-Gerät als Client verwendet und es muss nur ein TCP-Client implementiert werden. Nehmen Sie dann die Bilddaten, kodieren Sie sie gemäß JPEG und übertragen Sie sie per Streaming.

Verbindung herstellen:

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);//填写服务器的地址

Sie können den Verbindungsstatus überwachen und die Verbindung wiederherstellen, wenn die Verbindung getrennt wird:

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

Daten senden:

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

Bilddaten senden:

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();
}

Der Signalsteckplatz wurde zuvor eingerichtet und wird automatisch gelesen, wenn Daten vorhanden sind. Wenn ein Foto\r\n empfangen wird, wird das Fotoflag auf 1 gesetzt und die Bilddaten werden gesendet:

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. Verwendung von qts udp zur Implementierung der Bildübertragung auf dem Arm

UDP unterscheidet nicht zwischen Client und Server. Sie können direkt zwei Sockets zum Senden und Empfangen erstellen. Es ist auch möglich, einen zu teilen. Ich persönlich bevorzuge es, sie separat zu schreiben, um sie klarer zu machen.

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);

Daten senden:

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

Um Bilddaten zu versenden, können die Daten natürlich auch in Paketen übertragen werden:

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();
}

Empfange Daten:

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;
        }        
    }
}

Supongo que te gusta

Origin blog.csdn.net/huntenganwei/article/details/128655991
Recomendado
Clasificación