wssserver.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #include "wssserver.h"
  2. #include "QtWebSockets/qwebsocketserver.h"
  3. #include "QtWebSockets/qwebsocket.h"
  4. #include <QCryptographicHash>
  5. #include <QSslCertificate>
  6. #include <QSslKey>
  7. #include "smartlightshm.h"
  8. WssServer::WssServer(QObject *parent)
  9. : QObject(parent),
  10. m_pWebSocketServer(Q_NULLPTR)
  11. {
  12. WssPort = WSPort;
  13. count = 0;
  14. pseq = 0;
  15. m_pWebSocketServer = new QWebSocketServer(QStringLiteral("SSL WebSocket Server"),
  16. QWebSocketServer::SecureMode,this);
  17. QSslConfiguration sslconfiguration;
  18. QFile certFile(QStringLiteral("/etc/pki/nginx/devices01.usky.cn.pem"));
  19. QFile keyFile(QStringLiteral("/etc/pki/nginx/devices01.usky.cn.key"));
  20. if(!certFile.open(QIODevice::ReadOnly)){
  21. printf("cert file open failed\n");
  22. exit(1);
  23. }
  24. if(!keyFile.open(QIODevice::ReadOnly)){
  25. printf("key file open failed\n");
  26. exit(1);
  27. }
  28. QSslCertificate certificate(&certFile, QSsl::Pem);
  29. QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem);
  30. certFile.close();
  31. keyFile.close();
  32. sslconfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
  33. sslconfiguration.setLocalCertificate(certificate);
  34. sslconfiguration.setPrivateKey(sslKey);
  35. sslconfiguration.setProtocol(QSsl::TlsV1SslV3);
  36. m_pWebSocketServer->setSslConfiguration(sslconfiguration);
  37. timer = new QTimer(this);
  38. connect(timer, &QTimer::timeout, this, &WssServer::timeout);
  39. connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
  40. this,&WssServer::onNewConnection);
  41. connect(m_pWebSocketServer, &QWebSocketServer::sslErrors, this, &WssServer::onSslErrors);
  42. }
  43. WssServer::~WssServer()
  44. {
  45. m_pWebSocketServer->close();
  46. qDeleteAll(clientList.begin(), clientList.end());
  47. emit closed();
  48. }
  49. void WssServer::onNewConnection()
  50. {
  51. QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
  52. connect(pSocket,&QWebSocket::textMessageReceived,this,&WssServer::processTextMessage);
  53. connect(pSocket,&QWebSocket::disconnected,this,&WssServer::socketDisconnected);
  54. clientList.append(new WssClient(pSocket));
  55. }
  56. QString WssServer::getPassword(QString psd)
  57. {
  58. return QCryptographicHash::hash(psd.toUtf8(),QCryptographicHash::Md5).toHex();
  59. }
  60. void WssServer::subReport(QString DeviceCode, int Dir, bool isSql, bool isErr, QString data)
  61. {
  62. QList<WssClient *>::iterator i;
  63. QString text = QString("{\"ACTION\":\"DEBUG\",\"DEVICEID\":\"%1\",\"DIR\":%2,\"ISSQL\":%3,\"ISERR\":%4,\"DATA\":\"%5\"}")
  64. .arg(DeviceCode).arg(Dir).arg(isSql).arg(isErr).arg(data);
  65. for(i=clientList.begin();i!=clientList.end();i++){
  66. WssClient *client = *i;
  67. if((client->DeviceId.length()==0)
  68. ||(DeviceCode.indexOf(client->DeviceId)>=0)){
  69. if((!isSql)&&(!isErr)){
  70. if((client->NeedComm==1)&&(client->Dir&Dir))
  71. client->m_client->sendTextMessage(text);
  72. }
  73. }else if(isSql){
  74. if((client->NeedSQL)&&(data.indexOf(client->DeviceId)>=0))
  75. client->m_client->sendTextMessage(text);
  76. }else if(isErr){
  77. if(client->NeedErr)
  78. client->m_client->sendTextMessage(text);
  79. }
  80. }
  81. }
  82. void WssServer::processTextMessage(QString message)
  83. {
  84. QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
  85. QList<WssClient *>::iterator i;
  86. for(i=clientList.begin();i!=clientList.end();i++){
  87. WssClient *client = *i;
  88. if(client->m_client==pClient){
  89. if(pseq>15){
  90. pseq=0;
  91. }
  92. QStringList Dat = message.split("\r\n");
  93. QByteArray cmd;
  94. bool found = false;
  95. for(int i=0;i<Dat.length();i++){
  96. if(Dat.at(i).indexOf("{")>=0)
  97. found = true;
  98. if(found)
  99. cmd.append(Dat.at(i).trimmed().toUtf8());
  100. }
  101. QJsonParseError json_error;
  102. QJsonDocument jsonDoc(QJsonDocument::fromJson(cmd,&json_error));
  103. if(json_error.error==QJsonParseError::NoError){
  104. QJsonObject root = jsonDoc.object();
  105. int commandType = 0;
  106. if(!client->LoginFlag){
  107. if((!root.value("command_type").isUndefined())&&(!root.value("command_type").isNull())){
  108. commandType=root.value("command_type").toString().toInt();
  109. }
  110. QString Data = QString("[ %1 +++++++++++++++++++++++++ %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(commandType);
  111. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  112. if((!root.value("ACTION").isUndefined())&&(!root.value("ACTION").isNull())){
  113. if(root.value("ACTION").toString().compare("LOGIN")==0){
  114. if((!root.value("LOGINNAME").isUndefined())&&(!root.value("LOGINNAME").isNull())
  115. &&(!root.value("PASSWORD").isUndefined())&&(!root.value("PASSWORD").isNull())){
  116. QString LoginName = root.value("LOGINNAME").toString().trimmed();
  117. QString Password = getPassword(getPassword(root.value("PASSWORD").toString().trimmed()));
  118. for(uint i=0;i<webData->UsersCount;i++){
  119. if((QString::compare(LoginName,QString(webData->users[i].LoginName))==0)
  120. &&(QString::compare(Password,QString(webData->users[i].Password))==0)){
  121. client->LoginFlag=true;
  122. client->m_client->sendTextMessage(QString("{\"ACTION\":\"LOGIN\",\"RESULT\":\"1\",\"URL\":\"option.html\"}"));
  123. }
  124. }
  125. }
  126. }
  127. }else if((!root.value("RESET").isUndefined())&&(!root.value("RESET").isNull())){
  128. emit resetRequest(root.value("DEVICEID").toString().trimmed(),2,0,pseq);
  129. pseq++;
  130. }else if((!root.value("QUERYPARAMETERS").isUndefined())&&(!root.value("QUERYPARAMETERS").isNull())){
  131. emit resetRequest(root.value("DEVICEID").toString().trimmed(),11,root.value("QUERYPARAMETERSSELECT").toString().toInt(),pseq);
  132. pseq++;
  133. }else if((!root.value("start_point").isUndefined())&&(!root.value("start_point").isNull())){
  134. 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());
  135. pseq++;
  136. }else if((!root.value("economize_gear").isUndefined())&&(!root.value("economize_gear").isNull())){
  137. QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
  138. .arg(root.value("operation_type").toString().toInt());
  139. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  140. 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());
  141. pseq++;
  142. }else if((!root.value("time_data").isUndefined())&&(!root.value("time_data").isNull())){
  143. QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
  144. .arg(root.value("time_data").toString().trimmed());
  145. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  146. QString tmp = root.value("time_data").toString();
  147. emit requestSetParameters(root.value("terminal_code").toString().trimmed(),4,root.value("operation_type").toString().toInt(),tmp);
  148. pseq++;
  149. }else if(commandType==14){
  150. QString Data = QString("[ %1 =============== %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(14);
  151. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  152. 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);
  153. pseq++;
  154. }
  155. }else{
  156. if((!root.value("command_type").isUndefined())&&(!root.value("command_type").isNull())){
  157. commandType=root.value("command_type").toString().toInt();
  158. }
  159. QString Data = QString("[ %1 +++++++++++++++++++++++++ %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(commandType);
  160. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  161. if((!root.value("ACTION").isUndefined())&&(!root.value("ACTION").isNull())){
  162. if(root.value("ACTION").toString().compare("DBGSET")==0){
  163. if((!root.value("DEVICEID").isUndefined())&&(!root.value("DEVICEID").isNull())
  164. &&(!root.value("COMMDBG").isUndefined())&&(!root.value("COMMDBG").isNull())
  165. &&(!root.value("COMMDIR").isUndefined())&&(!root.value("COMMDIR").isNull())
  166. &&(!root.value("SQLDBG").isUndefined())&&(!root.value("SQLDBG").isNull())
  167. &&(!root.value("ERRDBG").isUndefined())&&(!root.value("ERRDBG").isNull())){
  168. client->DeviceId = root.value("DEVICEID").toString().trimmed();
  169. switch(root.value("COMMDBG").toString().toInt()){
  170. case 0:
  171. client->NeedComm = 0;
  172. break;
  173. case 1:
  174. client->NeedComm = 1;
  175. break;
  176. default:
  177. client->NeedComm = 0;
  178. break;
  179. }
  180. switch (root.value("COMMDIR").toString().toInt()) {
  181. case 0:
  182. client->Dir = 0;
  183. break;
  184. case 1:
  185. client->Dir = 1;
  186. break;
  187. case 2:
  188. client->Dir = 2;
  189. break;
  190. case 3:
  191. client->Dir = 3;
  192. break;
  193. default:
  194. client->Dir = 0;
  195. break;
  196. }
  197. switch (root.value("SQLDBG").toString().toInt()) {
  198. case 0:
  199. client->NeedSQL = 0;
  200. break;
  201. case 1:
  202. client->NeedSQL = 1;
  203. break;
  204. default:
  205. client->NeedSQL = 0;
  206. break;
  207. }
  208. switch (root.value("ERRDBG").toString().toInt()) {
  209. case 0:
  210. client->NeedErr = 0;
  211. break;
  212. case 1:
  213. client->NeedErr = 1;
  214. break;
  215. default:
  216. client->NeedErr = 0;
  217. break;
  218. }
  219. client->m_client->sendTextMessage(QString("{\"ACTION\":\"DBGSET\",\"RESULT\":\"1\",\"QUERY\":%1,\"NeedComm\":%2,\"COMMDIR\":%3,\"NeedSQL\":%4,\"NeedErr\":%5,\"DeviceId\":\"%6\"}")
  220. .arg(message).arg(client->NeedComm).arg(client->Dir).arg(client->NeedSQL).arg(client->NeedErr).arg(client->DeviceId));
  221. }else{
  222. client->m_client->sendTextMessage(QString("{\"ACTION\":\"DBGSET\",\"RESULT\":\"1\",\"QUERY\":%1,\"NeedComm\":%2,\"COMMDIR\":%3,\"NeedSQL\":%4,\"NeedErr\":%5,\"DeviceId\":\"%6\"}")
  223. .arg(message).arg(client->NeedComm).arg(client->Dir).arg(client->NeedSQL).arg(client->NeedErr).arg(client->DeviceId));
  224. }
  225. }
  226. }else if((!root.value("RESET").isUndefined())&&(!root.value("RESET").isNull())){
  227. emit resetRequest(root.value("DEVICEID").toString().trimmed(),2,"f0",pseq);
  228. pseq++;
  229. }else if((!root.value("QUERYPARAMETERS").isUndefined())&&(!root.value("QUERYPARAMETERS").isNull())){
  230. emit resetRequest(root.value("DEVICEID").toString().trimmed(),11,root.value("QUERYPARAMETERSSELECT").toString().trimmed(),pseq);
  231. pseq++;
  232. }else if((!root.value("start_point").isUndefined())&&(!root.value("start_point").isNull())){
  233. // emit resetRequest(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().trimmed());
  234. 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());
  235. pseq++;
  236. }else if((!root.value("economize_gear").isUndefined())&&(!root.value("economize_gear").isNull())){
  237. QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
  238. .arg(root.value("operation_type").toString().toInt());
  239. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  240. 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());
  241. pseq++;
  242. }else if((!root.value("time_data").isUndefined())&&(!root.value("time_data").isNull())){
  243. QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt())
  244. .arg(root.value("time_data").toString().trimmed());
  245. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  246. QString tmp = root.value("time_data").toString();
  247. emit requestSetParameters(root.value("terminal_code").toString().trimmed(),4,root.value("operation_type").toString().toInt(),tmp);
  248. pseq++;
  249. }else if(commandType==14){
  250. QString Data = QString("[ %1 =============== %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(14);
  251. emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data);
  252. 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);
  253. pseq++;
  254. }
  255. }
  256. }
  257. break;
  258. }
  259. }
  260. }
  261. void WssServer::start()
  262. {
  263. if(m_pWebSocketServer->listen(QHostAddress::Any, WssPort)){
  264. timer->start(5000);
  265. }else{
  266. printf("EchoServer listening failed\n");
  267. exit(1);
  268. }
  269. }
  270. void WssServer::socketDisconnected()
  271. {
  272. QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
  273. if(pClient){
  274. QList<WssClient *>::iterator i;
  275. for(i=clientList.begin();i!=clientList.end();i++){
  276. WssClient *client = *i;
  277. if(client->m_client==pClient){
  278. clientList.removeAll(client);
  279. pClient->deleteLater();
  280. return;
  281. }
  282. }
  283. }
  284. }
  285. void WssServer::onSslErrors(const QList<QSslError> &)
  286. {
  287. printf("Ssl errors occurred\n");
  288. }
  289. void WssServer::timeout()
  290. {
  291. count++;
  292. if(count>5){
  293. QList<WssClient *>::iterator i;
  294. for(i=clientList.begin();i!=clientList.end();i++){
  295. WssClient *client = *i;
  296. if(client->m_client){
  297. client->m_client->sendTextMessage(QString("{\"time\":\"%1\"}").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")));
  298. }
  299. }
  300. count=0;
  301. }
  302. }