查看完整版本: [-- Qt编写自助访客app --]

QTCN开发网 -> Qt 作品展 -> Qt编写自助访客app [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liudianwu 2018-04-07 07:39

Qt编写自助访客app

widget编写,将抓拍的照片发给服务器执行人脸识别和比对,比对成功后选择被访人的楼号单元层号房号电话,打通电话,被访人按下确认键,收到后制作人脸通行证,将该访客的人脸信息发送至对应单元下的人脸实时分析设备,访客直接过去自动开门,超时失效。
[attachment=18686]
[attachment=18687]
[attachment=18688]
[attachment=18689]
[attachment=18690]
  1. #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


  1. #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);
    }


圣域天子 2018-04-07 08:23
怎么现在迷上用QWidget开发app了???

liudianwu 2018-04-07 08:28
圣域天子:怎么现在迷上用QWidget开发app了??? (2018-04-07 08:23) 

关键是不会用qml

圣域天子 2018-04-07 08:32
liudianwu:关键是不会用qm[表情]l (2018-04-07 08:28) 

彼此彼此,...
我觉得 qml 都不是C++ 了
它感觉还没有定型
目前我也用不到,所以也不太关注

return 2018-04-07 13:51
      

liuchangyin 2018-04-08 10:00

青春的年代 2018-04-10 13:58
挺好的大神带带我


查看完整版本: [-- Qt编写自助访客app --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled