QT の TCP/UDP を使用して ARM 上で画像データを転送する

通常、同じ LAN セグメント上で通信します。

  1. qtのtcpを利用してarm上で画像送信を実装する

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

信号スロットは事前に確立されており、データがあると自動的に読み取られます。写真\r\n を受信すると、写真フラグが 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. qtのudpを使ってarm上で画像送信を実装する

UDP ではクライアントとサーバーの区別がありません。送受信用のソケットを 2 つ直接作成できます。また、1 つを共有することもできます。個人的には、明確にするために別々に記述することを好みます。

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