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

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui лет назад: 2
Родитель
Сommit
67dfdfb6e8
7 измененных файлов с 203 добавлено и 36 удалено
  1. 9 9
      pro/mongoose/mongoose.c
  2. 6 4
      pro/src/app.c
  3. 37 8
      pro/src/appweb_handle.c
  4. 2 2
      pro/src/cascade.c
  5. 140 11
      pro/src/json_handle.c
  6. 4 1
      pro/src/json_handle.h
  7. 5 1
      pro/src/websocket_handle.c

+ 9 - 9
pro/mongoose/mongoose.c

@@ -6984,7 +6984,7 @@ static void read_conn(struct mg_connection *c) {
 
 static void write_conn(struct mg_connection *c) {
     #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_lock(&WSlock); 
+  //pthread_mutex_lock(&WSlock); 
   #endif
   char *buf = (char *) c->send.buf;
   size_t len = c->send.len;
@@ -6994,13 +6994,13 @@ static void write_conn(struct mg_connection *c) {
             (long) c->recv.size, n, MG_SOCK_ERR(n)));
   iolog(c, buf, n, false);
     #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_unlock(&WSlock); 
+  //pthread_mutex_unlock(&WSlock); 
   #endif
 }
 
 static void close_conn(struct mg_connection *c) {
   #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_lock(&WSlock); 
+  //pthread_mutex_lock(&WSlock); 
   #endif
 
   if (FD(c) != MG_INVALID_SOCKET) {
@@ -7015,7 +7015,7 @@ static void close_conn(struct mg_connection *c) {
   mg_close_conn(c);
   
     #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_unlock(&WSlock); 
+  //pthread_mutex_unlock(&WSlock); 
     #endif
 }
 
@@ -7099,7 +7099,7 @@ static MG_SOCKET_TYPE raccept(MG_SOCKET_TYPE sock, union usa *usa,
 static void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) {
 
     #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_lock(&WSlock); 
+  //pthread_mutex_lock(&WSlock); 
   #endif
   struct mg_connection *c = NULL;
   union usa usa;
@@ -7142,7 +7142,7 @@ static void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) {
     mg_call(c, MG_EV_ACCEPT, NULL);
   }
     #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_unlock(&WSlock); 
+  //pthread_mutex_unlock(&WSlock); 
   #endif
 }
 
@@ -13730,12 +13730,12 @@ static void mg_ws_mask(struct mg_connection *c, size_t len) {
 size_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,
                   int op) {
   #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_lock(&WSlock); 
+//  pthread_mutex_lock(&WSlock); 
   #endif
   if (c==NULL || c->send.buf== NULL)
   {
       #if MG_ARCH == MG_ARCH_UNIX
-      pthread_mutex_unlock(&WSlock); 
+   //   pthread_mutex_unlock(&WSlock); 
       #endif
     return 0;
   }
@@ -13748,7 +13748,7 @@ size_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,
   mg_ws_mask(c, len);
 
   #if MG_ARCH == MG_ARCH_UNIX
-  pthread_mutex_unlock(&WSlock); 
+ // pthread_mutex_unlock(&WSlock); 
   #endif
   return header_len + len;
 }

+ 6 - 4
pro/src/app.c

@@ -853,6 +853,8 @@ void* sensor_thread(void* arg)
                 _globalSensorInfo.val2 = humidity;
                 _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+                _globalDeviceManager->g_modebus_read.temprature=temperature;
+                _globalDeviceManager->g_modebus_read.humidity=humidity;
             }
             break;
             case SENSOR_TYPE_SMOKE: // 烟雾
@@ -956,8 +958,8 @@ void* shm_thread(void *arg)
                         _globalDeviceManager->g_shm_Data->fF = _globalDeviceManager->_globalPowerManger._PowerInfo.factor;
                         _globalDeviceManager->g_shm_Data->fS = _globalDeviceManager->_globalPowerManger._PowerInfo.consumption;
                         _globalDeviceManager->g_shm_Data->nStatus = _globalDeviceManager->_globalPowerManger._PowerInfo.status;
-                        _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature / 1000.0;
-                        _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity / 1000.0;
+                        _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature;
+                        _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity;
                     }
                     else
                     {
@@ -978,8 +980,8 @@ void* shm_thread(void *arg)
                         _globalDeviceManager->g_shm_Data->fF = _globalPowerMangerTemp->_PowerInfo.factor;
                         _globalDeviceManager->g_shm_Data->fS = _globalPowerMangerTemp->_PowerInfo.consumption;
                         _globalDeviceManager->g_shm_Data->nStatus = _globalPowerMangerTemp->_PowerInfo.status;
-                        _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature / 1000.0;
-                        _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity / 1000.0;
+                        _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature;
+                        _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity;
                     }
                 }
                 else if (_globalDeviceManager->g_shm_Data->bPDUSet == 0)

+ 37 - 8
pro/src/appweb_handle.c

@@ -241,7 +241,7 @@ void* update_thread(void* arg)
         {
            // pthread_mutex_lock(&Websocketlock); 
             //推送总体信息
-            if(gdm->view_page==1)
+            //if(gdm->view_page==1)
             { 
                 if(gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree ||
                     gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One)
@@ -287,7 +287,7 @@ void* update_thread(void* arg)
                 }                
             }
             //推送通道信息
-            else if(gdm->view_page==2)
+            //else if(gdm->view_page==2)
             {
                 _OverChnPwrAckInfo _over_chn_pwr_back_info;
                 INIT_LIST_HEAD(&_over_chn_pwr_back_info.list);
@@ -316,12 +316,20 @@ void* update_thread(void* arg)
                     free(node);
                 } 
             }
+            //else if (gdm->view_page==3)
+            {
+
+                upgrade_msg =ws_sensor_status_ack_to_json(&__globalDeviceManage._globalSensorManger);
+                websocket_send(upgrade_msg, strlen(upgrade_msg));
+                cJSON_free((void*)upgrade_msg);
+            }            
             //usleep(400*1000);
            // pthread_mutex_unlock(&Websocketlock); 
             //log_i("ws upload.");
         }
         usleep(1000*1000);
     }
+    
     pthread_exit(NULL);
 }
 
@@ -1588,7 +1596,7 @@ static void sensorStatusMonitoring(void* conn)
             list_add_tail(&_overSensorBackInfoTemp->list,&_over_all_sensor_back_info.list);
         }    
         //参数转换json
-        ack_str = over_all_sensor_info_to_json(&_over_all_sensor_back_info);
+        ack_str = over_all_sensor_info_to_json(&_over_all_sensor_back_info,0);
 
         //释放资源
         _OverSensorBackInfo* node;
@@ -1604,7 +1612,15 @@ static void sensorStatusMonitoring(void* conn)
     else if(strcmp(_over_all_sensor_request.type,"delete")==0)
     {
         log_d("start delete handle.");
-        int sensor_id_temp = _over_all_sensor_request.sensorId;
+        int sensor_id_temp = 0 ;
+        if(_over_all_sensor_request.sensorId!=NULL)
+        {
+            sensor_id_temp = strtol(_over_all_sensor_request.sensorId,NULL,10);
+        }    
+        else
+        {
+            sensor_id_temp = 0 ;
+        }
 
         if(dev_delete_sensor_manage(__globalDeviceManage.db, 1,sensor_id_temp)!=0)
         {
@@ -1630,8 +1646,14 @@ static void sensorStatusMonitoring(void* conn)
     {
         log_d("start update handle.");
         int sensor_id_temp = 0 ;
-        sensor_id_temp = _over_all_sensor_request.sensorId;
-
+        if(_over_all_sensor_request.sensorId!=NULL)
+        {
+            sensor_id_temp = _over_all_sensor_request.sensorId;
+        }
+        else
+        {
+            sensor_id_temp = 0;
+        }
         GlobalSensorManger *node = NULL;
         GlobalSensorManger *next = NULL;
         list_for_each_entry_safe(node, next, &__globalDeviceManage._globalSensorManger.list, list)
@@ -1750,8 +1772,14 @@ static void sensorStatusMonitoring(void* conn)
         memset(_globalSensorMangerTemp, 0, sizeof(GlobalSensorManger));
         //填充数据
         _globalSensorMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id ;
-         _globalSensorMangerTemp->sensor_id = _over_all_sensor_request.sensorId;
-        
+        if(_over_all_sensor_request.sensorId!=NULL)
+        {
+            _globalSensorMangerTemp->sensor_id = strtol(_over_all_sensor_request.sensorId,NULL,10);
+        }    
+        else
+        {
+             _globalSensorMangerTemp->sensor_id = 0 ;
+        }
         _globalSensorMangerTemp->sensor_type = strtol(_over_all_sensor_request.sensorType,NULL,10);
         strcpy( _globalSensorMangerTemp->sensor_name,_over_all_sensor_request.sensorName);
         strcpy(_globalSensorMangerTemp->sensor_port_name,_over_all_sensor_request.comSlogan);
@@ -2792,6 +2820,7 @@ static void serviceManagement(void *conn)
                     log_e("___ new_data calloc failed!\n");
                     break;
                 }
+				memset(new_data, 0, sizeof(new_data));
                 strcpy(new_data->ds_date, current_date);
                 strcpy(new_data->ds_time, _serviceManageRequestInfo._ds_info.channelTime);
                 new_data->set_stats = atoi(_serviceManageRequestInfo._ds_info.setStatus);

+ 2 - 2
pro/src/cascade.c

@@ -31,7 +31,7 @@
 
 
 
-int cur_dev_addr=1;
+int cur_dev_addr=0;
 static cascade_handle_t casHandle={.inited=0};
 static void* cmd_thread(void *arg);
 
@@ -653,7 +653,7 @@ static int power_add(cascade_handle_t *cas)
 
     LOGD("____ master add channel to the list, cnt: %d\n", info->cnt);
     cascade_lock();
-
+    dm2->_global_device_info->product_id=cur_dev_addr;
     power_clear(cas);
 
     for(i=0; i<info->cnt; i++) {

+ 140 - 11
pro/src/json_handle.c

@@ -2120,7 +2120,7 @@ cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequ
 /// @brief 返回传感器信息
 /// @param _over_all_pwr_back_info 
 /// @return 
-char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info)
+char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info,int nWSType)
 {
     char* str = NULL;
     struct list_head *pos;
@@ -2129,9 +2129,21 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     // 添加基本键值对
-    cJSON_AddNumberToObject(root, "code", 200); 
-    //创建数据
-    cJSON* data_root_array = cJSON_CreateArray();
+
+
+        // 添加基本键值对  
+    cJSON* sdata_filed = cJSON_CreateObject();
+    // 创建数据
+    cJSON *data_root_array = cJSON_CreateArray();
+    if (nWSType)
+    {
+        cJSON_AddNumberToObject(sdata_filed, "code", 200);
+    }
+    else
+    {
+        cJSON_AddNumberToObject(root, "code", 200);
+    }
+
     //循环添加数据
     list_for_each_entry(_temp, &_over_all_sensor_back_info->list, list)
     {
@@ -2196,16 +2208,125 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
         cJSON_AddNumberToObject(data_filed, "waterImmersionState",_temp->waterImmersionState);
         cJSON_AddItemToObject(data_root_array, "data", data_filed);
 	}
-    //添加汇总
-    cJSON_AddItemToObject(root, "data", data_root_array);
-    //添加结果
-    cJSON_AddStringToObject(root, "msg", "操作成功");
+
+    if (nWSType)
+    {
+        // 添加汇总
+        cJSON_AddItemToObject(sdata_filed, "data", data_root_array);
+        // 添加结果
+        cJSON_AddStringToObject(sdata_filed, "msg", "操作成功");
+        cJSON_AddItemToObject(root, "data", sdata_filed);
+        // 添加内容
+        cJSON_AddStringToObject(root, "message", "操作成功");
+        cJSON_AddStringToObject(root, "socketIdx", "PDU-WebSocket");
+        cJSON_AddBoolToObject(root, "success", true);
+        cJSON_AddStringToObject(root, "type", "sensorStatusMonitoring");
+    }else
+    {
+        cJSON_AddItemToObject(root, "data", data_root_array);
+        // 添加内容
+        cJSON_AddStringToObject(root, "message", "操作成功");
+    }
     //转换
     str = cJSON_Print(root);    
     //释放资源
     cJSON_Delete(root);
     return str;
 }
+/**
+ * @brief 将传感器状态应答转换为 JSON 字符串
+ *
+ * 将给定的传感器状态应答结构体转换为 JSON 格式的字符串。
+ *
+ * @param _over_all_sensor_back_info 传感器状态应答结构体指针
+ *
+ * @return 转换后的 JSON 字符串,若转换失败则返回 nullptr
+ */
+char *ws_sensor_status_ack_to_json(GlobalSensorManger *_globalSensorManger)
+{
+    _OverSensorBackInfo _over_all_sensor_back_info;
+    INIT_LIST_HEAD(&_over_all_sensor_back_info.list);
+    // 获取传感器当前的最新值
+    GlobalSensorInfo _globalSensorInfo;
+    GlobalSensorManger *_globalSensorManagerTemp = NULL;
+    list_for_each_entry(_globalSensorManagerTemp, &_globalSensorManger->list, list)
+    {
+        _OverSensorBackInfo *_overSensorBackInfoTemp = (_OverSensorBackInfo *)malloc(sizeof(_OverSensorBackInfo));
+        if (_overSensorBackInfoTemp == NULL)
+            log_e("_OverSensorBackInfo malloc error.");
+        memset(_overSensorBackInfoTemp, 0, sizeof(_OverSensorBackInfo));
+        // 基本信息
+        _overSensorBackInfoTemp->sensorId = _globalSensorManagerTemp->sensor_id;
+        memcpy(&_overSensorBackInfoTemp->sensorName, &_globalSensorManagerTemp->sensor_name, sizeof(_overSensorBackInfoTemp->sensorName));
+        // strcpy(_overSensorBackInfoTemp->sensorName,_globalSensorManagerTemp->sensor_name);
+        _overSensorBackInfoTemp->sensorType = _globalSensorManagerTemp->sensor_type;
+        memcpy(&_overSensorBackInfoTemp->comSlogan, &_globalSensorManagerTemp->sensor_port_name, sizeof(_overSensorBackInfoTemp->comSlogan));
+        // strcpy(_overSensorBackInfoTemp->comSlogan,_globalSensorManagerTemp->sensor_port_name);
+
+        // 485独有
+        _overSensorBackInfoTemp->connectionStatus = _globalSensorManagerTemp->sensor_status;
+        _overSensorBackInfoTemp->nodeNumber = __globalDeviceManage._globalSensorManger.sensor_node_number;
+        if (_globalSensorManagerTemp->sensor_interface_type == 1)
+        {
+            _overSensorBackInfoTemp->sensorAddr = _globalSensorManagerTemp->sensor_addr;
+            _overSensorBackInfoTemp->sensorBaud = _globalSensorManagerTemp->sensor_baud;
+            strcpy(_overSensorBackInfoTemp->sensorvaluech, "RS485");
+        }
+        else
+        {
+            _overSensorBackInfoTemp->connectionStatus = -1;
+            strcpy(_overSensorBackInfoTemp->sensorvaluech, "IN");
+            _overSensorBackInfoTemp->nodeNumber = _globalSensorManagerTemp->sensor_addr;
+        }
+
+        // 拿数据
+        memset(&_globalSensorInfo, 0, sizeof(_globalSensorInfo));
+        switch (_globalSensorManagerTemp->sensor_type)
+        {
+        case 0: // 温湿度传感器 2个值
+        {
+            _overSensorBackInfoTemp->temperatureValue = _globalSensorManagerTemp->Cur_sensor_info.val1;
+            _overSensorBackInfoTemp->humidityValue = _globalSensorManagerTemp->Cur_sensor_info.val2;
+        }
+        break;
+        case 1: // 烟雾传感器 1个值
+        {
+
+            _overSensorBackInfoTemp->alarmStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+        }
+        break;
+        case 2: // 水浸传感器 1个值  c
+        {
+            _overSensorBackInfoTemp->waterImmersionState = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+        }
+        break;
+        case 3: // 门禁传感器
+        {
+            _overSensorBackInfoTemp->accessControlStatus = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
+        }
+        break;
+        case 4: // 气体传感器 1个值
+        {
+            _overSensorBackInfoTemp->gasConcentration = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气体浓度
+        }
+        break;
+        case 5: // 气压气流传感器 2个值
+        {
+            _overSensorBackInfoTemp->airPressureValue = _globalSensorManagerTemp->Cur_sensor_info.val1; // 气压
+            _overSensorBackInfoTemp->airflowValue = _globalSensorManagerTemp->Cur_sensor_info.val2;     // 气流
+        };
+        break;
+        case 6: // 空调遥控器 没有值
+        {
+        }
+        break;
+        }
+        // 入队
+        list_add_tail(&_overSensorBackInfoTemp->list, &_over_all_sensor_back_info.list);
+    }
+    // 转换
+    return over_all_sensor_info_to_json(&_over_all_sensor_back_info,1);
+}
 
 /// @brief 返回传感器历史信息
 /// @param _over_all_pwr_back_info 
@@ -2660,7 +2781,15 @@ char* ws_over_status_ack_to_json(int type,_OverAllPwrAckInfo* _over_all_pwr_back
     cJSON_AddNumberToObject(sdata_filed, "code", 200); 
     cJSON* sub_data_root_array = cJSON_CreateArray();
     cJSON* data_filed = cJSON_CreateObject();
-    cJSON_AddStringToObject(data_filed,"productName",_over_all_pwr_back_info->product_name);
+    if (_over_all_pwr_back_info->product_id == 0)
+    {
+        sprintf(temp, "%s", _over_all_pwr_back_info->product_name);
+    }
+    else
+    {
+        sprintf(temp, "%s %d", _over_all_pwr_back_info->product_name, _over_all_pwr_back_info->product_id);
+    }
+    cJSON_AddStringToObject(data_filed,"productName",temp);
     cJSON_AddStringToObject(data_filed,"productNumber",_over_all_pwr_back_info->product_number);
     sprintf(temp,"%d",_over_all_pwr_back_info->product_id);
     cJSON_AddStringToObject(data_filed,"productId",temp);
@@ -2693,7 +2822,7 @@ char* ws_over_status_ack_to_json(int type,_OverAllPwrAckInfo* _over_all_pwr_back
     //添加汇总
     cJSON_AddItemToObject(root, "data", sdata_filed);
     //添加内容
-    cJSON_AddStringToObject(root, "msg", "操作成功");
+    cJSON_AddStringToObject(root, "message", "操作成功");
     cJSON_AddStringToObject(root, "socketIdx", "PDU-WebSocket");
     cJSON_AddBoolToObject(root, "success",true);
     switch (type)
@@ -2789,7 +2918,7 @@ char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_
     //添加汇总
     cJSON_AddItemToObject(root, "data", sdata_filed);
     //添加内容
-    cJSON_AddStringToObject(root, "msg", "操作成功");
+    cJSON_AddStringToObject(root, "message", "操作成功");
     cJSON_AddStringToObject(root, "socketIdx", "PDU-WebSocket");
     cJSON_AddBoolToObject(root, "success",true);
     switch (type)

+ 4 - 1
pro/src/json_handle.h

@@ -495,7 +495,10 @@ cJSON* json_to_chn_pwr_status_monitor(const char* str,_OverChnPwrRequest* _over_
 char* over_chn_pwr_monitor_to_json(_OverChnPwrAckInfo* _over_chn_pwr_back_info);
 
 int json_to_overall_sensor_status(const char* str,_OverSensorRequest* _over_all_sensor_request);
-char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info);
+
+char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info,int nWSType);
+char* ws_sensor_status_ack_to_json(GlobalSensorManger* _globalSensorManger);
+
 char* over_sensor_history_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_info, int sensor_type);
 
 char* alarm_info_to_json(_AlarmAckInfo* _alarm_ack_info,int nAllNumber);

+ 5 - 1
pro/src/websocket_handle.c

@@ -103,7 +103,10 @@ void* websocket_thread(void* arg)
     wh->inited = 1;
 
     while(h->quit==0) {
+          pthread_mutex_lock(&WSlock); 
 	        mg_mgr_poll(&wh->mgr, 1000);                    // Infinite event loop
+          pthread_mutex_unlock(&WSlock); 
+          usleep(100000);
     }
     wh->inited = 0;
     mg_mgr_free(&wh->mgr);
@@ -132,8 +135,9 @@ int websocket_send(void *data, int len)
     if(!wh->inited) {
         return -1;
     }
-
+    pthread_mutex_lock(&WSlock);
     mg_ws_send(wh->c, data, len, WEBSOCKET_OP_TEXT);
+    pthread_mutex_unlock(&WSlock);
     return 0;
 }