#include "deviceitem.h" #include "base/waitingdlg.h" #include "gutil/qgui.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include DeviceItem::DeviceItem(LedCard *pLedCard, LoQTreeWidget *parent) : QObject(parent), QTreeWidgetItem(UserType), m_parent(parent) { mCard = pLedCard; pHpptClient = new HpptClient(this); setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); setCheckState(0, Qt::Unchecked); m_parent->addTopLevelItem(this); m_bnCardDetailInfo = new QPushButton(); m_bnCardDetailInfo->setToolTip(tr("GetScreenDetailInfo")); m_bnCardDetailInfo->setCursor(QCursor(Qt::PointingHandCursor)); m_bnCardDetailInfo->setStyleSheet(R"rrr( QPushButton { border-radius: 4px; image: url(:/res/device/bnDetail.png); } QPushButton:hover{background-color: #ccc;} )rrr"); connect(m_bnCardDetailInfo, &QPushButton::clicked, this, [this]{ QString strTip=""; strTip.append(tr("cur brightness:")).append(QString::number(mCard->bright)).append("\r\n"); //strTip.append("cardsystem apk version:"+QString::number(m_LedCard.iCardSystemVersion)+"\r\n"); //strTip.append("device apk:"+m_LedCard.starterversionName+"\r\n"); strTip.append(tr("android version:")).append(mCard->androidVersion).append("\r\n"); //strTip.append(tr("android width:")+QString::number(m_LedCard.androidWidth)+"\r\n"); //strTip.append(tr("android height:")+QString::number(m_LedCard.androidHeight)+"\r\n"); strTip.append(tr("IMEI:")).append(mCard->strIMEI).append("\r\n"); strTip.append(tr("HardWard Version:")).append(mCard->HardVersion).append("\r\n"); strTip.append(tr("MAX Brightness level:")).append(QString::number(mCard->BrightnessLevel)).append("\r\n"); strTip.append(tr("Android OS Resolution:")).append(mCard->ScreenResolution).append("\r\n"); strTip.append(tr("Firmware Version:")).append(mCard->FirmwareVersion).append("\r\n"); strTip.append(tr("Player Version:")).append(mCard->strXixunplayerVersion).append("\r\n"); QMessageBox::information(treeWidget(), tr("Detail Info"), strTip); }); m_bnReadbackPic = new QPushButton(); m_bnReadbackPic->setToolTip(tr("ReadbackPic")); m_bnReadbackPic->setCursor(QCursor(Qt::PointingHandCursor)); m_bnReadbackPic->setStyleSheet(R"rrr( QPushButton { border-radius: 4px; image: url(:/res/device/deviceReadbackPic.png); } QPushButton:hover{background-color: #ccc;} )rrr"); connect(m_bnReadbackPic, &QPushButton::clicked, this, [this] { QJsonObject json; json.insert("_id", "GetScreenshotFull"); json.insert("_type", "GetScreenshotFull"); auto waitingDlg = new WaitingDlg(treeWidget(), tr("GetScreenshotFull")+" ..."); waitingDlg->show(); auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(120000).post(json); waitingDlg->connAbort(reply); connect(reply, &QNetworkReply::finished, this, [=] { waitingDlg->close(); QJsonDocument json; QString err = checkReplyForJson(reply, &json); if(! err.isEmpty()) { QMessageBox::critical(treeWidget(), tr("Error"), err); return; } ImgDlg dlg(QByteArray::fromBase64(json["data"].toString().toLatin1()), treeWidget()); dlg.exec(); }); }); m_ImageOnline = new QLabel(); mCard->m_bOnLine=true; m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png")); setData(DeviceTable_ID, 0, mCard->m_strCardId); setData(DeviceTable_IP, 0, mCard->m_strCardIp); setData(DeviceTable_ScreenSize, 0, QString("%1 x %2").arg(mCard->m_iWidth).arg(mCard->m_iHeight)); m_parent->setItemWidget(this, DeviceTable_Info, m_bnCardDetailInfo); m_parent->setItemWidget(this, DeviceTable_Screenshot, m_bnReadbackPic); m_parent->setItemWidget(this, DeviceTable_Online, m_ImageOnline); m_ImageOnline->setAlignment(Qt::AlignCenter); btnUnlock = new QPushButton; btnUnlock->setMaximumHeight(40); if(mCard->bPassword) btnUnlock->setIcon(QIcon(mCard->m_bLockStatus ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); else btnUnlock->hide(); connect(btnUnlock, &QPushButton::clicked, this, [this] { if(! mCard->m_bLockStatus) return; bool ok; auto pwd = QInputDialog::getText(treeWidget(), tr("Input password"), tr("Input password"), QLineEdit::Password, QString(), &ok); if(! ok) return; QJsonObject json; json.insert("_id", "VerifyPassword"); json.insert("_type", "VerifyPassword"); json.insert("pwd", pwd); auto waitingDlg = new WaitingDlg(treeWidget(), tr("VerifyPassword")+" ..."); waitingDlg->show(); auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(60000).post(json); waitingDlg->connAbort(reply); connect(reply, &QNetworkReply::finished, this, [=] { QJsonDocument json; QString err = checkReplyForJson(reply, &json); if(! err.isEmpty()) { waitingDlg->close(); QMessageBox::critical(treeWidget(), tr("Error"), err); return; } if(! json["result"].toBool()) { waitingDlg->close(); QMessageBox::critical(treeWidget(), tr("Tip Info"), tr("password is wrong")); return; } waitingDlg->success(); mCard->m_bLockStatus = false; btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); }); }); auto wgt = new QWidget; auto hBox = new HBox(wgt); hBox->setContentsMargins(0,0,0,0); hBox->addWidget(btnUnlock); m_parent->setItemWidget(this, DeviceTable_Password, wgt); for(int i=1; i10) { //下线 mCard->m_bOnLine=false; m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Offline.png")); } else { //在线 mCard->m_bOnLine=true; m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png")); } }); mHeartbeatTimer.start(60000); m_pGetAskTimer=new QTimer(this); connect(pHpptClient,SIGNAL(httpPostRspReady(QString , QString , QByteArray)),this,SLOT(OnProHttpResponse(QString , QString , QByteArray))); //连接item的响应信号到信息输出框的显示槽函数 connect(this,SIGNAL(sigOutputInfo(QString)),parent->parent(),SLOT(OnOutputInfo(QString))); } DeviceItem::~DeviceItem() { mHeartbeatTimer.stop(); if(pHpptClient) { delete pHpptClient; pHpptClient=nullptr; } } void DeviceItem::SetMainTabWidgetIndex(int index){ m_intIndexFlagOfInfoOrControl=index; DeviceItemHttpPost(); } //针对这个ITEM通过POST获取控制卡的信息,两种情况下会调用,一,创建该Item初始化后,二、手动刷新 void DeviceItem::DeviceItemHttpPost() { if(m_intIndexFlagOfInfoOrControl!=MainPage_DeviceManager) return; QJsonObject json; json.insert("_id", getRandomString(10)); json.insert("_type", "GetScreenSize"); HttpPostByTypeJsonObject(json); QJsonObject json1; json1.insert("_id", getRandomString(10)); json1.insert("_type", "GetBrightness"); HttpPostByTypeJsonObject(json1); QJsonObject json2; json2.insert("_id", getRandomString(10)); json2.insert("_type", "IsScreenOn"); HttpPostByTypeJsonObject(json2); QJsonObject json4; json4.insert("_id", getRandomString(10)); json4.insert("_type", "GetBuildInformation"); HttpPostByTypeJsonObject(json4); QJsonObject json5; json5.insert("_id", getRandomString(10)); json5.insert("_type", "CheckSoftVersions"); HttpPostByTypeJsonObject(json5); QJsonObject json8; json8.insert("_id", getRandomString(10)); json8.insert("_type", "GetCardAlias"); HttpPostByTypeJsonObject(json8); { QJsonObject json; json.insert("_id", "HasControllerPassword"); json.insert("_type", "HasControllerPassword"); auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(120000).post(json); connect(reply, &QNetworkReply::finished, mCard, [=] { QJsonDocument json; QString err = checkReplyForJson(reply, &json); if(! err.isEmpty()) return; mCard->bPassword = json["result"].toBool(); if(mCard->bPassword) {//加过密 btnUnlock->show(); btnUnlock->setIcon(QIcon(mCard->m_bLockStatus ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); } else btnUnlock->hide(); }); } } void DeviceItem::OnControlTcpSend(int iProgramIndex) { QTcpSocket *send = new QTcpSocket(); connect(send, SIGNAL(connected()), this, SLOT(connect_sucessful())); connect(send, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(show_error(QAbstractSocket::SocketError))); send->connectToHost(QHostAddress(mCard->m_strCardIp),31299); ST_ANSY_PROGRAM_PACKET tempStreadPakcet; tempStreadPakcet.SyncHead[0]=0x7e; tempStreadPakcet.SyncHead[1]=0x7e; tempStreadPakcet.SyncHead[2]=0x55; tempStreadPakcet.ucCommType=0x97; tempStreadPakcet.iBaoLiu=0; tempStreadPakcet.iLength=4; unsigned char uctemp[4]={0}; uctemp[0]=iProgramIndex; memcpy(tempStreadPakcet.pDataBuffer,uctemp,4); tempStreadPakcet.pDataBuffer[tempStreadPakcet.iLength]=GetCheckCodeIn8(&tempStreadPakcet.ucCommType,tempStreadPakcet.iLength+sizeof(tempStreadPakcet.iBaoLiu)+sizeof(tempStreadPakcet.ucCommType)+sizeof(tempStreadPakcet.iLength)); int iLenPacket=3*sizeof(unsigned char)+sizeof(char)+sizeof(int)+sizeof(int)+tempStreadPakcet.iLength+sizeof(char);/////除正文外的协议结构大小; QByteArray databuf = QByteArray(reinterpret_cast(&tempStreadPakcet), iLenPacket); if(!send->waitForConnected(10000)) //等待连接返回 { qDebug()<m_strCardIp<<"Connect timeout "; emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("Connect")+":"+tr("timeout")); send->close(); delete send; return ; } send->write(databuf); if(send->waitForBytesWritten(3000)) { send->read(send->bytesAvailable()); qDebug()<<"recv anycast success ack"; emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("Anycast")+":"+tr("success")); } send->close(); delete send; } void DeviceItem::HttpPostByTypeJsonObject(QJsonObject json) { QJsonDocument doc; doc.setObject(json); QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact); m_strUrl="http://"+mCard->m_strCardIp+":2016/settings"; if(mCard->m_strCardId.left(2)!="M8" && mCard->m_strCardId.left(2)!="m8") { if(json["_type"]!="GetAllScreenSizeM80") pHpptClient->httpPost(m_strUrl,post_loginArray); } else pHpptClient->httpPost(m_strUrl,post_loginArray); } void DeviceItem::HttpGetLedCardWidthHeight() { QJsonObject json; json.insert("_id", getRandomString(10)); json.insert("_type", "GetScreenSize"); HttpPostByTypeJsonObject(json); } void DeviceItem::HttpGetLedCardRemarkName(){ QJsonObject json; json.insert("_id", getRandomString(10)); json.insert("_type", "GetCardAlias"); HttpPostByTypeJsonObject(json); } void DeviceItem::refreshLable(){ if(mCard->m_bPowerStatus){ this->setForeground(DeviceTable_Power, Qt::green); setData(DeviceTable_Power, 0, tr("on")); } else { this->setForeground(DeviceTable_Power, Qt::red); setData(DeviceTable_Power, 0, tr("off")); } } //获取到httpPost的应答,如果参数变化需要出发修改控件item的内容 void DeviceItem::OnProHttpResponse(QString url, QString postMD5, QByteArray data) { Q_UNUSED(postMD5) //qDebug()<< url + "\r\n"+m_strUrl; if(url == m_strUrl) { QJsonParseError parseJsonErr; QJsonDocument document = QJsonDocument::fromJson(data,&parseJsonErr); if(!(parseJsonErr.error == QJsonParseError::NoError)) { if(data.size()==0) qDebug()<<"json is empty"; else qDebug()<<"DeviceItem OnProHttpResponse 解析json文件错误!"; return; } QJsonObject jsonObject = document.object(); QString strType=jsonObject["_type"].toString(); if(jsonObject["success"].toBool()==true) { if(strType=="GetScreenSize" ) { if(mCard->m_iWidth!=jsonObject["width"].toInt()||mCard->m_iHeight!=jsonObject["height"].toInt()) { mCard->m_iWidth=jsonObject["width"].toInt(); mCard->m_iHeight=jsonObject["height"].toInt(); } setData(DeviceTable_ScreenSize, 0, QString("%1 x %2").arg(mCard->m_iWidth).arg(mCard->m_iHeight)); } else if(strType=="GetCardAlias" ) { mCard->m_strCardRemarkName = QString::fromUtf8(QByteArray::fromBase64(jsonObject["alias"].toString().toLatin1())); setData(DeviceTable_Remark,0,mCard->m_strCardRemarkName); } else if(strType=="GetCardName") { m_HeartbeatCount=0; mCard->m_bOnLine=true; m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png")); } else if(strType=="GetBuildInformation" ) { mCard->strIMEI=jsonObject["IMEI"].toString(); mCard->HardVersion=jsonObject["HardVersion"].toString(); mCard->BrightnessLevel=jsonObject["BrightnessLevel"].toInt(); mCard->ScreenResolution=jsonObject["ScreenResolution"].toString(); mCard->FirmwareVersion=jsonObject["FirmwareVersion"].toString(); } else if(strType=="CheckSoftVersions") { foreach(QJsonValue value, jsonObject["apps"].toArray()) { QJsonObject oApp = value.toObject(); if(oApp["packageName"].toString().contains("xixunplayer")) { mCard->strXixunplayerVersion=oApp["versionName"].toString(); mCard->strXixunplayerVersionCode=oApp["versionCode"].toInt(); } } } else if(strType == "AliIotSetting") { emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("AliIotSetting")+":"+tr("success")); } else if(strType == "IsScreenOn") { { mCard->m_bPowerStatus=jsonObject["on"].toBool(); if(mCard->m_bPowerStatus) { this->setForeground(DeviceTable_Power, Qt::green); setData(DeviceTable_Power, 0, tr("on")); emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetScreenStatus")+tr("success")+","+tr("Status")+":"+tr("on")); } else { this->setForeground(DeviceTable_Power, Qt::red); setData(DeviceTable_Power, 0, tr("off")); emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetScreenStatus")+tr("success")+","+tr("Status")+":"+tr("off")); } } } else if(strType == "GetBrightness") { mCard->bright = jsonObject["brightnessPercentage"].toInt(-1); if(mCard->bright==-1) mCard->bright = qRound(jsonObject["brightness"].toInt() * 100.0 / mCard->BrightnessLevel); QString bright = QString::number(mCard->bright); setData(DeviceTable_Brightness, 0, QString::number(mCard->bright)+"%"); emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetBrightness")+tr("success")+","+tr("brightness")+"="+bright+"%"); } else if(strType == "SetAutoBrightnessTask") { emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetAutoBrightnessTask")+":"+tr("success")); } else if(strType == "SetAutoVolumeTask") { emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetAutoVolumeTask")+":"+tr("success")); } else if(strType == "SetTimingScreenTask") { emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetTimingScreenTask")+":"+tr("success")); } else if(strType == "TestScreen") { emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("TestScreen")+":"+tr("success")); } } } } QPixmap DeviceItem::Base64_To_Image(QByteArray bytearray,QString SavePath) { QByteArray Ret_bytearray; Ret_bytearray = QByteArray::fromBase64(bytearray); QBuffer buffer(&Ret_bytearray); buffer.open(QIODevice::WriteOnly); QPixmap imageresult; imageresult.loadFromData(Ret_bytearray); if(SavePath != "") { qDebug() <<"save" ; imageresult.save(SavePath); } return imageresult; } void DeviceItem::DeletePostingDlg() { if(m_PostingDlg!=nullptr) { delete m_PostingDlg; m_PostingDlg=nullptr; } } ImgDlg::ImgDlg(const QByteArray &data, QWidget *parent) : QDialog(parent) { setWindowFlag(Qt::WindowContextHelpButtonHint, 0); setWindowTitle(tr("Screenshot")); mImg.loadFromData(data); auto www = mImg.width(); auto hhh = mImg.height(); if(www <= 1600 && hhh <= 900) resize(www, hhh); else if(www > hhh) resize(900 * www / hhh, 900); else resize(1600, 1600 * hhh / www); } void ImgDlg::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawImage(rect(), mImg); }