一般在同一局域网段进行通信。
在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;
}
}
}
在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;
}
}
}