liudianwu |
2018-04-07 07:39 |
Qt编写自助访客app
widget编写,将抓拍的照片发给服务器执行人脸识别和比对,比对成功后选择被访人的楼号单元层号房号电话,打通电话,被访人按下确认键,收到后制作人脸通行证,将该访客的人脸信息发送至对应单元下的人脸实时分析设备,访客直接过去自动开门,超时失效。 [attachment=18686] [attachment=18687] [attachment=18688] [attachment=18689] [attachment=18690]
- #ifndef DEVICECLIENT_H
#define DEVICECLIENT_H
#include <QtNetwork>
class DeviceClient : public QObject { Q_OBJECT public: static DeviceClient *Instance(); explicit DeviceClient(QObject *parent = 0);
private: static DeviceClient *self; QMutex mutex; bool isOk; QDateTime lastTime; QString serverIP; int serverPort; QTcpSocket *tcpSocket; QByteArray buffer;
private slots: void connected(); void disconnected(); void checkConn(); void readData(); void checkData();
signals: void sendData(const QString &ip, const QString &data); void receiveData(const QString &ip, const QString &data);
void receiveFaceFail(); void receiveFace(const QRect &rect);
void callFinsh(); void callError(); void receiveCall(const QString &tel); void receiveKey(const QString &key);
public slots: void setServerIP(const QString &serverIP); void setServerPort(int serverPort); bool start();
void sendData(const QString &buffer); void sendHeart(); void sendImage(const QImage &image); void sendAction(const QString &tel, bool call = true); void sendPersonInfo(const QString &personBuild, const QString &personUnit, const QString &personLevel, const QString &personRoom, const QString &personName, const QString &personType, const QString &startTime, const QString &endTime);
};
#endif // DEVICECLIENT_H
- #include "deviceclient.h"
#include "quiwidget.h" #include "devicefun.h" #include "qandroid.h" #include "dbdata.h"
DeviceClient *DeviceClient::self = 0; DeviceClient *DeviceClient::Instance() { if (!self) { QMutex mutex; QMutexLocker locker(&mutex); if (!self) { self = new DeviceClient; } }
return self; }
DeviceClient::DeviceClient(QObject *parent) : QObject(parent) { isOk = false; lastTime = QDateTime::currentDateTime();
serverIP = "192.168.1.239"; serverPort = 6661;
//实例化连接对象 tcpSocket = new QTcpSocket(this); connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected())); connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
//定时器处理数据 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(checkData())); timer->start(100);
//定时器处理重连 QTimer *timerConn = new QTimer(this); connect(timerConn, SIGNAL(timeout()), this, SLOT(checkConn())); timerConn->start(5000);
//定时器发送心跳 QTimer *timerHeart = new QTimer(this); connect(timerHeart, SIGNAL(timeout()), this, SLOT(sendHeart())); timerHeart->start(1000); }
void DeviceClient::connected() { isOk = true; }
void DeviceClient::disconnected() { isOk = false; }
void DeviceClient::checkConn() { QDateTime now = QDateTime::currentDateTime(); int timeout = lastTime.secsTo(now); if (timeout >= 10) { isOk = false; QAndroid::Instance()->makeToast("重新连接服务器"); start(); } }
void DeviceClient::readData() { lastTime = QDateTime::currentDateTime();
QMutexLocker locker(&mutex); buffer.append(tcpSocket->readAll()); }
void DeviceClient::checkData() { QMutexLocker locker(&mutex); QDomDocument dom; if (!DeviceFun::getReceiveXmlData(buffer, dom)) { return; }
QDomElement element = dom.documentElement(); if (element.tagName() == "Server") { QString nowTime = element.attribute("NowTime");
QString year = nowTime.mid(0, 4); QString month = nowTime.mid(5, 2); QString day = nowTime.mid(8, 2); QString hour = nowTime.mid(11, 2); QString min = nowTime.mid(14, 2); QString sec = nowTime.mid(17, 2); QUIHelper::setSystemDateTime(year, month, day, hour, min, sec);
//根据子节点处理 QDomNode childNode = element.firstChild(); QString name = childNode.nodeName(); QString value = element.text(); //qInfo() << TIMEMS << name << value;
if (name == "OK") { } else if (name == "FaceRect") { QStringList list = value.split(","); if (list.count() == 4) { emit receiveFace(QRect(list.at(0).toInt(), list.at(1).toInt(), list.at(2).toInt(), list.at(3).toInt())); } else { emit receiveFaceFail(); } } else if (name == "ActionResult") { if (value.startsWith("CallFinsh")) { emit callFinsh(); QAndroid::Instance()->makeToast("呼叫结束"); } else if (value.startsWith("CallError")) { emit callError(); QAndroid::Instance()->makeToast("呼叫失败"); } else if (value.startsWith("ReceiveCall")) { emit receiveCall(value.split(":").at(1)); QAndroid::Instance()->makeToast("新电话打入"); } else if (value.startsWith("ReceiveKey")) { emit receiveKey(value.split(":").at(1)); QAndroid::Instance()->makeToast("按键确认");
//立即发送访客信息 QDateTime now = QDateTime::currentDateTime(); QString endTime = now.addSecs(App::Timeout * 60 * 60).toString("yyyy-MM-dd HH:mm:ss"); sendPersonInfo(DBData::PersonBuild, DBData::PersonUnit, DBData::PersonLevel, DBData::PersonRoom, DBData::PersonName, "访客", DATETIME, endTime); } } } }
void DeviceClient::setServerIP(const QString &serverIP) { this->serverIP = serverIP; }
void DeviceClient::setServerPort(int serverPort) { this->serverPort = serverPort; }
bool DeviceClient::start() { tcpSocket->abort(); tcpSocket->connectToHost(serverIP, serverPort); }
void DeviceClient::sendData(const QString &buffer) { if (!isOk) { return; }
tcpSocket->write(buffer.toLatin1()); emit sendData(App::LocalIP, buffer);
if (buffer.contains("PersonInfo")) { qInfo() << buffer; } }
void DeviceClient::sendHeart() { //构建xml字符串 QStringList list; list.append(QString("<Device DeviceIP=\"%1\">").arg(App::LocalIP)); list.append("<DeviceHeart/>"); list.append("</Device>");
QString buffer = DeviceFun::getSendXmlData(list.join("")); sendData(buffer); }
void DeviceClient::sendImage(const QImage &image) { QByteArray imageData = DeviceFun::getImageData(image);
//构建xml字符串 QStringList list; list.append(QString("<Device DeviceIP=\"%1\">").arg(App::LocalIP)); list.append(QString("<Image>%1</Image>").arg(QString(imageData))); list.append("</Device>");
QString buffer = DeviceFun::getSendXmlData(list.join("")); sendData(buffer); }
void DeviceClient::sendAction(const QString &tel, bool call) { //构建xml字符串 QStringList list; list.append(QString("<Device DeviceIP=\"%1\">").arg(App::LocalIP));
if (call) { list.append(QString("<DoAction>StartCall:%1</DoAction>").arg(tel)); } else { list.append(QString("<DoAction>StopCall</DoAction>")); }
list.append("</Device>");
QString buffer = DeviceFun::getSendXmlData(list.join("")); sendData(buffer); }
void DeviceClient::sendPersonInfo(const QString &personBuild, const QString &personUnit, const QString &personLevel, const QString &personRoom, const QString &personName, const QString &personType, const QString &startTime, const QString &endTime) { //构建xml字符串 QStringList list; list.append(QString("<Device DeviceIP=\"%1\">").arg(App::LocalIP)); list.append("<PersonInfo>"); list.append(QString("<PersonBuild>%1</PersonBuild>").arg(DeviceFun::getBase64(personBuild))); list.append(QString("<PersonUnit>%1</PersonUnit>").arg(DeviceFun::getBase64(personUnit))); list.append(QString("<PersonLevel>%1</PersonLevel>").arg(DeviceFun::getBase64(personLevel))); list.append(QString("<PersonRoom>%1</PersonRoom>").arg(DeviceFun::getBase64(personRoom))); list.append(QString("<PersonName>%1</PersonName>").arg(DeviceFun::getBase64(personName))); list.append(QString("<PersonType>%1</PersonType>").arg(DeviceFun::getBase64(personType))); list.append(QString("<StartTime>%1</StartTime>").arg(startTime)); list.append(QString("<EndTime>%1</EndTime>").arg(endTime)); list.append("</PersonInfo>"); list.append("</Device>");
QString buffer = DeviceFun::getSendXmlData(list.join("")); sendData(buffer); }
|
|