通常、同じ LAN セグメント上で通信します。
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;
}
}
}
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;
}
}
}