209 lines
5.8 KiB
Plaintext
209 lines
5.8 KiB
Plaintext
#include "tcpclient.h"
|
|
#include <QDataStream>
|
|
#include "datatype.h"
|
|
#include <QDebug>
|
|
TcpClient::TcpClient(QObject * parent):QObject (parent)
|
|
{
|
|
connect(&m_TcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadMessage()));
|
|
connect(&m_TcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
|
|
// 设置接收缓冲区大小
|
|
int receiveBufferSize = 1024 * 1024; // 1MB
|
|
m_TcpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, receiveBufferSize);
|
|
}
|
|
TcpClient::~TcpClient()
|
|
{
|
|
|
|
disConnectServer();
|
|
m_isConnected = false;
|
|
|
|
}
|
|
bool TcpClient::disConnectServer()
|
|
{
|
|
if (m_TcpSocket.state() == QAbstractSocket::ConnectedState || m_TcpSocket.state() == QAbstractSocket::ConnectingState)
|
|
{
|
|
qDebug() << "Disconnecting from server...";
|
|
m_TcpSocket.disconnectFromHost();
|
|
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "Already disconnected or not connected.";
|
|
|
|
}
|
|
m_isConnected = false;
|
|
qDebug()<<"state"<<m_TcpSocket.state()<<endl;
|
|
return m_TcpSocket.state() == QAbstractSocket::UnconnectedState;
|
|
|
|
}
|
|
|
|
bool TcpClient::connectServer(QString ip ,qint16 port)
|
|
{
|
|
|
|
//直接读取状态,如果连接正常,则直接返回
|
|
if(m_TcpSocket.state()== QAbstractSocket::ConnectedState)
|
|
{
|
|
if(m_TcpSocket.isValid())
|
|
{
|
|
m_isConnected = true;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
m_isConnected = false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//尝试连接
|
|
m_TcpSocket.abort();//取消原有连接
|
|
m_TcpSocket.connectToHost(ip,port);
|
|
if(m_TcpSocket.waitForConnected(1000))
|
|
{
|
|
m_isConnected = true;
|
|
}
|
|
else
|
|
{
|
|
m_isConnected = false;
|
|
}
|
|
|
|
return m_isConnected;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TcpClient::sendMessage(QByteArray & data)
|
|
{
|
|
|
|
if(!m_isConnected)
|
|
{
|
|
return false;
|
|
}
|
|
//分包发送
|
|
const int PayloadSize = 64*1024;//一个帧数据包大小
|
|
int totalSize = data.size();
|
|
int bytesWritten = 0;
|
|
int bytesToWrite = totalSize;
|
|
while(bytesWritten<totalSize)
|
|
{
|
|
int startIdx = bytesWritten;
|
|
int length = std::min(PayloadSize,bytesToWrite);
|
|
if(startIdx+length>totalSize)
|
|
return false;
|
|
|
|
QByteArray smallBlock = data.mid(startIdx,length);
|
|
qint64 written = m_TcpSocket.write(smallBlock);
|
|
bool success = m_TcpSocket.waitForBytesWritten();
|
|
|
|
if(!success)//发送失败包时,停止发送
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bytesWritten+=written;
|
|
bytesToWrite-=written;
|
|
}
|
|
m_TcpSocket.flush();
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
QByteArray TcpClient::GetData()
|
|
{
|
|
|
|
return QByteArray();
|
|
}
|
|
void TcpClient::slotTestReadMessage()
|
|
{
|
|
|
|
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
|
m_msgArray.append(temp_BtyeArray );
|
|
//数据头大小为23个字节
|
|
//数据块长度192或者6
|
|
//剩余部分5
|
|
while(!m_msgArray.isEmpty())
|
|
{
|
|
qint32 allSize = m_msgArray.size();
|
|
//数据头不够
|
|
if (allSize < 23)
|
|
{
|
|
qDebug()<<"sizeRcre"<<temp_BtyeArray<<endl;
|
|
return;
|
|
}
|
|
DataPacket dataRec;
|
|
dataRec.deserializeHeader(m_msgArray);
|
|
//数据总数不够
|
|
qint32 dataLength = dataRec.dataLength+23+5;
|
|
if(dataRec.dataLength+23+5 >allSize )
|
|
{
|
|
qDebug()<<"datalength:"<<dataRec.dataLength<<temp_BtyeArray<<endl;
|
|
return ;
|
|
}
|
|
dataRec.deserialize(m_msgArray);
|
|
QByteArray readContent = m_msgArray.left(dataLength);
|
|
m_msgArray.remove(0, dataLength);
|
|
emit SigRectMsg(readContent);
|
|
}
|
|
|
|
}
|
|
void TcpClient::slotReadMessage()
|
|
{
|
|
qDebug()<<m_msgArray.size()<<endl;
|
|
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
|
qDebug()<<temp_BtyeArray.size()<<endl;
|
|
m_msgArray.append(temp_BtyeArray );
|
|
quint8 frameHeader; // 帧头 (1 byte)
|
|
quint32 packetSeq; // 包序号 (4 bytes)
|
|
quint16 dataLength; // 数据块长度 (2 bytes)
|
|
quint8 batteryLevel; // 电量 (1 byte)
|
|
quint8 channelCount; // 通道数量 (1 byte)
|
|
qint16 pitchAngle; // 俯仰角 (2 bytes)
|
|
qint16 rollAngle; // 滚动角 (2 bytes)
|
|
qint16 yawAngle; // 偏航角 (2 bytes)
|
|
quint16 ecg; // 心电 (2 bytes)
|
|
quint16 spo2; // 血氧 (2 bytes)
|
|
quint8 reserved1; // 预留1 (1 byte)
|
|
quint8 reserved2; // 预留2 (1 byte)
|
|
quint8 reserved3; // 预留3 (1 byte)
|
|
quint8 reserved4; // 预留4 (1 byte)
|
|
|
|
QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes)
|
|
quint8 syncSource; // 同步触发源 (1 byte)
|
|
quint8 syncSeq; // 同步触发序号 (1 byte)
|
|
quint8 checksum; // 校验和 (1 byte)
|
|
quint16 packetTail; // 包尾 (2 bytes)
|
|
|
|
|
|
QDataStream in(m_msgArray);
|
|
in.setVersion(QDataStream::Qt_5_13);
|
|
|
|
|
|
|
|
in >>frameHeader>>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
|
|
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
|
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
|
qDebug()<<"---:"<<dataLength<<endl;
|
|
dataBlock.resize(dataLength);
|
|
in.readRawData(dataBlock.data(), dataLength);
|
|
|
|
in >> syncSource >> syncSeq;
|
|
|
|
in >> checksum;
|
|
|
|
in >> packetTail;
|
|
qDebug()<<"getdataLength:"<<dataLength<<endl;
|
|
m_msgArray.remove(0, dataLength+23+5);
|
|
}
|
|
|
|
|
|
void TcpClient::slotDisconnected()
|
|
{
|
|
disConnectServer();
|
|
}
|
|
void TcpClient::slotSendMessage(QByteArray & data)
|
|
{
|
|
sendMessage(data);
|
|
}
|