#include "tcpsocket.h"
#include <QFile>
#include <QDir>
#include<QJsonObject>
#include<QJsonDocument>//json
#include<QJsonArray>
QList <_DtuList> g_Dtus;
extern bool g_send9101;
extern bool g_send9102;
// 短整型大小端互换
#define BigLittleSwap16(A) ((((ushort)(A) & 0xff00) >> 8) | (((ushort)(A) & 0x00ff) << 8))
// 长整型大小端互换
#define BigLittleSwap32(A) ((((uint)(A) & 0xff000000) >> 24) | (((uint)(A) & 0x00ff0000) >> 8) | (((uint)(A) & 0x0000ff00) << 8) | (((uint)(A) & 0x000000ff) << 24))
TcpSocket::TcpSocket(QObject *parent)
: QTcpSocket (parent)
, m_type(0)
{
bStartFile=false;
m_packHeadlen=0;
//m_filelenGet=m_filelen=0;
//m_packlenGet=m_packlen=0;
connect(this, SIGNAL(readyRead()), this, SLOT(recvData()));
tmrKeepAlive = new QTimer(this);
tmrKeepAlive->setInterval(60000);
tmrKeepAlive->setSingleShot(true);
tmrKeepAlive->start();
connect(tmrKeepAlive, SIGNAL(timeout()), this, SLOT(tmrKeepAliveTimeout()));//关联心跳包定时处理函数
// connect(this, &QTcpSocket::readyRead, [this](){
// while (this->bytesAvailable() > 0)
// {
// int length = this->bytesAvailable();
// QByteArray data;
// data.resize(length);
// this->read(data.data(), length); // 接受sock数据
// QString strReadData = QString::number(this->socketDescriptor()) + " " + data;
// emit emit_updateClients(strReadData, strReadData.length());
// // for循环是为了模拟,大批量数据处理
// for(int index = 0; index < 1000000; ++index)
// {
// }
// QString strMsg = "Recv Success";
// this->write(strMsg.toStdString().c_str(), strMsg.length()); // 给client客户端返回接收情况
// }
// });
// 调用销毁信号,但是看实际情况,调用这个的时候就销毁了,会导致获取到的描述符为-1, 但是不会影响到其他地方
connect(this, &QTcpSocket::disconnected, [this](){
if(m_type==1)
{
for(int i=0;i<g_Dtus.size();i++)
{
if(g_Dtus.at(i).s==this)
{
g_Dtus.removeAt(i);
break;
}
}
emit signal_line(m_msgHead,false); // 获取socket描述符
}
qDebug() << this->socketDescriptor();
//emit dataReady(m_msgHead,QByteArray(),false);
});
}
void removezero(char *s)
{
for(int i=0;i<strlen(s);i++)
{
if(s[i]>'0')
{
if(i>0)
strcpy(s,s+i);
return;
}
}
}
extern void BCDtochar(const char *bcd,char *s,int len);
void chartoBCD(const char *s,char *bcd,int len)
{
if(len%2!=0)return;
for(int i=0;i<len;i+=2)
{
bcd[i/2]=(((s[i]-0x30)<<4) & 0xF0) + ((s[i+1]-0x30) & 0x0F);
}
}
static ushort g_msgi=0;
void TcpSocket::sendDsmDown1(_msgHead msgh,_DSM_alarm dsm)
{
this->flush();
msgh.msgID=BigLittleSwap16(0x9208);
QString ip="192.168.191.1";//不能用127.0.0.1
int iplen=ip.length();
msgh.msgtype=BigLittleSwap16(iplen+69);//XXX
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
buf.append((char)iplen);
buf.append(ip.toLatin1());
ushort port=BigLittleSwap16(7001);
buf.append((char *)&port, 2);
buf.append((char *)&port, 2);
buf.append((char *)&dsm.tag, 16);//报警标识号定义见表 4-16
char phone[13];
BCDtochar(msgh.phone, phone,6);
phone[12]=0;
removezero(phone);//XXX
char datet[13];
BCDtochar(dsm.dt, datet,6);
datet[12]=0;
QString sDsmID = QString("%1-20%2-%3").arg(phone).arg(datet).arg(123456);
sDsmID = sDsmID.left(32);
buf.append(sDsmID.toLatin1());//平台给报警分配的唯一编号
buf.append(16,(char)0);//预留
send7e7d(buf);
}
void TcpSocket::sendDsmDownDone(_msgHead msgh,char *data)
{
msgh.msgID=BigLittleSwap16(0x9212);
int datalen=data[0]+4;
msgh.msgtype=BigLittleSwap16(datalen);//XXX
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
data[datalen-1]=0;
data[datalen-2]=0;
buf.append(data, datalen);
send7e7d(buf);
}
void TcpSocket::sendGeneralReply(_msgHead msgh)
{
ushort msgID=msgh.msgID;
ushort msgi=msgh.msgi;
msgh.msgID=BigLittleSwap16(0x8001);
msgh.msgtype=BigLittleSwap16(0x0005);
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
buf.append((char *)&msgi, 2);
buf.append((char *)&msgID, 2);
buf.append((char)0x00);//结果
send7e7d(buf);
}
void TcpSocket::send9101(_msgHead msgh)
{
msgh.msgID=BigLittleSwap16(0x9101);
QString ip="172.16.35.240";
int iplen=ip.length();
msgh.msgtype=BigLittleSwap16(iplen+8);//XXX
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
buf.append((char)iplen);
buf.append(ip.toLatin1());
ushort port=BigLittleSwap16(6027);//17000
buf.append((char *)&port, 2);
buf.append((char *)&port, 2);
buf.append((char)1);//结果
buf.append((char)1);//结果
buf.append((char)0);//结果
send7e7d(buf);
}
void TcpSocket::send9102(_msgHead msgh)
{
msgh.msgID=BigLittleSwap16(0x9102);
msgh.msgtype=BigLittleSwap16(4);
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
buf.append((char)1);//结果
buf.append((char)0);//结果
buf.append((char)0);//结果
buf.append((char)1);//结果
send7e7d(buf);
}
void TcpSocket::sendhttpdata(QByteArray &buf,TcpSocket *pSocket)
{
ushort msgi=BigLittleSwap16(g_msgi);
memcpy(buf.data()+10,&msgi,2);
send7e7d(buf,pSocket);
}
void TcpSocket::sendRegisterReply(_msgHead msgh)
{
ushort msgi=msgh.msgi;
msgh.msgID=BigLittleSwap16(0x8100);
msgh.msgtype=BigLittleSwap16(0x0007);
g_msgi++;
msgh.msgi=BigLittleSwap16(g_msgi);
QByteArray buf;
buf.append((char *)&msgh, 12);
buf.append((char *)&msgi, 2);
buf.append((char)0x00);//结果
//int iRegister=1234;
QString sRegister="1234";//QString("%1").arg()
buf.append(sRegister);//鉴权码
send7e7d(buf);
}
void TcpSocket::send7e7d(QByteArray &buf,TcpSocket *pSocket)
{
QByteArray buf1;
buf1.append((char)0x7E);
char xor1=0;
for(int i=0;i<buf.length();i++)
{
char c = buf.at(i);
xor1^=c;
if(c==0x7E || c==0x7D)
{
buf1.append(0x7D);
buf1.append((c==0x7E)?0x02:0x01);
}
else
buf1.append(c);
}
char c = xor1;
if(c==0x7E || c==0x7D)
{
buf1.append(0x7D);
buf1.append((c==0x7E)?0x02:0x01);
}
else
buf1.append(c);
buf1.append((char)0x7E);
qDebug()<<buf1.toHex();
pSocket->write(buf1);
}
void TcpSocket::send7e7d(QByteArray &buf)
{
QByteArray buf1;
buf1.append((char)0x7E);
char xor1=0;
for(int i=0;i<buf.length();i++)
{
char c = buf.at(i);
xor1^=c;
if(c==0x7E || c==0x7D)
{
buf1.append(0x7D);
buf1.append((c==0x7E)?0x02:0x01);
}
else
buf1.append(c);
}
char c = xor1;
if(c==0x7E || c==0x7D)
{
buf1.append(0x7D);
buf1.append((c==0x7E)?0x02:0x01);
}
else
buf1.append(c);
buf1.append((char)0x7E);
this->write(buf1);
}
QByteArray HexStringToByteArray(QByteArray &buf)
评论0