123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- #include "wssserver.h"
- #include "QtWebSockets/qwebsocketserver.h"
- #include "QtWebSockets/qwebsocket.h"
- #include <QCryptographicHash>
- #include <QSslCertificate>
- #include <QSslKey>
- #include "smartlightshm.h"
- WssServer::WssServer(QObject *parent)
- : QObject(parent),
- m_pWebSocketServer(Q_NULLPTR)
- {
- WssPort = WSPort;
- count = 0;
- pseq = 0;
- m_pWebSocketServer = new QWebSocketServer(QStringLiteral("SSL WebSocket Server"),
- QWebSocketServer::SecureMode,this);
- QSslConfiguration sslconfiguration;
- QFile certFile(QStringLiteral("/etc/pki/nginx/devices01.usky.cn.pem"));
- QFile keyFile(QStringLiteral("/etc/pki/nginx/devices01.usky.cn.key"));
- if(!certFile.open(QIODevice::ReadOnly)){
- printf("cert file open failed\n");
- exit(1);
- }
- if(!keyFile.open(QIODevice::ReadOnly)){
- printf("key file open failed\n");
- exit(1);
- }
- QSslCertificate certificate(&certFile, QSsl::Pem);
- QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem);
- certFile.close();
- keyFile.close();
- sslconfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
- sslconfiguration.setLocalCertificate(certificate);
- sslconfiguration.setPrivateKey(sslKey);
- sslconfiguration.setProtocol(QSsl::TlsV1SslV3);
- m_pWebSocketServer->setSslConfiguration(sslconfiguration);
- timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &WssServer::timeout);
- connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
- this,&WssServer::onNewConnection);
- connect(m_pWebSocketServer, &QWebSocketServer::sslErrors, this, &WssServer::onSslErrors);
- }
- WssServer::~WssServer()
- {
- m_pWebSocketServer->close();
- qDeleteAll(clientList.begin(), clientList.end());
- emit closed();
- }
- void WssServer::onNewConnection()
- {
- QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
- connect(pSocket,&QWebSocket::textMessageReceived,this,&WssServer::processTextMessage);
- connect(pSocket,&QWebSocket::disconnected,this,&WssServer::socketDisconnected);
- clientList.append(new WssClient(pSocket));
- }
- QString WssServer::getPassword(QString psd)
- {
- return QCryptographicHash::hash(psd.toUtf8(),QCryptographicHash::Md5).toHex();
- }
- void WssServer::subReport(QString DeviceCode, int Dir, bool isSql, bool isErr, QString data)
- {
- QList<WssClient *>::iterator i;
- QString text = QString("{\"ACTION\":\"DEBUG\",\"DEVICEID\":\"%1\",\"DIR\":%2,\"ISSQL\":%3,\"ISERR\":%4,\"DATA\":\"%5\"}")
- .arg(DeviceCode).arg(Dir).arg(isSql).arg(isErr).arg(data);
- for(i=clientList.begin();i!=clientList.end();i++){
- WssClient *client = *i;
- if((client->DeviceId.length()==0)
- ||(DeviceCode.indexOf(client->DeviceId)>=0)){
- if((!isSql)&&(!isErr)){
- if((client->NeedComm==1)&&(client->Dir&Dir))
- client->m_client->sendTextMessage(text);
- }
- }else if(isSql){
- if((client->NeedSQL)&&(data.indexOf(client->DeviceId)>=0))
- client->m_client->sendTextMessage(text);
- }else if(isErr){
- if(client->NeedErr)
- client->m_client->sendTextMessage(text);
- }
- }
- }
- void WssServer::processTextMessage(QString message)
- {
- QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
- QList<WssClient *>::iterator i;
- for(i=clientList.begin();i!=clientList.end();i++){
- WssClient *client = *i;
- if(client->m_client==pClient){
- if(pseq>15){
- pseq=0;
- }
- QStringList Dat = message.split("\r\n");
- QByteArray cmd;
- bool found = false;
- for(int i=0;i<Dat.length();i++){
- if(Dat.at(i).indexOf("{")>=0)
- found = true;
- if(found)
- cmd.append(Dat.at(i).trimmed().toUtf8());
- }
- QJsonParseError json_error;
- QJsonDocument jsonDoc(QJsonDocument::fromJson(cmd,&json_error));
- if(json_error.error==QJsonParseError::NoError){
- QJsonObject root = jsonDoc.object();
- int commandType = 0;
- if(!client->LoginFlag){
- if((!root.value("command_type").isUndefined())&&(!root.value("command_type").isNull())){
- commandType=root.value("command_type").toString().toInt();
- }
- QString Data = QString("[ %1 +++++++++++++++++++++++++ %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(commandType);
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- if((!root.value("ACTION").isUndefined())&&(!root.value("ACTION").isNull())){
- if(root.value("ACTION").toString().compare("LOGIN")==0){
- if((!root.value("LOGINNAME").isUndefined())&&(!root.value("LOGINNAME").isNull())
- &&(!root.value("PASSWORD").isUndefined())&&(!root.value("PASSWORD").isNull())){
- QString LoginName = root.value("LOGINNAME").toString().trimmed();
- QString Password = getPassword(getPassword(root.value("PASSWORD").toString().trimmed()));
- for(uint i=0;i<webData->UsersCount;i++){
- if((QString::compare(LoginName,QString(webData->users[i].LoginName))==0)
- &&(QString::compare(Password,QString(webData->users[i].Password))==0)){
- client->LoginFlag=true;
- client->m_client->sendTextMessage(QString("{\"ACTION\":\"LOGIN\",\"RESULT\":\"1\",\"URL\":\"option.html\"}"));
- }
- }
- }
- }
- }else if((!root.value("RESET").isUndefined())&&(!root.value("RESET").isNull())){
- emit resetRequest(root.value("DEVICEID").toString().trimmed(),2,0,pseq);
- pseq++;
- }else if((!root.value("QUERYPARAMETERS").isUndefined())&&(!root.value("QUERYPARAMETERS").isNull())){
- emit resetRequest(root.value("DEVICEID").toString().trimmed(),11,root.value("QUERYPARAMETERSSELECT").toString().toInt(),pseq);
- pseq++;
- }else if((!root.value("start_point").isUndefined())&&(!root.value("start_point").isNull())){
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("query_number").toString().toInt(),root.value("start_point").toString().toInt());
- pseq++;
- }else if((!root.value("economize_gear").isUndefined())&&(!root.value("economize_gear").isNull())){
- QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
- .arg(root.value("operation_type").toString().toInt());
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),5,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("control_type").toString().toInt(),root.value("economize_gear").toString().toInt());
- pseq++;
- }else if((!root.value("time_data").isUndefined())&&(!root.value("time_data").isNull())){
- QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
- .arg(root.value("time_data").toString().trimmed());
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- QString tmp = root.value("time_data").toString();
- emit requestSetParameters(root.value("terminal_code").toString().trimmed(),4,root.value("operation_type").toString().toInt(),tmp);
- pseq++;
- }else if(commandType==14){
- QString Data = QString("[ %1 =============== %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(14);
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),14,root.value("operation_type").toString().toInt(),root.value("pm").toString().toInt(),root.value("pn").toString().toInt(),0);
- pseq++;
- }
- }else{
- if((!root.value("command_type").isUndefined())&&(!root.value("command_type").isNull())){
- commandType=root.value("command_type").toString().toInt();
- }
- QString Data = QString("[ %1 +++++++++++++++++++++++++ %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(commandType);
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- if((!root.value("ACTION").isUndefined())&&(!root.value("ACTION").isNull())){
- if(root.value("ACTION").toString().compare("DBGSET")==0){
- if((!root.value("DEVICEID").isUndefined())&&(!root.value("DEVICEID").isNull())
- &&(!root.value("COMMDBG").isUndefined())&&(!root.value("COMMDBG").isNull())
- &&(!root.value("COMMDIR").isUndefined())&&(!root.value("COMMDIR").isNull())
- &&(!root.value("SQLDBG").isUndefined())&&(!root.value("SQLDBG").isNull())
- &&(!root.value("ERRDBG").isUndefined())&&(!root.value("ERRDBG").isNull())){
- client->DeviceId = root.value("DEVICEID").toString().trimmed();
- switch(root.value("COMMDBG").toString().toInt()){
- case 0:
- client->NeedComm = 0;
- break;
- case 1:
- client->NeedComm = 1;
- break;
- default:
- client->NeedComm = 0;
- break;
- }
- switch (root.value("COMMDIR").toString().toInt()) {
- case 0:
- client->Dir = 0;
- break;
- case 1:
- client->Dir = 1;
- break;
- case 2:
- client->Dir = 2;
- break;
- case 3:
- client->Dir = 3;
- break;
- default:
- client->Dir = 0;
- break;
- }
- switch (root.value("SQLDBG").toString().toInt()) {
- case 0:
- client->NeedSQL = 0;
- break;
- case 1:
- client->NeedSQL = 1;
- break;
- default:
- client->NeedSQL = 0;
- break;
- }
- switch (root.value("ERRDBG").toString().toInt()) {
- case 0:
- client->NeedErr = 0;
- break;
- case 1:
- client->NeedErr = 1;
- break;
- default:
- client->NeedErr = 0;
- break;
- }
- client->m_client->sendTextMessage(QString("{\"ACTION\":\"DBGSET\",\"RESULT\":\"1\",\"QUERY\":%1,\"NeedComm\":%2,\"COMMDIR\":%3,\"NeedSQL\":%4,\"NeedErr\":%5,\"DeviceId\":\"%6\"}")
- .arg(message).arg(client->NeedComm).arg(client->Dir).arg(client->NeedSQL).arg(client->NeedErr).arg(client->DeviceId));
- }else{
- client->m_client->sendTextMessage(QString("{\"ACTION\":\"DBGSET\",\"RESULT\":\"1\",\"QUERY\":%1,\"NeedComm\":%2,\"COMMDIR\":%3,\"NeedSQL\":%4,\"NeedErr\":%5,\"DeviceId\":\"%6\"}")
- .arg(message).arg(client->NeedComm).arg(client->Dir).arg(client->NeedSQL).arg(client->NeedErr).arg(client->DeviceId));
- }
- }
- }else if((!root.value("RESET").isUndefined())&&(!root.value("RESET").isNull())){
- emit resetRequest(root.value("DEVICEID").toString().trimmed(),2,"f0",pseq);
- pseq++;
- }else if((!root.value("QUERYPARAMETERS").isUndefined())&&(!root.value("QUERYPARAMETERS").isNull())){
- emit resetRequest(root.value("DEVICEID").toString().trimmed(),11,root.value("QUERYPARAMETERSSELECT").toString().trimmed(),pseq);
- pseq++;
- }else if((!root.value("start_point").isUndefined())&&(!root.value("start_point").isNull())){
- // emit resetRequest(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().trimmed());
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("query_number").toString().toInt(),root.value("start_point").toString().toInt());
- pseq++;
- }else if((!root.value("economize_gear").isUndefined())&&(!root.value("economize_gear").isNull())){
- QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
- .arg(root.value("operation_type").toString().toInt());
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),5,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("control_type").toString().toInt(),root.value("economize_gear").toString().toInt());
- pseq++;
- }else if((!root.value("time_data").isUndefined())&&(!root.value("time_data").isNull())){
- QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
- .arg(root.value("time_data").toString().trimmed());
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- QString tmp = root.value("time_data").toString();
- emit requestSetParameters(root.value("terminal_code").toString().trimmed(),4,root.value("operation_type").toString().toInt(),tmp);
- pseq++;
- }else if(commandType==14){
- QString Data = QString("[ %1 =============== %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(14);
- emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
- emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),14,root.value("operation_type").toString().toInt(),root.value("pm").toString().toInt(),root.value("pn").toString().toInt(),0);
- pseq++;
- }
- }
- }
- break;
- }
- }
- }
- void WssServer::start()
- {
- if(m_pWebSocketServer->listen(QHostAddress::Any, WssPort)){
- timer->start(5000);
- }else{
- printf("EchoServer listening failed\n");
- exit(1);
- }
- }
- void WssServer::socketDisconnected()
- {
- QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
- if(pClient){
- QList<WssClient *>::iterator i;
- for(i=clientList.begin();i!=clientList.end();i++){
- WssClient *client = *i;
- if(client->m_client==pClient){
- clientList.removeAll(client);
- pClient->deleteLater();
- return;
- }
- }
- }
- }
- void WssServer::onSslErrors(const QList<QSslError> &)
- {
- printf("Ssl errors occurred\n");
- }
- void WssServer::timeout()
- {
- count++;
- if(count>5){
- QList<WssClient *>::iterator i;
- for(i=clientList.begin();i!=clientList.end();i++){
- WssClient *client = *i;
- if(client->m_client){
- client->m_client->sendTextMessage(QString("{\"time\":\"%1\"}").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")));
- }
- }
- count=0;
- }
- }
|