#include "wssserver.h" #include "QtWebSockets/qwebsocketserver.h" #include "QtWebSockets/qwebsocket.h" #include #include #include #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::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(sender()); QList::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=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;iUsersCount;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(sender()); if(pClient){ QList::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 &) { printf("Ssl errors occurred\n"); } void WssServer::timeout() { count++; if(count>5){ QList::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; } }