Просмотр исходного кода

增加敏控水表推送龙湖平台逻辑

james 2 недель назад
Родитель
Сommit
0c7ff41893

+ 1 - 0
DataProcessService/ytWarterMkProcess/MkShm.h

@@ -5,6 +5,7 @@
 #define SSSHM_PORT    10019
 
 typedef struct {
+    int id;
     char Device_Code[40];
     char Device_Name[200];
     char Device_Info[500];

+ 7 - 6
DataProcessService/ytWarterMkProcess/databasethread.cpp

@@ -70,7 +70,7 @@ void DatabaseThread::check_devicelist()
     printf("database thread check_devicelist()\n");
     uint nowTime = QDateTime::currentDateTime().toTime_t();
     hour=QTime::currentTime().hour();
-    QString sql = QString("select owner_code, owner_name, unitinfo, owner_xh, company, dwtype from sp_owner where dwtype in (2,4,5,128) and owner_xh !=''");
+    QString sql = QString("select id, owner_code, owner_name, unitinfo, owner_xh, company, dwtype from sp_owner where dwtype in (2,4,5,128) and owner_xh !=''");
     QSqlQuery qry = db.exec(sql);
     int nrow= 0;
     while(qry.next()){
@@ -93,11 +93,12 @@ void DatabaseThread::check_devicelist()
             if(qry2.value(0).toUInt()==0)
                 mkList->sensors[nrow].LastCommtime = nowTime;
         }
-        sprintf(mkList->sensors[nrow].Device_Code,"%s",qry.value(0).toString().toUtf8().data());
-        sprintf(mkList->sensors[nrow].Device_Name,"%s",qry.value(1).toString().toUtf8().data());
-        sprintf(mkList->sensors[nrow].Device_Info,"%s",qry.value(2).toString().toUtf8().data());
-        sprintf(mkList->sensors[nrow].Device_Type,"%s",qry.value(5).toString().toUtf8().data());
-        sprintf(mkList->sensors[nrow].Company_Code,"%s",qry.value(4).toString().toUtf8().data());
+        mkList->sensors[nrow].id = qry.value(0).toInt();
+        sprintf(mkList->sensors[nrow].Device_Code,"%s",qry.value(1).toString().toUtf8().data());
+        sprintf(mkList->sensors[nrow].Device_Name,"%s",qry.value(2).toString().toUtf8().data());
+        sprintf(mkList->sensors[nrow].Device_Info,"%s",qry.value(3).toString().toUtf8().data());
+        sprintf(mkList->sensors[nrow].Device_Type,"%s",qry.value(6).toString().toUtf8().data());
+        sprintf(mkList->sensors[nrow].Company_Code,"%s",qry.value(5).toString().toUtf8().data());
         printf("Device_Code:%s\n",QString(mkList->sensors[nrow].Device_Code).toUtf8().data());
         printf("Device_Code:%s\n",QString(mkList->sensors[nrow].Company_Code).toUtf8().data());
         nrow++;

+ 1 - 0
DataProcessService/ytWarterMkProcess/main.cpp

@@ -32,6 +32,7 @@ bool shm_load(){
         return false;
     if((shmid=shmget(key,sizeof(MksensorList),IPC_CREAT|0666))==-1)
         return false;
+    printf("MK shmid %d\n",shmid);
     mkList = static_cast<MksensorList *>(shmat(shmid,nullptr,0));
     return true;
 }

+ 146 - 0
DataProcessService/ytWarterMkProcess/mkcore.cpp

@@ -5,6 +5,20 @@
 #include "../DataPrecessDog/dataprecess.h"
 #include "waterMk01.h"
 
+// 1. 提取硬编码魔法值为常量,便于统一修改和维护
+const QString MQTT_ID = "a71c40bb-5b02-4741-881b-24449f699db9";
+const QString ACTION_TYPE = "transpush";
+const QString PROVIDER = "Usky";
+const QString DEVICE_TYPE = "xiaofangshuiya";
+const QString DATA_TYPE = "deviceInfo";
+const QString SOFT_VERSION = "1.00.00";
+const QString HARD_VERSION = "0.1";
+const QString SENSOR_DESC = "";
+const QString SENSOR_UNIT = "MPa";
+const double LOW_THRESHOLD = 0.07;
+const double HIGH_THRESHOLD = 1.2;
+const QString API_URL = "http://47.98.201.73:55126";
+
 #define comm_debug
 #define UN_REFERENCED_PARAMETER(x) {(x) = (x);}
 
@@ -34,15 +48,19 @@ MKCore::MKCore(QObject *parent) :
         connect(repThread[i],&ttsThreads::ttslog,this,&MKCore::repLog);
         wssThread[i] = new ttsThreads(this,i,"47.98.201.73","/report",55125);
         connect(wssThread[i],&ttsThreads::ttslog,this,&MKCore::repLog);
+        lhThread[i] = new ttsThreads(this,i,"47.98.201.73","/report",55126);
+        connect(lhThread[i],&ttsThreads::ttslog,this,&MKCore::repLog);
         wxThreads[3][i]->start();
         wxThreads[2][i]->start();
         wxThreads[1][i]->start();
         wxThreads[0][i]->start();
         wssThread[i]->start();
         repThread[i]->start();
+        lhThread[i]->start();
     }
     wxcur = 0;
     repcur = 0;
+    lhcur = 0;
     DevIdx3 = -1;
     mkwaterserver = new Mkwaterserver(this);
     connect(mkwaterserver,&Mkwaterserver::getCommData,this,&MKCore::getCommData);
@@ -167,6 +185,134 @@ void MKCore::getValue(QString deviceidx, QString d1, int d2, int d3, double d4,
     dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data=%1, data_time='%2' where device_id='%3' and point_code=2").arg(d2).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(deviceidx),1);
     dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data=%1, data_time='%2' where device_id='%3' and point_code=3").arg(d3).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(deviceidx),1);
     dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data=%1, data_time='%2' where device_id='%3' and point_code=4").arg(d4).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(deviceidx),1);
+
+    QStringList strArray = {"SHYT25100007","SHYT25100006","SHYT25100009","SHYT25100004","SHYT25100005","SHYT25100008","SHYT25100001","SHYT25100002","SHYT25100003"};
+    if(strArray.contains(deviceidx)){
+        QJsonObject jqhsdata;
+        QJsonObject jqhsRTU;
+        jqhsRTU.insert("provider", "Usky");
+        jqhsRTU.insert("deviceType", "xiaofangshuiya");
+        jqhsRTU.insert("dataType", "deviceInfo");
+        jqhsRTU.insert("softVersion", "1.00.00");
+        jqhsRTU.insert("hardVersion", "0.1");
+        QJsonArray jajsonArray;
+        QJsonObject jaobjRTU;
+        for(int i=0;i<10240;i++){
+            if(QString::compare(QString(mkList->sensors[i].Device_Code),deviceidx)==0){
+                jaobjRTU.insert("sensorId", mkList->sensors[i].id);
+                break;
+            }
+        }
+
+        jaobjRTU.insert("desc", "");
+        jaobjRTU.insert("status", 0);
+        jaobjRTU.insert("pointValue", round(d4 * 10000) / 10000.0);
+        jaobjRTU.insert("unit", "MPa");
+        jaobjRTU.insert("lowThreshold", 0.07);
+        jaobjRTU.insert("highThreshold", 1.2);
+        jaobjRTU.insert("sendTime", QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
+        jajsonArray.append(jaobjRTU);
+        jqhsRTU.insert("sensorList", jajsonArray);
+
+        QString rep = QString("{\"mqttId\":\"a71c40bb-5b02-4741-881b-24449f699db9\",\"action\":\"transpush\",\"data\": %1}").arg(QString(QJsonDocument(jqhsRTU).toJson()));
+        lhThread[lhcur]->appendData(rep);
+        printf("lh rep:%s\n",rep.toUtf8().data());
+        lhcur++;
+        lhcur &= 0x0f;
+
+
+
+
+//        QJsonObject mainJson;  // 优化命名:jqhsdata -> mainJson(见名知义)
+//        QJsonObject rtuJson;   // 优化命名:jqhsRTU -> rtuJson
+
+//        // 构建RTU基础信息(保留原始赋值逻辑)
+//        rtuJson.insert("provider", PROVIDER);
+//        rtuJson.insert("deviceType", DEVICE_TYPE);
+//        rtuJson.insert("dataType", DATA_TYPE);
+//        rtuJson.insert("softVersion", SOFT_VERSION);
+//        rtuJson.insert("hardVersion", HARD_VERSION);
+
+//        // 构建主JSON基础信息
+//        mainJson.insert("mqttId", MQTT_ID);
+//        mainJson.insert("action", ACTION_TYPE);
+
+//        QJsonArray sensorArray;  // 优化命名:jajsonArray -> sensorArray
+//        QJsonObject sensorJson;  // 优化命名:jaobjRTU -> sensorJson
+
+//        // 2. 修复数组越界风险:用传感器实际数量替代固定10240
+//        // 若 mkList->sensors 是 QList 类型:
+//        for(int i=0;i<10240;i++){
+//            if(QString::compare(QString(mkList->sensors[i].Device_Code),deviceidx)==0){
+//                sensorJson.insert("sensorId", mkList->sensors[i].id);
+//                break;
+//            }
+//        }
+
+//        // 填充传感器数据(保留原始逻辑)
+//        sensorJson.insert("desc", SENSOR_DESC);
+//        sensorJson.insert("status", 0);
+//        sensorJson.insert("pointValue", d4);
+//        sensorJson.insert("unit", SENSOR_UNIT);
+//        sensorJson.insert("lowThreshold", LOW_THRESHOLD);
+//        sensorJson.insert("highThreshold", HIGH_THRESHOLD);
+//        sensorJson.insert("sendTime", QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
+
+//        // 组装传感器数组
+//        sensorArray.append(sensorJson);
+//        rtuJson.insert("sensorList", sensorArray);
+//        mainJson.insert("data", rtuJson);
+
+//        // 3. 修复JSON打印问题:通过QJsonDocument转换后输出
+//        QJsonDocument jsonDoc(mainJson);
+//        QString debugJsonStr = jsonDoc.toJson(QJsonDocument::Indented);  // 格式化输出,便于调试
+//        qDebug() << "待发送JSON数据:\n" << debugJsonStr;
+//        // 若坚持使用printf(需转换为C风格字符串)
+//        printf("jqhsdata  %s\n", debugJsonStr.toUtf8().constData());
+
+//        // 4. 修复JSON转QByteArray问题:正确转换为HTTP请求所需数据
+//        QByteArray requestData = debugJsonStr.toUtf8();  // 紧凑格式,减少传输体积
+
+//        // 5. 修复内存泄漏:使用栈上QNetworkRequest,无需动态分配
+//        QNetworkRequest request;
+//        QUrl apiUrl(API_URL);
+//        if (!apiUrl.isValid()) {  // 增加URL有效性检查,提升健壮性
+//            qCritical() << "接口URL无效:" << API_URL;
+//            return;
+//        }
+//        request.setUrl(apiUrl);
+//        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8");
+//        request.setRawHeader("User-Agent", "QtNetwork/5.15.2"); // 必填
+//        request.setRawHeader("Accept", "*/*");
+//        request.setRawHeader("Connection", "keep-alive");
+
+//        // 6. 发送POST请求,并处理响应和内存释放
+//        QNetworkReply *reply = netAccessManager->post(request, requestData);
+//        // 绑定finished信号,使用lambda表达式处理响应,自动释放reply内存
+//        QObject::connect(reply, &QNetworkReply::finished, [=]() {
+//            reply->deleteLater();  // 自动释放reply,避免内存泄漏
+
+//            // 处理请求结果
+//            if (reply->error() != QNetworkReply::NoError) {
+//                // 打印错误信息,便于问题排查
+//                qCritical() << "HTTP POST请求失败:" << reply->errorString() << "错误码:" << reply->error();
+//                return;
+//            }
+
+//            // 读取并打印成功响应
+//            QByteArray responseData = reply->readAll();
+//            qInfo() << "HTTP POST请求成功,响应数据:" << responseData;
+
+//            // 可选:解析响应JSON(增强功能性)
+//            QJsonParseError jsonError;
+//            QJsonDocument responseDoc = QJsonDocument::fromJson(responseData, &jsonError);
+//            if (jsonError.error != QJsonParseError::NoError) {
+//                qWarning() << "响应JSON解析失败:" << jsonError.errorString();
+//                return;
+//            }
+//            qDebug() << "解析后的响应JSON:\n" << responseDoc.toJson(QJsonDocument::Indented);
+//        });
+    }
 }
 
 void MKCore::getCoverValue(QString deviceidx, QString iotId, int repackage, int sensor_status, int manhole_cover_position_state, int lean_angle, double battery_voltage,int temperature,long etime,int serviceId)

+ 2 - 1
DataProcessService/ytWarterMkProcess/mkcore.h

@@ -71,13 +71,14 @@ private:
     QTcpServer *svr;
     LogThread *logThread;
     DatabaseThread *dbThread;
-    quint8 wxcur,repcur;
+    quint8 wxcur,repcur,lhcur;
     WechartThreads *wxThreads[4][16];
     QTimer *timer;
     int DevIdx3;
     QString DeviceID3;
     ttsThreads *wssThread[16];
     ttsThreads *repThread[16];
+    ttsThreads *lhThread[16];
     QMQTT::Client *m_client;
     quint16 mqttinfoIdx,mqttalarmIdx;
 };