qt/LedOK/communication/network.cpp
2022-01-20 10:08:17 +08:00

902 lines
37 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "network.h"
#include <QMessageBox>
#include <QTime>
#include "string"
#include <QJsonValue>
#include <QJsonObject>
#include <QJsonDocument>
#include "LoUIClass/x_uimsgboxokcancel.h"
NetComm::NetComm(QObject *p) :
QObject(p)
{
//创建UDP查询定时器首次打开界面获取知道控制卡接入查找到控制卡
m_pUdpTimer = new QTimer(this);
connect(m_pUdpTimer,SIGNAL(timeout()),this,SLOT(onUdpTimeout()));
m_pGetSpecifyIpTimer=new QTimer(this);
connect(m_pGetSpecifyIpTimer,SIGNAL(timeout()),this,SLOT(onSpecifyIpTimeout()));
//创建HTTP对象
pHpptClient = new HpptClient(this);
connect(pHpptClient,SIGNAL(httpGetRspReady(QString , QByteArray )),this,SLOT(OnProHttpGetResponse(QString , QByteArray)));
//创建httpGet定时器
//创建UDP套接字
// qDebug() << "udpSocket connect udpRecveive";
udpSocket = new QUdpSocket(this);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(UdpRecveive()));
//界面启动第一次查询后面使用DUP定时器查询
}
NetComm::~NetComm()
{
if(m_pUdpTimer->isActive())
{
m_pUdpTimer->stop();
}
m_pUdpTimer->deleteLater();
if(m_pGetSpecifyIpTimer->isActive())
{
m_pGetSpecifyIpTimer->stop();
}
m_pGetSpecifyIpTimer->deleteLater();
delete udpSocket;
if(pHpptClient != nullptr)
{
qDebug() <<"delete pHpptClient in ~NetComm";
delete pHpptClient;
pHpptClient=nullptr;
}
}
void NetComm::StartUpdCheck()
{
CheckControllersInLanByUdp255Cmd();
CheckControllersInLanByUdpSelfBroadcastCmd();
//CheckControllersInLanByUdpCmd();
m_pUdpTimer->start(m_UdpTimerInterval);
}
void NetComm::StopUpdCheck()
{
if(m_pUdpTimer!=nullptr)
if(m_pUdpTimer->isActive())
m_pUdpTimer->stop();
}
void NetComm::StopAllCheck()
{
m_iEnableQuitFlag=1;
if(m_pUdpTimer!=nullptr)
if(m_pUdpTimer->isActive())
m_pUdpTimer->stop();
if(m_pHttpGetTimer!=nullptr)
if(m_pHttpGetTimer->isActive())
m_pHttpGetTimer->stop();
if(m_pGetSpecifyIpTimer!=nullptr)
if(m_pGetSpecifyIpTimer->isActive())
m_pGetSpecifyIpTimer->stop();
}
void NetComm::onUdpTimeout()
{
CheckControllersInLanByUdp255Cmd();
CheckControllersInLanByUdpSelfBroadcastCmd();
//CheckControllersInLanByUdpCmd();
}
void NetComm::UdpRecveive()
{
// qDebug() << "NetComm func:" << "UdpRecveive";
QByteArray ba;
while(udpSocket->hasPendingDatagrams())
{
if(m_iEnableQuitFlag==1)
return;
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress qhostaddress;
quint16 recPort = 0;
udpSocket->readDatagram(datagram.data(),datagram.size(),&qhostaddress,&recPort);
if(m_iEnableQuitFlag==1)
return;
// qDebug() << "NetComm func:" << "readDatagram";
QString msg=datagram.data();
STREAM_PACKET *pStreamPacket=(STREAM_PACKET *)datagram.data();
if(pStreamPacket->ucCommType==NET_COMMU_TYPE_SYSTEM_BROADCAST_ANSWER)
{
QString strtempCardId=pStreamPacket->ucSerialCode;
QHostAddress temp;
temp.setAddress(qhostaddress.toIPv4Address());
QString strtempCardIp=temp.toString();
JieXiQJsonObjectOfLedCardInfoOld(strtempCardId,strtempCardIp);
// HttpGetFuncByPort("deviceList?fromDetector=true",strtempCardIp);
}
else//杨作栋增加的udp查询命令应答应答中包含jsonObject
{
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(datagram,&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
if(datagram.size()==0)
qDebug()<<"json is empty";
else
qDebug()<<tr("wDevicesItem OnProHttpResponse 解析json文件错误");
return;
}
QJsonObject jsonObject = document.object();
QHostAddress temp;
temp.setAddress(qhostaddress.toIPv4Address());
QString strtempCardIp=temp.toString();
JieXiQJsonObjectOfLedCardInfo(jsonObject,strtempCardIp);
}
}
// qDebug() << "NetComm func:" << "UdpRecveive end";
}
//在该ip的3000端口get方法deviceList可以一次性获取到局域网中设备列表的详细信息
//int ddddd=0;
void NetComm::HttpGetFuncByPort(QString strFunc,QString strIp)
{
// if(ddddd==0)
// {
m_strUrl="http://"+strIp+":3000/"+strFunc;
pHpptClient->httpGet(m_strUrl);
qDebug() << "HttpGetFuncByPort" << m_strUrl;
// ddddd=1;
// }
}
void NetComm::CheckSpecifyIpRange(QString strFromIp,QString strToIp)
{
Q_UNUSED(strFromIp)
Q_UNUSED(strToIp)
qDebug() <<"HttpGetFuncFromIpRange:" << "this func not finished";
}
void NetComm::CheckSpecifyIp(QString strIp)
{
m_strCurSpecifyIp=strIp;
qDebug() <<"CheckSpecifyIp:";
HttpGetFuncByPort("deviceList?fromDetector=true",strIp);
m_pGetSpecifyIpTimer->start(1000);
//发送3次都收不到应答怎标识超时
//启动定时器如果3秒内找不到超时提示没有搜索到
}
void NetComm::onSpecifyIpTimeout()
{
if(m_intSpecifyIpGetNumber < 3)
{
m_intSpecifyIpGetNumber++;
HttpGetFuncByPort("deviceList?fromDetector=true",m_strCurSpecifyIp);
}else {
qDebug() <<"onSpecifyIpTimeout:";
emit sigGetSpecifyIpTimerOut();
m_pGetSpecifyIpTimer->stop();
m_intSpecifyIpGetNumber=0;
m_strCurSpecifyIp="";
}
}
/*************************************
* 获取本机 IPV4 地址,如果有多个,返回所有
* 有效的IPV4地址
**************************************/
QHostAddress NetComm::getHostIPV4Address()
{
foreach(const QHostAddress& hostAddress,QNetworkInterface::allAddresses())
if ( hostAddress != QHostAddress::LocalHost && hostAddress.toIPv4Address() )
return hostAddress;
return QHostAddress::LocalHost;
}
STREAM_PACKET NetComm::LedOkMakeStreamPacket(int iComType,int iLen,unsigned char *ucBuf,QString str)
{
STREAM_PACKET Temp;
memset(&Temp,0x00,sizeof(STREAM_PACKET));
if(iLen>2048)
return Temp;
memset(Temp.SyncHead,STREAM_SYNC_HEAD,STREAM_SYNC_HEAD_NUM);
memset(Temp.ucSerialCode,0x00,20);
char* ch;
QByteArray ba = str.toLatin1(); // must
ch=ba.data();
memcpy(Temp.ucSerialCode,ch,ba.size());
Temp.iLength=iLen;
Temp.ucCommType=iComType;
memcpy(Temp.pDataBuffer,ucBuf,iLen);
Temp.pDataBuffer[Temp.iLength]=
GetCheckCodeIn8(&Temp.ucCommType,Temp.iLength+sizeof(Temp.ucCommType)+sizeof(char)*20+sizeof(Temp.iLength));
return Temp;
}
//设备界面刷新按钮点击响应槽函数
void NetComm::CheckControllersInLanByUdpCmd()
{
// return; // qDebug() << "CheckControllersInLanByUdpCmd" ;
if(m_iEnableQuitFlag==1)
return;
QString strIpAddress;
SYSTIMER tempTimer;
memset(&tempTimer,0x00,sizeof(SYSTIMER));
QDateTime t=QDateTime::currentDateTime(); //获取系统日期
tempTimer.y=t.date().year(); //获取年份
tempTimer.m=t.date().month(); //获取当前月份
tempTimer.d=t.date().day(); //获得几号
tempTimer.h=t.time().hour(); //获取当前为几时
tempTimer.mm=t.time().minute(); //获取分钟
tempTimer.s=t.time().second(); //获取秒
tempTimer.w=1; //获取星期几注意1为星期天7为星期六
STREAM_PACKET tempStreadPacket=LedOkMakeStreamPacket(NET_COMMU_TYPE_SYSTEM_BROADCAST,sizeof(SYSTIMER),(unsigned char *)&tempTimer,"Broadcast!");
int iLenPacket=tempStreadPacket.iLength+sizeof(int)+STREAM_SYNC_HEAD_NUM*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
//UDP多网卡广播
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
{
if(m_iEnableQuitFlag==1)
return;
if(m_strDirectlyConnectNetworkName.isEmpty())
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
QHostAddress broadcastAddress("255.255.255.255");
// QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
if(udpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port) != iLenPacket)
{
qDebug() << strIpAddress<< "error" << "CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
qDebug() << strIpAddress << "send udp cmd1" ;
}
}
}
}
else {
//if(interfaces.humanReadableName()==m_strDirectlyConnectNetworkName)
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
QHostAddress broadcastAddress("255.255.255.255");
// QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
if(udpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port) != iLenPacket)
{
qDebug() << strIpAddress<< "error" << "m_strDirectlyConnectNetworkName CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
qDebug() << strIpAddress << "send udp cmd by cable network1" ;
}
}
}
}
}
}
}
void NetComm::CheckControllersInLanByUdp255Cmd()
{
if(m_iEnableQuitFlag==1)
return;
QString strIpAddress;
//UDP多网卡广播
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
{
if(m_iEnableQuitFlag==1)
return;
if(m_strDirectlyConnectNetworkName.isEmpty())//如果网线直连
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
//QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
QHostAddress broadcastAddress("255.255.255.255");
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
QJsonObject login_json;
#ifdef MACRO_YUANHENG_VERSION
login_json.insert("action", "getCardInfo");//元亨
#else
login_json.insert("action", "getInfo");
#endif
QJsonDocument doc;
doc.setObject(login_json);
QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact);
int iLenPacket=post_loginArray.length();
if(udpSocket->writeDatagram((char *)post_loginArray.data(),iLenPacket,broadcastAddress,22222) != iLenPacket)
{
// qDebug() << strIpAddress<< "error" << "CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
// qDebug() << strIpAddress << "send udp cmd2" ;
}
}
}
}
else {
//if(interfaces.humanReadableName()==m_strDirectlyConnectNetworkName)
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
// QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
QHostAddress broadcastAddress("255.255.255.255");
broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
QJsonObject login_json;
#ifdef MACRO_YUANHENG_VERSION
login_json.insert("action", "getCardInfo");
#else
login_json.insert("action", "getInfo");
#endif
QJsonDocument doc;
doc.setObject(login_json);
QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact);
int iLenPacket=post_loginArray.length();
if(!udpSocket->bind(entry.ip()))
break;
if(udpSocket->writeDatagram((char *)post_loginArray.data(),iLenPacket,broadcastAddress,22222) != iLenPacket)
{
qDebug() << strIpAddress<< "error" << "m_strDirectlyConnectNetworkName CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
qDebug() << strIpAddress << "send udp cmd by cable network2" ;
}
}
}
}
}
}
}
void NetComm::CheckControllersInLanByUdpSelfBroadcastCmd()
{
if(m_iEnableQuitFlag==1)
return;
QString strIpAddress;
//UDP多网卡广播
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
{
if(m_iEnableQuitFlag==1)
return;
if(m_strDirectlyConnectNetworkName.isEmpty())//如果网线直连
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
QJsonObject login_json;
#ifdef MACRO_YUANHENG_VERSION
login_json.insert("action", "getCardInfo");
#else
login_json.insert("action", "getInfo");
#endif
QJsonDocument doc;
doc.setObject(login_json);
QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact);
int iLenPacket=post_loginArray.length();
if(udpSocket->writeDatagram((char *)post_loginArray.data(),iLenPacket,broadcastAddress,22222) != iLenPacket)
{
// qDebug() << strIpAddress<< "error" << "CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
// qDebug() << strIpAddress << "send udp cmd2" ;
}
}
}
}
else {
//if(interfaces.humanReadableName()==m_strDirectlyConnectNetworkName)
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
strIpAddress =entry.ip().toString();// broadcastAddress.toString();
QJsonObject login_json;
#ifdef MACRO_YUANHENG_VERSION
login_json.insert("action", "getCardInfo");
#else
login_json.insert("action", "getInfo");
#endif
QJsonDocument doc;
doc.setObject(login_json);
QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact);
int iLenPacket=post_loginArray.length();
if(!udpSocket->bind(entry.ip()))
break;
if(udpSocket->writeDatagram((char *)post_loginArray.data(),iLenPacket,broadcastAddress,22222) != iLenPacket)
{
qDebug() << strIpAddress<< "error" << "m_strDirectlyConnectNetworkName CheckControllersInLanByUdpCmd writedata fram error!";
// return;
}
else {
qDebug() << strIpAddress << "send udp cmd by cable network2" ;
}
}
}
}
}
}
}
//设备界面刷新按钮点击响应槽函数
void NetComm::RestoreLedCardIpByUdpCmdBefore(QString strNetworkName)
{
m_strDirectlyConnectNetworkName=strNetworkName;
}
void NetComm::RestoreLedCardIpToDhcpByUdpCmd()
{
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "SetEthernet");
json.insert("dhcp", true);
json.insert("ip", "0.255.255.255");
json.insert("gateWay", "0.255.255.255");
json.insert("netMask", "0.255.255.255");
json.insert("dns", "0.255.255.255");
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
{
if(m_iEnableQuitFlag==1)
return;
//if(interfaces.humanReadableName()==m_strDirectlyConnectNetworkName)
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
entry.setBroadcast(QHostAddress::Broadcast);
QHostAddress broadcastAddress("255.255.255.255");
{
qDebug() << "RestoreLedCardIpByUdpCmd" ;
entry.setBroadcast(QHostAddress::Broadcast);
RESTORE_IP stTempIp;
memset(&stTempIp,0x00,sizeof(RESTORE_IP));
QString strNew=entry.ip().toString();
int itempOffset = strNew.lastIndexOf(".");
for(int m=1;m<255;m++)
{
QString sstrNew=strNew.left(itempOffset)+QString::number(m);
QString m_strUrl="http://"+sstrNew+":2016/settings";
HttpPostByTypeJsonObject(pHpptClient,m_strUrl,json);
}
}
}
}
}
}
#include "LoUIClass/x_uimsgboxok.h"
void NetComm::RestoreLedCardIpByUdpCmd()
{
qDebug()<<"RestoreLedCardIpByUdpCmd";
if(m_iEnableQuitFlag==1)
return;
/*20201017 masked by alahover -s
qDebug() << "RestoreLedCardIpByUdpCmd" ;
QString strIpAddress;
RESTORE_IP stTempIp;
memset(&stTempIp,0x00,sizeof(RESTORE_IP));
QString strNew="192.168.0.200";
memcpy(stTempIp.cNewIp,strNew.toLatin1().data(),strNew.length());
QString strMask="255.255.255.0";
memcpy(stTempIp.cMask,strMask.toLatin1().data(),strMask.length());
QString strGateway="192.168.0.1";
memcpy(stTempIp.cGateway,strGateway.toLatin1().data(),strGateway.length());
memcpy(stTempIp.cDns,strGateway.toLatin1().data(),strGateway.length());
// QString strB="192.168.0.1";
// memcpy(stTempIp.cGateway,strGateway.toLatin1().data(),20);
// QString strLocalIp="192.168.0.88";
// memcpy(stTempIp.cLocalIp,strLocalIp.toLatin1().data(),20);
//STREAM_PACKET tempStreadPacket=LedOkMakeStreamPacket(COMMAND_ONLY_RESET_CARD_IP,sizeof(RESTORE_IP),(unsigned char *)&stTempIp,"Broadcast!");
STREAM_PACKET tempStreadPacket=LedOkMakeStreamPacket(COMMAND_ONLY_RESET_CARD_IP,80,(unsigned char *)&stTempIp,"Broadcast!");
int iLenPacket=tempStreadPacket.iLength+sizeof(int)+STREAM_SYNC_HEAD_NUM*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
QUdpSocket *tempUdpSocket= new QUdpSocket(this);
if(!tempUdpSocket->bind(QHostAddress("192.168.0.88")))
return;
QHostAddress broadcastAddress("255.255.255.255");
int iSendLength=tempUdpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port);
if( iSendLength != iLenPacket)
{
qDebug() << "error" << "RestoreLedCardIpByUdpCmd error!send restore led card ip by udp cmd";
return;
}
else {
strIpAddress ="192.168.0.88";// broadcastAddress.toString();
qDebug() << strIpAddress << "send restore led card ip by udp cmd" ;
}
tempUdpSocket->deleteLater();
*/
//UDP多网卡广播
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
{
if(m_iEnableQuitFlag==1)
return;
//if(interfaces.humanReadableName()==m_strDirectlyConnectNetworkName)
{
foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
{
if(m_iEnableQuitFlag==1)
return;
entry.setBroadcast(QHostAddress::Broadcast);
QHostAddress broadcastAddress("255.255.255.255");
// QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
{
//qDebug() << "RestoreLedCardIpByUdpCmd" ;
entry.setBroadcast(QHostAddress::Broadcast);
RESTORE_IP stTempIp;
memset(&stTempIp,0x00,sizeof(RESTORE_IP));
QString strNew=entry.ip().toString();
int itempOffset = strNew.lastIndexOf(".");
QString sstrNew=strNew.left(itempOffset)+".254";
if(sstrNew.length()<=20)
memcpy(stTempIp.cNewIp,sstrNew.toLatin1().data(),sstrNew.length());
QString strMask=entry.netmask().toString();
if(strMask.length()<=20)
memcpy(stTempIp.cMask,strMask.toLatin1().data(),strMask.length());
QString strGateway=entry.ip().toString();
if(strGateway.length()<=20)
memcpy(stTempIp.cGateway,strGateway.toLatin1().data(),strGateway.length());
if(strGateway.length()<=20)
memcpy(stTempIp.cDns,strGateway.toLatin1().data(),strGateway.length());
STREAM_PACKET tempStreadPacket=LedOkMakeStreamPacket(COMMAND_ONLY_RESET_CARD_IP,80,(unsigned char *)&stTempIp,"Broadcast!");
int iLenPacket=tempStreadPacket.iLength+sizeof(int)+STREAM_SYNC_HEAD_NUM*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
QUdpSocket *tempUdpSocket= new QUdpSocket(this);
if(!tempUdpSocket->bind(entry.ip()))
break;
int iSendLength=tempUdpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port);
if( iSendLength != iLenPacket)
{
// qDebug() << "error" << "RestoreLedCardIpByUdpCmd error!send restore led card ip by udp cmd";
// // return;
}
else {
// strIpAddress =entry.ip().toString();// broadcastAddress.toString();
// qDebug() << strIpAddress << "send restore led card ip by udp cmd" ;
}
//tempUdpSocket->deleteLater();
}
}
}
}
}
void NetComm::RestoreLedCardIpToDhcpByUdpCmd(QString)
{
if(m_iEnableQuitFlag==1)
return;
QString strIpAddress;
char cTemp[20];
memset(cTemp,0x00,20);
// QString strLocalIp="192.168.0.88";
// memcpy(cTemp,strLocalIp.toLatin1().data(),20);
STREAM_PACKET tempStreadPacket=LedOkMakeStreamPacket(COMMAND_ONLY_RESET_CARD_IP,20,(unsigned char *)cTemp,"Broadcast!");
int iLenPacket=tempStreadPacket.iLength+sizeof(int)+STREAM_SYNC_HEAD_NUM*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
QUdpSocket *tempUdpSocket= new QUdpSocket(this);
if(!tempUdpSocket->bind(QHostAddress("192.168.0.88")))
return;
QHostAddress broadcastAddress("255.255.255.255");
if(tempUdpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port) != iLenPacket)
{
qDebug() << "error" << "\033[32mwritedatafram error!";
return;
}
else {
qDebug() << strIpAddress << "send udp cmd3" ;
}
tempUdpSocket->deleteLater();
// //UDP多网卡广播
// QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
// foreach (QNetworkInterface interfaces, networkinterfaces) //networkinterfaces负责提供主机的IP地址和网络接口的列表
// {
// if(m_iEnableQuitFlag==1)
// return;
// if(interfaces.humanReadableName()==strNetworkName)
// {
// foreach (QNetworkAddressEntry entry, interfaces.addressEntries())//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
// {
// if(m_iEnableQuitFlag==1)
// return;
// QHostAddress broadcastAddress = entry.broadcast();//返回IPV4地址和子网掩码相关联的广播地址
// broadcastAddress.toIPv4Address();
// if (broadcastAddress != QHostAddress::Null
// && entry.ip() != QHostAddress::LocalHost
// && entry.ip().protocol() == QAbstractSocket::IPv4Protocol
// )
// {
// strIpAddress =entry.ip().toString();// broadcastAddress.toString();
// QUdpSocket *tempUdpSocket= new QUdpSocket(this);
// if(!tempUdpSocket->bind(entry.ip()))
// break;
// if(tempUdpSocket->writeDatagram((char *)&tempStreadPacket,iLenPacket,broadcastAddress,m_port) != iLenPacket)
// {
// qDebug() << "error" << "\033[32mwritedatafram error!";
// return;
// }
// else {
// qDebug() << strIpAddress << "send udp cmd3" ;
// }
// tempUdpSocket->deleteLater();
// }
// }
// }
// }
}
void NetComm::OnProHttpGetResponse(QString url, QByteArray data)
{
//qDebug()<< url + "\r\n"+m_strUrl;
if(m_iEnableQuitFlag==1)
return;
if(url!="")
{
//qDebug()<<"POST";
//qDebug()<<data;
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(data,&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
qDebug()<<tr("解析json文件错误");
return;
}
//QJsonObject jsonObject = document.object();
QJsonObject rootObj = document.object();
QStringList keys = rootObj.keys();
for(int i = 0; i < keys.size(); i++)
{
QString strKey=keys.at(i);
//qDebug() << "key" << i << " is:" << strKey;
if(rootObj.contains(strKey))
{
QJsonObject subObj = rootObj.value(strKey).toObject();
JieXiQJsonObjectOfLedCardInfo(subObj,"");
}
}
}
}
void NetComm::ClearAllLedcardList()
{
LedCardList.clear();
}
void NetComm::JieXiQJsonObjectOfLedCardInfoOld(const QString &strId,const QString &strIp)
{
LedCard *pLedCard=new LedCard(this);//alahover 没有释放
pLedCard->m_strCardId=strId;
pLedCard->m_strCardIp=strIp;
int iExistFlag=0;
for(int i=0;i<LedCardList.count();i++)
{
QString ddd=LedCardList.at(i)->m_strCardId;
if(LedCardList.at(i)->m_strCardId==pLedCard->m_strCardId )//如果已经存在在列表中
{
iExistFlag=1;
LedCard *pOldLedCard=LedCardList.at(i);//获取到旧的对象指针
pOldLedCard->m_bOnLine=true;
if(pOldLedCard->CompareHTTPGetParam(pLedCard)==false)//如果ip地址变化了
{
pOldLedCard->copyLedCardHTTPGetParam(pLedCard);
qDebug() << pLedCard->m_strCardId << "modifed param";
//emit LedCardChanged(pOldLedCard);//发送信号到界面
emit addLedCard(pOldLedCard);//发送信号到界面
}
else {
//post失败的概率比较小所以这里是否需要平凡的更新不需要刻意屏蔽该操作改为在其他点击操作中进行
// emit sigwDeviceItemHttpPost(pOldLedCard);//每检索到该控制卡都会触发post获取控制卡的信息
//qDebug() << pLedCard->m_strCardId <<" already exist";
emit ClearHeartbeatFlagByUdp(pOldLedCard);
}
break;
}
}
if(iExistFlag == 0)
{
//每新增一个控制卡,申请的内存传给其他窗口,不在这里释放
qDebug() << pLedCard->m_strCardId <<" add to list";
pLedCard->m_bOnLine=true;
LedCardList.append(pLedCard);
emit addLedCard(pLedCard);//发送信号到界面
m_UdpTimerInterval=10000;
m_pUdpTimer->setInterval(m_UdpTimerInterval);
}
else
{
delete pLedCard;
}
}
void NetComm::JieXiQJsonObjectOfLedCardInfo(const QJsonObject &subObj,const QString &strIp)
{
LedCard *pLedCard=new LedCard(this);//alahover 没有释放
pLedCard->m_strCardId=subObj["cardId"].toString();
if(strIp.isEmpty())
{
QString strtempIp=subObj["ip"].toString();
if(!strtempIp.isEmpty())
pLedCard->m_strCardIp=strtempIp;
qDebug()<<"ip="<<strtempIp;
QString strtempNewIp=subObj["newIp"].toString();
if(!strtempNewIp.isEmpty())
pLedCard->m_strCardIp=strtempNewIp;
qDebug()<<"new ip="<<strtempNewIp;
}
else
{
pLedCard->m_strCardIp=strIp;
}
// qDebug()<<"JieXiQJsonObjectOfLedCardInfo="<<strIp;
pLedCard->m_iWidth=subObj["width"].toInt();
pLedCard->m_iHeight=subObj["height"].toInt();
// pLedCard->m_strCardRemarkName=subObj["name"].toString();
pLedCard->starterversionName=subObj["versionName"].toString();
pLedCard->starterPort=subObj["starterPort"].toInt();
pLedCard->androidVersion=subObj["androidVersion"].toString();
pLedCard->iHttpGetId=subObj["id"].toInt();
pLedCard->androidHeight=subObj["androidHeight"].toInt();
pLedCard->androidWidth=subObj["androidWidth"].toInt();
pLedCard->lastActive=subObj["lastActive"].toInt();
if(m_strCurSpecifyIp!="")//指定IP的查找,找到的设备直接返回不需要释放pLedCard
{
emit sigGetSpecifyIpResponse(pLedCard);
m_pGetSpecifyIpTimer->stop();
m_intSpecifyIpGetNumber=0;
m_strCurSpecifyIp="";
}
int iExistFlag=0;
for(int i=0;i<LedCardList.count();i++)
{
QString ddd=LedCardList.at(i)->m_strCardId;
if(LedCardList.at(i)->m_strCardId==pLedCard->m_strCardId )//如果已经存在在列表中
{
iExistFlag=1;
LedCard *pOldLedCard=LedCardList.at(i);//获取到旧的对象指针
pOldLedCard->m_bOnLine=true;
if(pOldLedCard->CompareHTTPGetParam(pLedCard)==false)//如果ip地址变化了
{
pOldLedCard->copyLedCardHTTPGetParam(pLedCard);
qDebug() << pLedCard->m_strCardId << "modifed param";
//emit LedCardChanged(pOldLedCard);//发送信号到界面
emit addLedCard(pOldLedCard);//发送信号到界面
}
else {
//post失败的概率比较小所以这里是否需要平凡的更新不需要刻意屏蔽该操作改为在其他点击操作中进行
// emit sigwDeviceItemHttpPost(pOldLedCard);//每检索到该控制卡都会触发post获取控制卡的信息
//qDebug() << pLedCard->m_strCardId <<" already exist";
emit ClearHeartbeatFlagByUdp(pOldLedCard);
}
break;
}
}
if(iExistFlag == 0)
{
//每新增一个控制卡,申请的内存传给其他窗口,不在这里释放
qDebug() << pLedCard->m_strCardId <<" add to list";
pLedCard->m_bOnLine=true;
LedCardList.append(pLedCard);
emit addLedCard(pLedCard);//发送信号到界面
m_UdpTimerInterval=10000;
m_pUdpTimer->setInterval(m_UdpTimerInterval);
}
else
{
delete pLedCard;
}
}
void NetComm::OnStartUdpTimer(bool b)
{
if(b)
{
// m_UdpTimerInterval=1000;
m_pUdpTimer->start(m_UdpTimerInterval);
}
else
m_pUdpTimer->stop();
}